本篇文章介绍SpringBoot + Jpa。文章不会过多介绍Spring Data
Jpa与Jpa的区别以及底层依赖,本专栏专注的是实践,因此会快速进入到如何搭建项目当中。IDE:IntelliJ IDEA 2019.3.3
Java:jdk1.8
Spring Boot:2.3.5.RELEASE
MySQL:8.0.15
一、Spring Data JPA
首先快速介绍下Spring Data Jpa是什么?
Spring Data Jpa是Spring提供的一套简化Jpa开发的数据访问层框架,通过简单的继承Repository接口以快速实现数据层的CRUD操作,Spring Data Jpa同时约定了一套 方法命名规则 ,开发人员编写指定关键词的接口便能够实现相应的方法。
我们为什么要使用Spring Data Jpa?
因为简单、快速、高效。如果使用传统JDBC编程,我们会编写非常多的重复且无意义的代码,同时在Java代码中会耦合大量SQL语句,可维护性较差。而Spring Data Jpa将传统的SQL操作进行同一封装,并只对外提供简单的几个接口,便能够帮助开发人员快速访问、操作数据层,让开发人员更加专注业务代码的实现。
二、Spring Data Jpa快速启动
1、引入依赖
这里的依赖包最好在父工程进行依赖管理,为了方便这里就直接列出来了。
引入依赖后依照前面的文章快速搭建SpringBoot工程。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
2、相关配置
spring:
# 配置数据源信息,注意这是MySQL8.0版本以上的配置方式,MySQL5.0版本是不需要.cj的
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springbootdb?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: root
password: 123456
# 配置jpa
jpa:
show-sql: true # 默认false,在日志里显示执行的sql语句
database: mysql # 数据库类型
hibernate.ddl-auto: update # 运行程序时,没有表时会创建表,如果对象发生改变时,会更新对应的表,并且不会删除原有数据,只会进行更新(推荐)
上面的配置部分大家都比较熟悉,比如MySQL数据源相关配置,使用Spring时也大差不差。
对于Spring Data Jpa的配置也都有详尽的注释,这里只对 hibernate.ddl-auto
这个配置进行相关补充:
-
hibernate.ddl-auto: create
:每次运行程序时,都会创建新表,同时原始数据丢失 -
hibernate.ddl-auto: create-drop
:每次运行程序时,都会创建新表,程序结束后清空表 -
hibernate.ddl-auto: upadte
:运行程序时,没有表时会创建表,如果对象发生改变时,会更新对应的表,并且不会删除原有数据,只会进行更新(推荐) -
hibernate.ddl-auto: validate
:运行程序时,会校验字段与数据库列是否类型匹配,不匹配则报错 -
hibernate.ddl-auto: none
:禁用DDL
还有一些其它的配置,大家可以在 JpaProperties
和 HibernateProperties
两个配置类中查询。
3、实体类与DAO接口
1)、实体类
- 编写一个JavaBean代表数据表的抽象,其中bean的属性与数据表的列名对应(也可以通过注解的id属性对应)。
- 添加
@Entity
类注解,标明当前类为实体类,能够与数据源中的某张表对应,为Jpa在解析时提供标识。 - 添加
@Table
类注解,并通过name
属性映射至数据库中的某张表。 - 接着进行bean中的属性与列名的映射过程:
@Id
注解标明当前属性为主键,之后可以通过@GeneratedValue
注解中的strategy
属性确定主键生成策略:TABLE
:使用特定的数据表来保存主键SEQUENCE
:使用数据库的序列机制提供主键,序列机制只有部分数据库支持,如Oracle、DB2等IDENTITY
:数据库自动生成主键,比如常见的自增长AUTO
:主键由持久化引擎判断控制生成,持久化引擎会根据配置的数据库在以上三种策略中选择一种,该选项也是默认选项
@Column
注解能够将当前属性映射至数据库列名上,如果未指定name
属性,则属性名必须与列名相同。否则可以指定列名。length
属性可以指定数据库列名的存储字符长度。该注解中还有nullable
属性标明当前属性是否可以为null,其它的属性可以在@Column
中查询。
// org.mrxu.pojo.User
@Data
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", length = 20)
private String userName;
@Column(name = "user_age")
private int userAge;
}
2)、DAO接口
- 编写一个接口并继承
JpaRepository
,泛型中填写实体类、主键类型 - over!对,你没看错,就是这么简单!如果你只想实现简单的CRUD操作,到这里就行了。所有的CRUD操作都封装在了
JpaRepository
中。
// org.mrxu.dao.UserRepository
public interface UserRepository extends JpaRepository<User, Long> {}
4、测试
首先我们检查下数据库,可以看到其中并没有表,当程序运行时会自动为我们创建表。
1)、insert测试
编写如下测试类并运行:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Resource
private UserRepository userRepository;
@Test
public void testAddUser() {
User user = new User();
user.setUserAge(20);
user.setUserName("xiaohua");
// save方法为JpaRepository中的方法
userRepository.save(user);
}
}
运行结果如下图所示,可以看见不仅表被创建了,数据也成功添加进了表中。
2)、query测试
编写如下测试类并运行,这里只写了测试方法,框架同上:
@Test
public void testQueryUser() {
Optional<User> userOptional = userRepository.findById(1L);
User user = userOptional.get();
System.out.println(user);
}
运行结果如下,可以看到表中数据被成功查询。
3)、update测试
编写如下测试类并运行,这里只写了测试方法,框架同上:
update与insert都是使用 save
方法,只不过update需要指定唯一键标明当前操作为更新操作,否则为新增操作。
@Test
public void testUpdateUser() {
User user = new User();
user.setId(1L);
user.setUserAge(21);
user.setUserName("xiaohua");
userRepository.save(user);
}
运行结果如下,数据库中的数据已经被更新了:
看看打印的日志,也能说明当前操作为更新操作:
4)、删除操作
编写如下测试类并运行,这里只写了测试方法,框架同上:
@Test
public void testDeleteUser() {
userRepository.deleteById(1L);
}
5)、小结
JpaRepository
中还有许多其它的通用CRUD方法,比如 findAll
、saveAll
、delete
等,大家可以去自行测试下,这里就不过多叙述。