SpringBoot默认使用JPA的框架是Hibernate,如下案例是SpringBoot集成JPA的步骤:
1、修改POM文件依赖
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 定义公共资源版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.test</groupId>
<artifactId>Proj_1604F</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Proj_1604F Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--JSP支持的依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 数据源依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>jconsole</artifactId>
</exclusion>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>tools</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 数据库驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<!-- SpringBoot-Dubbo集成依赖 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>1.0.1</version>
</dependency>
<!-- Zookeeper客户端依赖 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!--
<dependency>
<groupId>com.test</groupId>
<artifactId>gfdev</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/lib/gfdev-2.0.jar</systemPath>
</dependency>
-->
</dependencies>
<build>
<finalName>Proj_1605L</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、修改配置文件application.properties
application.properties
#SpringBoot服务端口配置
server.port=6060
server.context-path=/
#spring.resources.static-locations=/css,/images,/img,/js
#SpringMVC JSP目录配置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
#Http编码配置
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
#Rabbitmq配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
#Dubbo 1.0.1集成
spring.dubbo.appname=dubbo-provider
spring.dubbo.registry=zookeeper://127.0.0.1:2181
spring.dubbo.protocol=dubbo
spring.dubbo.port=20880
#数据源配置
spring.datasource.name=w2
spring.datasource.url=jdbc:mysql://localhost:3306/w2?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.maxActive=20
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
#Mybatis实体类配置
mybatis.mapper-locations=classpath:mapper/*.xml
# JPA 相关配置
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
#日志配置
logging.file=d:/springboot.log
logging.level.com.test.mapper=INFO
logging.level.com.hk.servlet=DEBUG
logging.level.com.test.service.impl=DEBUG
3、使用JPA注解设置实体类
OrderInfo.java
package com.test.model;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
@Entity
@Table(name = "T_ORDER")
public class OrderInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1000L;
//订单编号 行号自增唯一)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
//用户编号(user_id)
@Column(length = 32)
private String userId = null;
//支付金额(payment)
@Column
private Integer payment = null;
//支付类型(payment_type 1在线支付 2货到付款)
@Column
private Integer paymentType = null;
//订单状态(order_status 1未付款 2已付款 )
@Column
private Integer orderStatus = null;
//订单创建时间(create_time)
@Column
private Timestamp createTime = null;
//付款时间(payment_time)
@Column
private Timestamp paymentTime = null;
private String province = null;
private String city = null;
private String county = null;
//订单明细数据
@OneToMany(fetch=FetchType.EAGER,cascade = CascadeType.ALL,mappedBy="order",orphanRemoval = true)
private Set<OrderItemInfo> items = new HashSet<OrderItemInfo>();
@Transient
private String itemId = null;
@Transient
private String itemNum = null;
@Transient
private String itemPrice = null;
@Transient
private String storeNum = null;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Integer getPayment() {
return payment;
}
public void setPayment(Integer payment) {
this.payment = payment;
}
public Integer getPaymentType() {
return paymentType;
}
public void setPaymentType(Integer paymentType) {
this.paymentType = paymentType;
}
public Integer getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(Integer orderStatus) {
this.orderStatus = orderStatus;
}
public Timestamp getCreateTime() {
return createTime;
}
public void setCreateTime(Timestamp createTime) {
this.createTime = createTime;
}
public Timestamp getPaymentTime() {
return paymentTime;
}
public void setPaymentTime(Timestamp paymentTime) {
this.paymentTime = paymentTime;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public Set<OrderItemInfo> getItems() {
return items;
}
public void setItems(Set<OrderItemInfo> items) {
this.items = items;
}
public String getItemId() {
String str = "";
for(OrderItemInfo oii:items)
str = str + oii.getItemId()+",";
return str;
}
public String getItemNum() {
String str = "";
for(OrderItemInfo oii:items)
str = str + oii.getItemNum()+",";
return str;
}
public String getItemPrice() {
String str = "";
for(OrderItemInfo oii:items)
str = str + oii.getItemPrice()+",";
return str;
}
public String toString()
{
return "Order[id="+id+",items="+items+"]";
}
}
OrderItemInfo.java
package com.test.model;
import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
@Entity
@Table(name = "T_ORDERITEM")
public class OrderItemInfo implements Serializable{
//id(id行号自增唯一)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
//商品编号(item_id)
@Column
private String itemId = null;
//订单编号(order_id 外键,订单表主键)
@JoinColumn(name="orderid")//外键列的列名
@ManyToOne(fetch=FetchType.LAZY,cascade= CascadeType.ALL)
private OrderInfo order = null;
//商品数量(item_num)
@Column
private Integer itemNum = null;
//商品单价(item_price)
@Column
private Integer itemPrice = null;
//商品总金额(total_fee)
@Column
private Integer totalFee = null;
//商品图片地址(pic_path)
@Column
private String picPath = null;
@Transient
private String uuid = null;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
public Integer getItemNum() {
return itemNum;
}
public void setItemNum(Integer itemNum) {
this.itemNum = itemNum;
}
public Integer getItemPrice() {
return itemPrice;
}
public void setItemPrice(Integer itemPrice) {
this.itemPrice = itemPrice;
}
public Integer getTotalFee() {
return totalFee;
}
public void setTotalFee(Integer totalFee) {
this.totalFee = totalFee;
}
public String getPicPath() {
return picPath;
}
public void setPicPath(String picPath) {
this.picPath = picPath;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public OrderInfo getOrder() {
return order;
}
public void setOrder(OrderInfo order) {
this.order = order;
}
}
注意设置正确实体类之间的关系
4、定义JPA的Repository
package com.test.dao;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.test.model.OrderInfo;
public interface OrderDao extends JpaRepository<OrderInfo, Long>{
@Query("SELECT o FROM OrderInfo o WHERE o.userId = :userId")
Page<OrderInfo> findOrderByUserId(@Param("userId") String userId,Pageable pageable);
@Query("SELECT o FROM OrderInfo o")
Page<OrderInfo> findOrder(Pageable pageable);
}
package com.test.dao;
import java.io.Serializable;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.test.model.OrderItemInfo;
public interface OrderItemDao extends JpaRepository<OrderItemInfo, Serializable>{
public List<OrderItemInfo> findByItemId(String item_id);
public List<OrderItemInfo> findByOrderId(Long order_id);
}
5、如果定义事务管理,定义服务接口
package com.test.service;
import java.util.List;
import java.util.Map;
import com.test.model.AddressInfo;
import com.test.model.OrderInfo;
/**
* Dubbo服务接口
* @author java
*
*/
public interface IService {
public Map getOrder(Integer page,Integer rows);
public boolean saveOrder(OrderInfo oi);
public boolean updateStore(OrderInfo oi);
public OrderInfo getOrderById(Integer id);
public List<AddressInfo> findProvince();
public List<AddressInfo> findCityByPrvnc(String code);
public List<AddressInfo> findCountyByCity(String cityCode);
}
package com.test.service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import com.test.dao.AddressDao;
import com.test.dao.OrderDao;
import com.test.dao.OrderItemDao;
import com.test.dao.StoreDao;
import com.test.model.AddressInfo;
import com.test.model.OrderInfo;
import com.test.model.OrderItemInfo;
import com.test.model.StoreInfo;
@Service
public class ServiceImpl implements IService{
@Autowired
private OrderDao dao;
@Autowired
private StoreDao storeDao;
@Autowired
private OrderItemDao itemDao;
@Autowired
private AddressDao addrDao;
@Override
public Map getOrder(Integer page, Integer rows) {
Sort sort = new Sort(Sort.Direction.DESC,"id");
PageRequest pg = new PageRequest(page,rows,sort);
Page<OrderInfo> orders = dao.findOrder(pg);
System.out.println(orders.getTotalElements()+",rows="+orders.getContent());
Map m = new HashMap();
m.put("total", orders.getTotalElements());
m.put("orders", orders.getContent());
return m;
}
@Override
public boolean saveOrder(OrderInfo oi) {
try
{
dao.save(oi);
return true;
}
catch(Exception e)
{
return false;
}
}
@Override
public boolean updateStore(OrderInfo oi) {
try
{
List<OrderItemInfo> list = itemDao.findByOrderId(oi.getId());
for(OrderItemInfo oti:list)
{
StoreInfo si = storeDao.findByItemId(oti.getItemId());
if(si != null)
{
Integer num = si.getInventorNum();
si.setInventorNum(num);
storeDao.save(si);
}
}
return true;
}
catch(Exception e)
{
return false;
}
}
@Override
public List<AddressInfo> findProvince() {
return addrDao.findProvince();
}
@Override
public List<AddressInfo> findCityByPrvnc(String code) {
code = code.substring(0,2);
code = code+"%00";
System.out.println("code="+code);
return addrDao.findCityByPrvnc(code);
}
@Override
public List<AddressInfo> findCountyByCity(String cityCode) {
cityCode = cityCode.substring(0,4);
cityCode = cityCode + "%";
System.out.println("citycode="+cityCode);
return addrDao.findCountyByCity(cityCode);
}
@Override
public OrderInfo getOrderById(Integer id) {
return dao.getOne(new Long(id));
}
}
操作页面