由于现在的项目要使用JPA,所以也需要学习一下JPA的使用,之前一直使用的是Mybatis,不得不说JPA要上手确实比Mybatis要复杂一些,难一些,Mybatis和JPA的比较我这里就不多说了,关于这个网上有很多总结的非常好的文章,大家有兴趣可以去看一看,这里就主要分享一下在SpringBoot下使用JPA。
1、环境搭建
这里主要需要引入JPA和MySQL的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
引入依赖之后修改application.yml配置文件,这里只是最基本的配置,更多的配置可以自行了解
spring:
# 数据库配置
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/java?useUnicode=true&characterEncoding=utf8
username: root
password: root
# jpa配置
jpa:
# 数据库类型
database: MySQL
# 是否打印sql
show-sql: true
hibernate:
ddl-auto: update
2、数据库结构
数据库主要是有两张表,用户表(t_user)和部门表(t_dept),部门和用户是一对多的关系(通过dept_id关联)
-- 部门表
CREATE TABLE `t_dept` (
`dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id',
`name` varchar(100) NOT NULL COMMENT '部门名称',
`created_ts` datetime NOT NULL COMMENT '创建时间',
`last_modified_ts` datetime DEFAULT NULL COMMENT '最近修改时间',
`creator` bigint(20) NOT NULL COMMENT '创建人id',
`editor` bigint(20) DEFAULT NULL COMMENT '最近修改人id',
PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
-- 用户表
CREATE TABLE `t_user` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`name` varchar(100) NOT NULL COMMENT '用户姓名',
`gender` int(3) NOT NULL COMMENT '用户性别 1:男,2:女',
`phone` varchar(50) NOT NULL COMMENT '用户电话',
`note` text COMMENT '备注',
`created_ts` datetime NOT NULL COMMENT '创建时间',
`last_modified_ts` datetime DEFAULT NULL COMMENT '最近修改时间',
`creator` bigint(20) NOT NULL COMMENT '创建人id',
`editor` bigint(20) DEFAULT NULL COMMENT '最近修改人id',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门id',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4;
3、目录结构
项目结构如下
这里就不每个文件都说一遍了,需要的时候在说,这里主要说一下BaseModel和BaseRepo
BaseModel.java
package priv.cwr.model;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.util.Date;
/**
* 公共Model,将每个表都有的公共字段抽取出来
*
* @MappedSuperclass注解表示不是一个完整的实体类,将不会映射到数据库表,但是它的属性都将映射到其子类的数据库字段中
*/
@MappedSuperclass
@Data
public class BaseModel implements Serializable {
/**
* 创建时间
*/
@Column(name = "created_ts")
private Date createdTs = new Date();
/**
* 创建人id
*/
private Long creator;
/**
* 最近修改时间
*/
@Column(name = "last_modified_ts")
private Date lastModifiedTs = new Date();
/**
* 最近修改人id
*/
private Long editor;
}
BaseModel是每个表都有的公共字段组成的类,加上@MappedSuperclass注解则不会映射到数据库中,它是所有实体类的父类。
BaseRepo.java
package priv.cwr.repository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import priv.cwr.model.BaseModel;
/**
* 公共Repository
* @NoRepositoryBean注解表示Spring Data Jpa在启动时就不会去实例化这个接口
*/
@NoRepositoryBean
public interface BaseRepo<T extends BaseModel> extends PagingAndSortingRepository<T, Long>, JpaSpecificationExecutor<T> {
}
BaseRepo是一个公用的Repository,加上@NoRepositoryBean注解表示Spring Data Jpa在启动时就不会去实例化这个接口,BaseRepo继承了JPA的两个接口,我们自己的Repository只需要继承BaseRepo即可,不用每一个都去继承JPA的接口。
基本的配置就完成了,下一节会分享JPA的简单使用。