文章目录
前言
JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下3方面的技术:
ORM映射元数据: 支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系
API: 操作实体对象来执行CRUD操作
查询语言: 通过面向对象而非面向数据库的查询语言(JPQL)查询数据,避免程序的SQL语句紧密耦合
Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 此模块处理对基于JPA的数据访问层的增强支持。 它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。
在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦。 必须编写太多样板代码来执行简单查询以及执行分页和审计。 Spring Data JPA旨在通过减少实际需要的工作量来显著改善数据访问层的实现。 作为开发人员,您编写repository接口,包括自定义查找器方法,Spring将自动提供实现。
Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.
Implementing a data access layer of an application has been cumbersome for quite a while. Too much boilerplate code has to be written to execute simple queries as well as perform pagination, and auditing. Spring Data JPA aims to significantly improve the implementation of data access layers by reducing the effort to the amount that’s actually needed. As a developer you write your repository interfaces, including custom finder methods, and Spring will provide the implementation automatically.
这篇文章就初步演示如何使用 Spring Data JPA 对mysql数据库进行基本 CURD 操作
实例的完整代码将会放在文章最后
Spring Boot整合Spring Data Jpa实例
1、项目结构
2、数据库准备
建表语句可以看我另一文章,使用的是同一个表 SpringBoot整合mybatis-plus–入门超详细
mybatis-plus 和 Spring Data JPA 有些类似的地方可以参考一下
3、pom.xml
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
4、application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybits?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
username: root
password: aaaa
jpa:
database: MySQL
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
5、User.java
import lombok.*;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
//@Entity注解标识了User类是一个持久化的实体
//@Data和@NoArgsConstructor是Lombok中的注解。用来自动生成各参数的Set、Get函数以及不带参数的构造函数。
//如果您对Lombok还不了解,可以看看这篇文章:
//[Java开发神器Lombok的使用与原理](https://www.jianshu.com/p/422f151fccd3)
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
//@Id和@GeneratedValue用来标识User对应对应数据库表中的主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String sex;
private String pwd;
private String email;
//打印这个对象
public void println() {
System.out.println(this);
}
}
这里把引入的包也贴了出来,防止大家导错包
UserDao.java
public interface UserDao extends JpaRepository<User, Integer> {
}
可以看到,这个接口继承了JpaRepository<实体,ID>,spring-data-jpa只需要这个信息,就可以帮你完成常用的操作:增删查改。
这一节不具体展开JpaRepository中所包含的所有方法,单纯使用最简单的增删查改来过瘾
测试类 UserServiceImplTest.java
这里为了简化文章就不写server层直接测试类了
import com.king.bean.User;
import com.king.dao.UserDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.*;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class UserServiceImplTest {
@Autowired
UserDao userDao;
//查询全部
@Test
public void queryAll(){
userDao.findAll().forEach(System.out::println);
}
}
运行结果
select user0_.id as id1_0_, user0_.email as email2_0_, user0_.name as name3_0_, user0_.pwd as pwd4_0_, user0_.sex as sex5_0_ from user user0_
基本 CURD 操作介绍
增加操作
- 单个新增
@Test
public void add() {
User user = new User(null, "test", "男", "aaa", "a@qq.com");
userDao.saveAndFlush(user);
//userDao.save(user);
}
例子中有一个saveAndFlush 还有一个 save 方法可以参考这篇文章
JPA中save和saveAndFlush的区别
2. 批量新增
@Test
public void add2() {
List<User> list = new ArrayList<>();
for (int i = 20; i < 40; i++) {
User user1 = new User(null, "test" + i, i % 2 == 0 ? "男" : "女", "aaaa", "a" + i + "@qq.com");
list.add(user1);
}
userDao.saveAll(list);
}
删除操作
- 根据id单个删除
@Test
public void delete() {
User user = new User();
user.setId(20);
userDao.delete(user);
}
- 根据id批量删除
@Test
public void delete() {
List<Integer> list = new ArrayList<>();
list.add(21);
list.add(22);
userDao.deleteAllById(list);
}
修改操作
@Test
public void update() {
//获得id为8的用户对象
User user = userDao.findUserById(8);
user.println();
user.setEmail("update@qq.com");
//提交修改
User user1 =userDao.save(user);
//打印修改后结果
user1.println();
}
查询操作
@Test
public void query() {
//查询全部
userDao.findAll().forEach(System.out::println);
//通过id查询
userDao.findById(8).get().println();
//条件查询所有性别为男的用户
User user = new User();
user.setSex("男");
Example<User> example = Example.of(user); // 此处未构建自定义匹配规则,使用的是默认匹配规则
userDao.findAll(example).forEach(System.out::println);
user.setName("test2");
//查询一个 性别为男 名字为 test2的用户
userDao.findOne(example).get().println();
}
总结:以上就是Spring Data Jpa 中的最基础的curd操作 ,但是这并不是 jpa 的所有内容,其强大不限于此。
最后附上我的演示例源码
Github
https://github.com/KingJin-web/springboot/tree/master/mybatis_plus
Gitee
https://gitee.com/king__gitee/springboot/tree/master/jpa
以上内容属于个人笔记整理,如有错误,欢迎批评指正!