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等各種環境 攔截