JPA(Java Persistence API)Java持久API是 Java 持久标准规范,Hibernate是实现持久标准的技术,而Spring Data JPA是在 Hibernate 一个基于包装的框架。
第一,增加依赖性<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency><!--mysql--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.31</version></dependency><!--jpa--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
Mysql和JPA的依赖主要添加到pom文件中。
二、属性配置(application.properties)# 连接spring的数据库.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.username=rootspring.datasource.password=123456spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true # jpa相关配置# sql语句spring显示.jpa.show-sql=true # Spring指定数据库的初始化模式.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto属性介绍:
none: 不指定数据库的初始模式
create: Spring 当Boot应用程序运行时,将删除并重新创建数据库。因此,每次启动时,所有数据都将被清空
create-drop: 当sessionFactory关闭时,表会自动删除
validate: Spring 当Boot应用程序运行时,将检查数据库中的表是否与java实体类相匹配。如果不匹配,则运行失败
update: 当在java实体类中添加一个字段时,在应用程序重新运行时,将字段添加到数据库表中的新列,但不会删除以前的列或约束
update通常用于开发阶段,但需要注意的是,update即使不再需要,也不会移除以前存在的列和约束。
当产品发布时,建议使用none或不直接指定该属性。
三、创造实体@Entity:定义对象将成为JPA管理的实体,并将映射到指定的数据库表。
@Table:用于指定数据库表的表名
@Id:将属性定义为数据库的主键,一个实体必须有一个
@GeneratedValue: 主键生成策略。有四种生成策略。
TABLE(通过表产生主键,框架由表模拟序列产生主键,使用该策略使应用程序更容易移植数据库),
SEQUENCE(MySQL不支持通过序列生成主键,通过@Sequencegenenerator注释指定序列名称)
IDENTITY(MYSQL数据库一般采用数据库ID自增长)
AUTO(JPA自动选择合适的策略是默认选项)
@Column:用于识别实体类中属性与数据表中字段之间的对应关系 name:数据库中表的列名
import lombok.Data; import javax.persistence.*;import java.math.BigDecimal; /** * @author qinxun * @date 2023-06-07 * @Descripion: 用户实体 */@Entity@Table(name = "t_user")@Datapublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 姓名 */ @Column(name = "name") private String name; /** * 年龄 */ @Column(name = "age") private Integer age; /** * 余额 */ @Column(name = "money") private BigDecimal money; }
四、创建数据层import com.example.quartzdemo.entity.User;import org.springframework.data.jpa.repository.JpaRepository; /** * @author qinxun * @date 2023-06-07 * @Descripion: 用户数据层 */public interface UserRepository extends JpaRepository<User, Long> {}
- 我们直接书写自定义界面继承
JpaRepository
获得增删改差的能力 - 两个泛型参数,第一个表示POJO绑定的repository操作,第二个表示自增id类型
1.新增数据
import com.example.quartzdemo.entity.User;import com.example.quartzdemo.repository.UserRepository;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest; import java.math.BigDecimal; /** * @author qinxun * @date 2023-06-07 * @Descripion: 使用JPA */@SpringBootTestpublic class JpaTest { @Autowired private UserRepository userRepository; /** * 新增数据 */ @Test void test1() { User user = new User(); user.setName(张三); user.setMoney(BigDecimal.TEN); user.setAge(20); userRepository.save(user); } }
控制台显示SQL新执行语句
Hibernate: insert into t_user (age, money, name) values (?, ?, ?)
我们查看数据库,看到数据已经添加到数据库中
2.查询数据
/** * 查询所有数据数据 */ @Test void test2() { List<User> userList = userRepository.findAll(); //Hibernate: select user0_.id as id1_1_, user0_.age as age2_1_, user0_.money as money3_1_, user0_.name as name4_1__ from t_user user0_ //[User(id=1, name=张三, age=20, money=10.00)] System.out.println(userList); } /** * 查询ID对应的数据 */ @Test void test3() { User user = userRepository.findById(1L).get(); //Hibernate: select user0_.id as ID1_1_0_, user0_.age as age2_1_0_, user0_.money as money3_1_0_, user0_.name as name4_1_0_0_ from t_user user0_ where user0_.id=? //User(id=1, name=张三, age=20, money=10.00) System.out.println(user); }
3.修改数据
/** * 修改数据 */ @Test void test4() { // 修改ID为1的数据 User user = new User(); user.setName(张三); user.setMoney(BigDecimal.TEN); user.setAge(21); // 指定要修改的ID user.setId(1L); userRepository.save(user); }
控制台显示SQL修改的句子
Hibernate: select user0_.id as ID1_1_0_, user0_.age as age2_1_0_, user0_.money as money3_1_0_, user0_.name as name4_1_0_0_ from t_user user0_ where user0_.id=?Hibernate: update t_user set age=?Hibernate: update t_user set age=?, money=?, name=? where id=?
我们查看了数据库,这个ID为1的数据已经修改了 age变成了21
4.删除数据
/** * 删除数据 */ @Test void test5() { // 删除ID为1的数据 userRepository.deleteById(1L); }
控制台显示sql语句
Hibernate: select user0_.id as ID1_1_0_, user0_.age as age2_1_0_, user0_.money as money3_1_0_, user0_.name as name4_1_0_0_ from t_user user0_ where user0_.id=?Hibernate: delete from t_user where id=?
我们查看了数据库,发现ID1的数据已经被删除了
六、小结从以上步骤来看,我们会发现jpa项目的建设是一个相对简单的过程,增加了必要的依赖性。我们稍微注意两个
- 创建POJO 与我们的实际表格有关
- 创建一个
RepositoryApi
继承自org.springframework.data.jpa.repository.JpaRepository - 通过IOC/DI注入
RepositoryApi
对象,然后可以快乐地进行db操作