1.Spring Data JPA简介 JPA是Sun公司官方提出的Java持久层规范。所谓规范,是指只定义标准规则,不提供实现,而JPA的主要实现有Hibernate、EclipseLink以及OpenJPA等。 Spring Data JPA是Spring Data的一个子项目,它通过基于JPA的Repository,极大地减少了JPA作为数据访问方案的代码量。通过Spring Data JPA框架,开发者可以省略实现持久层业务逻辑的工作,只需要声明持久层接口,其它的交给Spring Data JPA来完成。
2.数据准备 新建一个名为mydb的数据库,在mydb中新建一个名为user的数据表,然后往数据表里插入3条数据,具体SQL语句如下。
create database if not exists mydb character set = utf8; create table user ( id int(11) not null auto_increment, name varchar(30) default null, email varchar(50) default null, primary key (id) ); insert into user values (1, 'cherry', '258****996@qq.com'); insert into user values (2, 'owen', '490***112@qq.com'); insert into user values (3, 'steven', '125****421@qq.com');3.引入依赖 新建一个SpringBoot工程,并在pom.xml文件中添加集成Spring Data JPA所需要的dependency。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <scope>provided</scope> </dependency>4.添加配置 在application.properties文件中添加如下配置信息。
############################################################ # # MySQL配置 # ############################################################ ### 连接信息 spring.datasource.url = jdbc:mysql://localhost:3306/mydb ### 用户名 spring.datasource.username = root ### 密码 spring.datasource.password = admin123 ### 驱动 spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver5.dao层开发 首先在项目目录“/src/main/java/com/leichuangkj/jpa”下新建“/dao/po”目录,并在po目录下新建User实体类,具体代码如下。
@Table(name = "user") @Entity @Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { @Id @GeneratedValue private Integer id; private String name; private String email; } @Table:声明此对象映射到数据库的数据表。该注解不是必须的,如果没有则系统使用默认值(实体的短类名)。@Entity:每个持久化POJO类都是一个实体Bean,通过在类的定义中使用@Entity来声明。@Id:指定表的主键。然后在dao目录下新建repository目录,并在repository目录下新建UserRepository接口,具体代码如下。
@Repository public interface UserRepository extends JpaRepository<User,String>{ /** * @description 通过姓名查询 * @param name * @return User * @author steven * @date 2020-06-16 */ List<User> findByName(String name); /** * @description 通过姓名like查询 * @param name * @return User * @author steven * @date 2020-06-16 */ List<User> findByNameLike(String name); }6.service层开发 在项目目录“/src/main/java/com/leichuangkj/jpa”下新建service目录,并在service目录下新建IUser接口,具体代码如下。
public interface IUser { List<User> findByName(String name); List<User> findByNameLike(String name); List<User> findAll(); Page<User> findAll(Pageable pageable); }然后在service目录下新建impl目录,并在impl目录下新建UserImpl实现类,具体代码如下。
@Service public class UserImpl implements IUser { @Resource UserRepository userRepository; @Override public List<User> findByName(String name) { return userRepository.findByName(name); } @Override public List<User> findByNameLike(String name) { return userRepository.findByNameLike(name); } @Override public List<User> findAll() { return userRepository.findAll(); } @Override public Page<User> findAll(Pageable pageable) { return userRepository.findAll(pageable); } }Pageable:这是一个分页接口,查询时只需要传入一个Pageable接口的实现类,指定pageNumber和pageSize即可。pageNumber为第几页,pageSize为每页大小。 Page:分页查询结果会封装在该类中,Page接口实现Slice接口,通过查看其源代码可知。通过调用getTotalPages和getContent等方法,可以方便获得总页数和查询的记录。
7.测试用例 在单元测试类JpaApplicationTests中添加如下代码。
@SpringBootTest class JpaApplicationTests { @Resource private UserImpl userImpl; @Test void testFindByName(){ List<User> userList = userImpl.findByName("steven"); System.out.println("findByName() :" + userList.size()); } @Test void testFindByNameLike(){ List<User> userList = userImpl.findByNameLike("steven"); System.out.println("testFindByNameLike() :" + userList.size()); } @Test void testFindAll(){ List<User> userList = userImpl.findAll(); System.out.println("findAll() :" + userList.size()); } @Test void testFindAllByPage(){ PageRequest pageRequest = PageRequest.of(0,10); Page<User> userList = userImpl.findAll(pageRequest); System.out.println("page findAll():" + userList.getTotalPages() + "/" + userList.getSize()); } }右键执行JpaApplicationTests单元测试,这时可以看到控制台显示“All 4 test passed”以及如下打印信息。
8.工程目录结构