Springboot快速整合JPA实现增删查改

今天药忘吃喽~ 2023-06-07 08:22 87阅读 0赞

简单看看JPA依赖包的主要成分,可以看到里面有个熟悉的框架 hibernate:
format_png

不多说,直接开始整合。

这次快速整合示例的目录结构:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70

先创建一个springboot项目,在pom.xml中加入依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <!--mysql连接-->
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. </dependency>
  15. <!--JPA-->
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-data-jpa</artifactId>
  19. </dependency>
  20. <!--lombok-->
  21. <dependency>
  22. <groupId>org.projectlombok</groupId>
  23. <artifactId>lombok</artifactId>
  24. <version>1.16.10</version>
  25. <scope>provided</scope>
  26. </dependency>

接着是application.yml文件:

  1. #服务端口
  2. server:
  3. port: 8055
  4. spring:
  5. datasource:
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/testdemo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
  8. hikari: # springboot 2.0 整合了hikari ,据说这是目前性能最好的java数据库连接池
  9. username: root
  10. password: root
  11. minimum-idle: 5 # 最小空闲连接数量
  12. idle-timeout: 180000 # 空闲连接存活最大时间,默认600000(10分钟)
  13. maximum-pool-size: 10 # 连接池最大连接数,默认是10
  14. auto-commit: true # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
  15. pool-name: MyHikariCP # 连接池名称
  16. max-lifetime: 1800000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
  17. connection-timeout: 30000 # 数据库连接超时时间,默认30秒,即30000
  18. connection-test-query: SELECT 1 #连接池每分配一条连接前执行的查询语句(如:SELECT 1),以验证该连接是否是有效的。如果你的驱动程序支持 JDBC4,HikariCP 强烈建议我们不要设置此属性
  19. jpa:
  20. hibernate:
  21. ddl-auto: create # 第一次建表create 后面用update,要不然每次重启都会新建表
  22. show-sql: true #打印执行的sql语句
  23. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #设置数据库方言 记住必须要使用 MySQL5InnoDBDialect 指定数据库类型对应InnoDB ;如果使用MySQLDialect 则对应的是MyISAM

上面的配置项,需要注意的是,
①数据库连接池,这次例子里面采用的是springboot2.0版本后默认整合的hikari连接池,想多了解的可以去网上额外了解下这个数据库连接池的优劣。
②ddl-auto,

  • create:每次运行程序时,都会重新创建表,故而数据会丢失
  • create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
  • upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
  • validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
  • none: 禁用DDL处理

③database-platform,这项是配置对应连接数据库的方言,也就是语法、规则等等。 这里我们使用mysql数据库,方言项记得使用MySQL5InnoDBDialect,这样才能对应起InnoDB。

好,接下来创建User.java(需要注意的是主键自增的设置项,IDENTITY):

  1. import javax.persistence.Entity;
  2. import javax.persistence.GeneratedValue;
  3. import javax.persistence.GenerationType;
  4. import javax.persistence.Id;
  5. /**
  6. * @Author : JCccc
  7. * @CreateTime : 2019/10/12
  8. * @Description :
  9. **/
  10. @Data
  11. @Entity // 该注解声明一个实体类,与数据库中的表对应
  12. @ToString
  13. public class User {
  14. @Id // 表明id
  15. @GeneratedValue(strategy = GenerationType.IDENTITY) // 自动生成
  16. private Long id ;
  17. private String name ;
  18. }
  • @Entity:标注在实体类上告诉JPA这是一个实体类
  • @Table:可以给表命名,也可以使用默认的,即实体类名就是表名
  • @Id:主键注解
  • @GeneratedValue(strategy = GenerationType.IDENTITY) //自增主键
  • @Column: 标注在字段上,可以指定字段名和长度 .

然后是mapper层,UserMapper.java:

  1. import com.jc.gracedemo.pojo.User;
  2. import org.springframework.data.jpa.repository.JpaRepository;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @Author : JCccc
  6. * @CreateTime : 2019/10/12
  7. * @Description :
  8. **/
  9. @Component
  10. public interface UserMapper extends JpaRepository<User,Long> {
  11. /*
  12. * 我们在这里直接继承 JpaRepository
  13. * 这里面已经有很多现场的方法了,可以直接通过UserMapper.xxx()直接使用
  14. * 这也是JPA的一大优点
  15. *
  16. * */
  17. }

在mapper层,因为我们使用的是jpa,继承了JpaRepository,里面基本的增删查改方法都是已经提供的,所以除了我们自己额外需要扩展的业务方法,基本不用写:
20180422144544467

而且JpaRepository继承的分页PagingAndSortingRepository:

20180422144413243

而PagingAndSortingRepository继承了CrudRepository:

20180422144257489

所以非常多的方法都是可以直接使用,非常方便。

接下来是service层,UserService.java:

  1. /**
  2. * @Author : JCccc
  3. * @CreateTime : 2019/10/12
  4. * @Description :
  5. **/
  6. public interface UserService {
  7. List<User> findAll();
  8. User getOne(Long id);
  9. }

对应的impl:

  1. /**
  2. * @Author : JCccc
  3. * @CreateTime : 2019/10/12
  4. * @Description :
  5. **/
  6. @Service
  7. public class UserServiceImpl implements UserService {
  8. @Autowired
  9. private UserMapper userMapper;
  10. @Override
  11. public List<User> findAll() {
  12. // 这里我们就可以直接使用 findAll 方法 这个findAll方法来自JpaRepository
  13. return userMapper.findAll();
  14. }
  15. @Override
  16. public User getOne(Long id) {
  17. return userMapper.getOne(id);
  18. }
  19. }

然后是接口测试,UserController.java:

  1. /**
  2. * @Author : JCccc
  3. * @CreateTime : 2019/10/12
  4. * @Description :
  5. **/
  6. @RestController
  7. public class UserController {
  8. @Autowired
  9. private UserService userService;
  10. @GetMapping("/list")
  11. public List<User> findAll() {
  12. return userService.findAll();
  13. }
  14. @GetMapping("/getOne/{id}")
  15. public String getOne(@PathVariable("id") Long id) {
  16. return userService.getOne(id).toString();
  17. }
  18. }

好,到这里,SpringBoot整合JPA已经完成,接下来测试下看看效果:

把项目运行起来,可以看到控制台里输出了关于自动创建数据库表的相关操作日志:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70 1

看下数据库:

20191014092727474.png

PS:相关的实体类表都建完后,记得修改yml里面的配置项,使用update。

我们往这个表里面手动添加一些数据用于测试,
20191014092854447.png

调用接口 /list:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70 2

调用接口 /getOne/{id}:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70 3

另外,插入使用的save方法,如:

save也是JpaRepository提供,所以直接在service层调用即可。

  1. @Override
  2. public User save(User user) {
  3. return userMapper.save(user);
  4. }

更新的话,可以使用@Query ,@Modifying ,@Transactional ,如 :

  1. @Transactional
  2. @Modifying
  3. @Query(value="update user set name=(:name) where id=(:id)",nativeQuery = true)
  4. int updateById(@Param("name") String name,@Param("id") Long id);
  • 其实JpaRepository,细心看,会发现,里面提供了基本的查询、插入、删除,但是好像没有update字样。实际上也囊括在save这个方法里面了,如果数据库已经存在,则会根据主键进行更新数据。那么也就是说可以通过传递对象,通过set方法修改字段值,再调用save达到更新的效果。*

OK,Springboot 整合JPA简单的使用就到此。

想了解多表联合查询、分页查询等可以看我其他的相关JPA文章。

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读