用项目说话,JPA技巧总结
这个本人做的一个SpringBoot+JPA的示例项目,讲解了一些自己搜集到的使用技巧。
Github地址是:https://github.com/unlucky-one/SpringBootAndJPA
项目框架图
文章图片
SpringBoot JPA 框架.png
搭建了一套Spring Boot的微服务,数据库操作使用JPA。
主要是自定义了BaseRepository类,实现了一些自定义方法,尽量的缩减了重复代码,欢迎爱好者共同学习。
前言
项目中使用到了Lombok插件,请没安装的朋友自行下载安装。否则带有@Data、@NoArgsConstructor、@AllArgsConstructor的类无法编译。
一、基础篇
Spring基础,有SpringMVC基础的人略过。
??进入项目首先你要打开application.properties
文件,根据个人情况修改为你的数据库配置。
??spring.jpa.hibernate.ddl-auto
这个配置需要注意。这个配置的目的是控制jpa对数据库如何操作。
当值为create的时候每次启动项目Jpa会根据项目内的实体映射生成表。建议表生成后或数据库中的表已存在时将参数改成none或update。
??MyResponseAdvice
类是一个全局的返回值控制器。用来统一返回数据的格式。我这里返回的为map类型,数据包含status、message、data。
??MyAppConfig
对项目对项目做了一些配置,修改拦截器拦截的请求在这个类中配置。
??MyFilter
自定义过滤器,所有请求都会经过这个类,可以加一些计数器操作。
??MyAppInterceptor
未忽略的请求都会被此类拦截,用户验证、权限验证都可以在这里做。
??MyHttpSessionListener
自定义Session监听器,这里做了一个在线人数统计功能。
Jpa类说明
??I18nUtils
国际化配置。
??BaseRepositoryFactoryBean
为更换jpa处理类的工厂类,下一篇会详细说明。
??BeanTransformerAdapter
bean的适配器类。
??BaseRepository
接口,定义了一些要自己实现的通用方法,目的是减少重复工作,还可以对jpa操作做一些扩展,方便项目维护。BaseRepositoryImpl
是对它的实现。
??其他的Repository类中列出了一些jpa使用技巧,在第三篇会说明,类中也有注释。
??entity
下的类中标注了@Entity和@Table的类为要映射到表的实体类,其他为自定义的返回结果。
二、改造篇
??项目主要对Jpa的基本Repository(SimpleJpaRepository)又做了一次封装。
??BaseRepositoryFactoryBean
是一个工厂类,用来将jpa默认的处理类换成自定义的BaseRepository
。此类需要配置在程序的入口的@EnableJpaRepositories注解中的repositoryFactoryBeanClass
属性。
??BaseRepository
接口上文已经说明了作用。注意要在类头加上@NoRepositoryBean注解,让Spring不要注入此类,手动使用BaseRepositoryFactoryBean
的方式加入到Spring。
??在核心的BaseRepositoryImpl
处理类中加入了一些自定义的方法。构造函数中通过参数获取实体的操作类。接下来实现了一些可以使用原生sql来查询数据库的方法。
??fakeDelete
方法实现了一个伪删除操作(既:当表中存在state字段时,将值改为-1,不存在则执行删除,可根据个人情况修改deleteWithState
方法),该方法中操作数据的方式使用的是Criteria,有兴趣的朋友可以深入研究。
??重写了save
方法,这个方法用于保存和修改(区别在于是否有id)。
重写的目的是判断标注了@DynamicUpdate注解的实体中的字段字段是否为空值,修改的时候会忽略修改空值的字段,
所以实体中数字型的字段类型一定要用大写的“类”型,如:Long、Integer。
三、技巧篇
【用项目说话,JPA技巧总结】??项目中的Service可继承BaseService,用来减少一些重复性的代码,如简单的增删改查。
??项目中的Repository都继承了自定义的BaseRepository
而不是默认的JpaRepository。
??UserIdentifyRepository
中列出三种Jpa的查询方式。还有一种@NamedQuery方式因为要修改实体类,所以本项目没有用到。
??UserRepository
中展示类分页查询和返回自定义类的方法。
还有更多技巧希望大家补充!
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。