1. 程式人生 > >spring-boot入門(四)與資料庫互動

spring-boot入門(四)與資料庫互動

package com.foo.configura;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import java.util.Properties;

/**
 * @author JasonLin
 * @version V1.0
 * @date 2017/12/1
 */
@Configuration
public class Conf {

    @Bean(name = "sessionFactory")
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.put("hibernate.show_sql", true);
        properties.put("hibernate.connection.release_mode", "after_transaction");
        properties.put("hibernate.cache.use_second_level_cache", false);
        properties.put("hibernate.cache.use_query_cache", false);
        sessionFactory.setHibernateProperties(properties);
        sessionFactory.setPackagesToScan("com.foo.model");
        return sessionFactory;
    }

    @Bean("transactionManager")
    HibernateTransactionManager getHibernateTransactionManager(@Qualifier("sessionFactory") SessionFactory sessionFactory){
        return new HibernateTransactionManager(sessionFactory);
    }

    @Bean("hibernateTemplate")
    HibernateTemplate getHibernateTemplate(@Qualifier("sessionFactory") SessionFactory sessionFactory) {
        HibernateTemplate hibernateTemplate = new HibernateTemplate();
        hibernateTemplate.setSessionFactory(sessionFactory);
        return hibernateTemplate;
    }
}
3. 業務程式碼
a.訂單實體和訂單項實體:
@Getter
@Setter
@Entity
@Table(name = "_order")
public class Order implements Serializable {

    private static final long serialVersionUID = 1854996605034612378L;

    @Id
    private String id;

    @Column(name = "total_list_price")
    private BigDecimal totalListPrice;

    @Column(name = "total_sale_price")
    private BigDecimal totalSalePrice;

    @Column(name = "purchase_quantity")
    private Integer purchaseQuantity;

    /**
     * 品種數量
     */
    @Column(name = "purchase_kinds")
    private Integer purchaseKinds;

    @Column
    //正常情況下儲存的是客戶ID
    private String customer;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "order", targetEntity = OrderItem.class)
    private Set<OrderItem> itemList;
}
@Getter
@Setter
@Entity
@Table(name = "order_item")
public class OrderItem implements Serializable{
    private static final long serialVersionUID = 8272679709545182358L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "_order")
    private Order order;

    /**
     * 商品ID
     */
    @Column(name = "product_sale")
    private Long productSale;

    /**
     * 購買數量
     */
    @Column(name = "purchase_quantity")
    private Integer purchaseQuantity;

    /**
     * 碼洋
     */
    @Column(name = "list_price")
    private BigDecimal listPrice;

    /**
     * 實洋
     */
    @Column(name = "sale_price")
    private BigDecimal salePrice;
}

b.service服務層:
@Service("orderService")
@Transactional(rollbackFor = Exception.class)
public class OrderServiceImpl implements OrderService {

    private static final Log LOG = LogFactory.getLog(OrderServiceImpl.class);

    @Autowired
    private OrderDao orderDao;

    @Override
    public void create(Order order) {
        checkOrder(order);
        initOrder(order);
        orderDao.save(order);
        LOG.info("create order successed,orderId:" + order.getId());
//        throw new RuntimeException("test exception");
    }

    private void checkOrder(Order order) {
        Preconditions.checkNotNull(order, "order is null.");
        Preconditions.checkArgument(!CollectionUtils.isEmpty(order.getItemList()), "OrderItem is empty.");
    }

    private void initOrder(Order order) {
        BigDecimal totalListPrice = BigDecimal.ZERO;
        BigDecimal totalSalePrice = BigDecimal.ZERO;
        Integer purchaseQuantity = 0;
        Integer purchaseKind = order.getItemList().size();
        for (OrderItem orderItem : order.getItemList()) {
            totalListPrice = totalListPrice.add(orderItem.getListPrice());
            totalSalePrice = totalSalePrice.add(orderItem.getSalePrice());
            purchaseQuantity += orderItem.getPurchaseQuantity();
        }
        order.setTotalListPrice(totalListPrice);
        order.setTotalSalePrice(totalSalePrice);
        order.setPurchaseKinds(purchaseKind);
        order.setPurchaseQuantity(purchaseQuantity);
    }
}
c. dao層:
@Repository("orderDao")
public class OrderDaoImpl implements OrderDao{

    @Autowired
    private HibernateTemplate hibernateTemplate;

    @Override
    public void save(Order order) {
        hibernateTemplate.save(order);
    }
}
4. 測試
在編寫測試類的時候會用到兩個註解:@RunWith,@SpringBootTest 。spring boot會自動載入啟動類進行測試。 測試類程式碼如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestOrderService {

    @Autowired
    private OrderService orderService;

    @Test
    public void testCreate(){
        Order order  = new Order();
        Set<OrderItem> orderItems = Sets.newHashSet();

        OrderItem orderItem1 = new OrderItem();
        orderItem1.setListPrice(new BigDecimal("11.02"));
        orderItem1.setSalePrice(new BigDecimal("9.99"));
        orderItem1.setOrder(order);
        orderItem1.setProductSale(1222021L);
        orderItem1.setPurchaseQuantity(1);

        OrderItem orderItem2 = new OrderItem();
        orderItem2.setListPrice(new BigDecimal("8.5"));
        orderItem2.setSalePrice(new BigDecimal("8.0"));
        orderItem2.setOrder(order);
        orderItem2.setProductSale(1222056L);
        orderItem2.setPurchaseQuantity(2);

        orderItems.add(orderItem1);
        orderItems.add(orderItem2);

        order.setId(String.valueOf(IdUtils.next()));
        order.setCustomer("jasonLin");
        order.setItemList(orderItems);
        orderService.create(order);
    }

}
執行測試方法,檢視資料庫:

資料已經成功插入。在service層裡面有行註釋了的程式碼,用於測試hibernate事物是否正確配置,必須配置HibernateTransactionManager否則使用使用hibernateTemplate事物將不會生效。 最後放上pom.xml檔案的依賴:
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
ps:
1、使用jpa包自動新增hibernate依賴
2、使用hibernateTemplate需要設定sessionFactory
3、springboot會自動注入DataSource,但是在配置檔案中必須以sprping.datasource.*開頭的配置項,
4、預設使用Tomcat連線池
5、springboot自動注入JdbcTemplate

本文的其它詳細程式碼在:https://github.com/Json-Lin/spring-boot-practice/tree/master/spring-boot-paractice-data-jpa
end

相關推薦

spring-boot入門資料庫互動

package com.foo.configura; import org.apache.tomcat.jdbc.pool.DataSource; import org.hibernate.SessionFactory; import org.springframework.beans.factory.an

Spring Boot 入門微服務之 Config Server 統一配置中心

bootstra pan pat 默認 star default client efault localhost 一、目錄結構 二、pom文件 <!-- 配置服務依賴 --> <dependency> &l

Spring Boot入門——使用模板FreeMaker

junit boot.s char pack utf put 常見 節點 簡單的 這周主要學習怎麽在Spring Boot中使用模板引擎FreeMaker,主要從以下幾方面進行學習。 (1) freemarker介紹: FreeMarker是一款模板引擎: 即

spring boot入門 springboot事務管理。最完整、簡單易懂、詳細的spring boot教程。

本文緊接spring boot入門(三)。 事務管理是對於一系列資料庫操作進行管理,一個事務包含一個或多個SQL語句,是邏輯管理的工作單元(原子單元)。通俗的講,事務管理是指的“一次操作”要不就全做,要不就全不做。例如,在一個訂單系統中,包括生成訂單,扣除商品存庫等操作,如

Spring boot 入門:集成 Shiro 實現登陸認證和權限管理

orm ger eal ehcache hash 業務邏輯 2個 時間 prot 本文是接著上篇博客寫的:Spring boot 入門(三):SpringBoot 集成結合 AdminLTE(Freemarker),利用 generate 自動生成代碼,利用 DataT

Spring Boot入門2使用MySQL資料庫

介紹   本文將介紹如何在Spring專案中連線、處理MySQL資料庫。   該專案使用Spring Data JPA和Hibernate來連線、處理MySQL資料庫,當然,這僅僅是其中一種方式,你也可以使用Spring JDBC或者MyBatis.   

Spring Boot學習

自動配置 pat xml配置 XML 入口 spa ges auto classpath @SpringBootApplication 每一個Spring Boot項目都有一個名為*Application的入口類,入口類中有個main方法,在main方法中使用: Sprin

Spring boot入門1

概念 Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。 spring boot對spring mvc、tomcat等都做了整合,只需要依

Spring Boot學習:使用@SpringBootTest註解進行單元測試

一、簡介 專案中經常會遇到需要單元測試的情況,那麼SpringBoot如何實現這種需求,使用@SpringBootTest註解可以執行環境,測試後臺程式碼。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml

Spring Boot入門起步依賴

Spring Boot起步依賴的功能:開發者只需指定功能,構建過程自動分析使用者需求,引入相關依賴 起步依賴本質上是一個Maven專案物件模型(Project Object Model,POM),定義了對其他庫的傳遞依賴,通過依賴疊加,實現功能支援,因此很多依賴

spring cloud 入門【Eureka註冊中心,微服務之間服務呼叫方式二FeignClient進行服務呼叫

FeignClient 支隊服務消費方進行修改,服務提供方不需要修改   還是對  User 進行修改  UserApplication 中新增  @EnableFeignClients UserApplication 程式碼如下: pac

Spring boot入門:SpringBoot整合結合AdminLTE(Freemarker),利用generate自動生成程式碼,利用DataTable和PageHelper進行分頁顯示

  關於SpringBoot和PageHelper,前篇部落格已經介紹過Spring boot入門(二):Spring boot整合MySql,Mybatis和PageHelper外掛,前篇部落格大致講述了SpringBoot如何整合Mybatis和Pagehelper,但是沒有做出實際的範例,本篇部落格是連

Spring Boot 入門: 自動化配置實現

自動化配置實現 我們在上章編寫入門案例的時候,我們使用的是Spring Mvc 作為我們的表現層框架,但是我們都知道我們要使用Spring Mvc 我們就需要在web.xml檔案中配置Spring Mvc 的前端控制器DispatcherServlet。但是我們

Spring Boot入門11實現檔案下載功能

  在這篇部落格中,我們將展示如何在Spring Boot中實現檔案的下載功能。   還是遵循筆者寫部落格的一貫風格,簡單又不失詳細,實用又能讓你學會。   本次建立的Spring Boot專案的主要功能為檔案下載,而且這也是唯一功能,當然,作為例子,要儘可

spring boot 入門filter、servlet、listener

spring boot 入門(八)servlet、filter、listener 1. filter spring boot有兩種方式來配置filter 1.1 Servlet 3.0新特性,以註解方式配置Filter,需在啟動類上加入@ServletComponentSc

spring-boot入門atomikos+druid+多資料來源下的分散式事務配置

spring-boot入門(七)atomikos+druid+多資料來源下的分散式事務配置 本章內容是基於spring-boot入門(六)多資料來源的基礎之上進行的,如果還不瞭解多資料來源怎麼配置,請參考上一章節的內容。在上一章節的末尾我們遺留了一個問題:多資料來源下的分散式事務問題

spring-boot入門多資料來源

spring-boot入門(六)多資料來源 我們現在可以通過自定義的資料來源,用spring boot迅速的搭建起一個訪問資料庫的應用,有時候一個系統往往會和多個數據庫進行互動。當然可以通過遠端服務呼叫方式訪問多個數據庫,每個服務負責不同的資料庫訪問,但是多資料來源的方式可能會更加的

spring boot 入門

轉自構建微服務:Spring boot 入門篇 什麼是spring boot Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。用我的話來理解,就是spring

Spring Boot入門12實現頁面訪問量統計功能

  在日常的網站使用中,經常會碰到頁面的訪問量(或者訪問者人數)統計。那麼,在Spring Boot中該如何實現這個功能呢?   我們的想法是比較簡單的,那就是將訪問量儲存在某個地方,要用的時候取出來即可,儲存的位置可選擇資料庫或者其他檔案。本例所使用的例子為

spring boot入門 springboot的攔截器Interceptor。最完整、簡單易懂、詳細的spring boot教程。

很多同學搞不懂攔截器和過濾器的區別,我們先說一下他們的區別: 過濾器和攔截器非常相似,但是它們有很大的區別 最簡單明瞭的區別就是過濾器可以修改request,而攔截器不能 過濾器需要在servlet容器中實現,攔截器可以適用於javaEE,javaSE等各種環境 攔截