1. 什么是JPA
JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范
为 Java 开发人员提供了一种对象/关系映射工具来管理 Java 应用中的关系数据
JPA的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术
具有易于使用,伸缩性强等优点
Spring Boot JPA
Sprng Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架
它提供了包括增删改查等在内的常用功能,且易于扩展
可使开发者用极简的代码即可实现对数据的访问和操作
2. 搭建开发环境
我这里使用的是IntelliJ IDEA 2019.3.2版本,也是目前最新版
1.这个按照自己的要求填写
2.这里勾选JPA和mysql
3.选择好路劲自己创建就好了
4.编写application.properties或者application.yml
spring.datasource.url=jdbc:mysql://localhost:3306/lijie
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sq1=true
5.编写数据库已有的实体类
比如:我数据库中有个pub_user表
实体类就这样编写:
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 用户信息表实体类
*
* @author LiJie
* @since 1.0
* @version 2020-02-08 LiJie
*/
@Entity
@Table(name="pub_user")
public class UserVO implements Serializable {
/** 用户编号 **/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) //代表主键
@Column(name="user_id")
private Integer userId;
/** 用户名称 **/
@Column(name="user_name")
private String userName;
/** 用户帐号 **/
@Column(name="account")
private String account;
........地下省略很多属性及get和set方法。
6.编写dao层访问数据库
DAO 只需要继承 JpaRepository 接口,几乎可以不用写方法, JpaRepository已经包含通用的CRUD操作,类似MyBatis-Plus
3. 测试增删改查
我这里是使用了SpringBootTest来进行模拟开发环境
package com.lijie;
import com.lijie.dao.UserJpaRepository;
import com.lijie.model.UserVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import java.awt.print.Pageable;
import java.util.List;
@SpringBootTest
class SpringbootJpaApplicationTests {
@Autowired
UserJpaRepository userJpaRepository;
@Test
void contextLoads() {//测试查询全部
List<UserVO> list=userJpaRepository.findAll();
for (UserVO user:list ) {
System.out.println(user.getUserName());
}
}
@Test
void contextLoads1() {//测试添加
UserVO userVO = new UserVO();
userVO.setUserName("问问问问");
userVO.setAccount("sadassa");
userVO.setPassword("123456");
userJpaRepository.save(userVO);
}
@Test
void contextLoads2() {//测试修改
UserVO userVO = new UserVO();
userVO.setUserId(9);
userVO.setUserName("wwwwww");
userVO.setAccount("sadassa");
userVO.setPassword("123456");
userJpaRepository.save(userVO);
}
@Test
void contextLoads3() {//测试删除
UserVO userVO = new UserVO();
userVO.setUserId(9);
//按照对象删除
userJpaRepository.delete(userVO);
//按照id删除
userJpaRepository.deleteById(9);
}
@Test
void contextLoads4() {//测试按照id查询
UserVO uservo=userJpaRepository.findById(9).get();
System.out.println(uservo.getUserName());
}
/**
* Spring Boot Jpa 已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable
* Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则
* 当查询中有多个参数的时候,Pageable建议做为最后一个参数传入
*/
@Test
void testPage() {//测试分页查询
Pageable pageable = PageRequest.of(0,2,new Sort(Sort.Direction.DESC,"userId"));
Page<UserVO> userPage = userJpaRepository.findAll(pageable);
for (UserVO user:userPage.getContent()) {
System.out.println(user.getUserName());
}
}
}
4. 自定义简单查询
JPA有一个特别有尿性的功能非常赞,就是可以根据方法名来自动的生成 SQL查询(自定义简单查询),比如findByUsrName(String usrName) 会自动生成一个以 usrName 为参数的查询方法
在dao层添加
测试
5. 自定义SQL查询
虽然大部分的 SQL 都可以根据解析方法名的方式来实现,但是由于某些原因我们需要使用自定义的 SQL 来查询
在查询方法上面使用@Query注解
JPL中使用实体类名和属性名
?1对应方法第一个参数,?2对应第二个参数,以此类推
涉及到删除和修改在需要加上@Modifying,也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等