JPA接入

本节内容需要了解JPA封装内容,请参见笔者 上篇博文。

准备工作

为了演示JPA接入,需要先准备如下:

  1. MySQL数据库 (客户端可以使用 navicat for mysql)

  2. 新建测试数据库 fleajpatest

  3. 新建测试表 student

    建表语句如下:

    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (`stu_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '学生编号',`stu_name` varchar(255) NOT NULL COMMENT '学生姓名',`stu_age` tinyint(2) NOT NULL COMMENT '学生年龄',`stu_sex` tinyint(1) NOT NULL COMMENT '学生性别(1:男 2:女)',`stu_state` tinyint(2) NOT NULL COMMENT '学生状态(0:删除 1:在用)',PRIMARY KEY (`stu_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    

接入讲解

1. 实体类

新建如下实体类Student,对应测试表student

/*** <p> 学生表对应的实体类 </p>** @author huazie* @version 1.0.0* @since 1.0.0*/
@Entity
@Table(name = "student")
public class Student implements FleaEntity {private static final long serialVersionUID = 1267943552214677159L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "STUDENT_SEQ")@SequenceGenerator(name = "STUDENT_SEQ")@Column(name = "stu_id", unique = true, nullable = false)private Long stuId; // 学生编号@Column(name = "stu_name", nullable = false)private String stuName; // 学生姓名@Column(name = "stu_age", nullable = false)private Integer stuAge; // 学生年龄@Column(name = "stu_sex", nullable = false)private Integer stuSex; // 学生性别(1:男 2:女)@Column(name = "stu_state", nullable = false)private Integer stuState; // 学生状态(0:删除 1:在用)// ... 省略get和set方法@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}
}

2. 持久化单元DAO层实现

上篇博文说到,增加一个持久化单元配置,便需要增加一个持久化单元DAO层实现。针对本次演示新增持久化单元 fleajpa,持久化配置文件 fleajpa-persistence.xml, Spring配置中新增数据库事务管理者配置,相关内容可参考上一篇博文。下面贴出本次演示的持久化单元DAO层实现代码:

/*** <p> FleaJpa数据源DAO层父类 </p>** @author huazie* @version 1.0.0* @since 1.0.0*/
public class FleaJpaDAOImpl<T> extends AbstractFleaJPADAOImpl<T> {// 持久化单元,持久化配置文件中定义,spring配置中持久化接口工厂初始化参数@PersistenceContext(unitName="fleajpa")protected EntityManager entityManager;@Override// 持久化事务管理者, spring配置文件中定义@Transactional("fleaJpaTransactionManager")public boolean remove(long entityId) throws Exception {return super.remove(entityId);}// ...其他实现省略@Overrideprotected EntityManager getEntityManager() {return entityManager;}}

3. 配置介绍

详细配置信息,可以参考笔者上篇博文,这里不再赘述。
涉及文件 fleajpa-persistence.xmlapplicationContext.xml

4. 学生DAO层接口

IStudentDAO 继承了抽象Flea JPA DAO层接口,并定义了两个方法,分别获取学生信息列表(分页)和学生总数。

/*** <p> 学生DAO层接口 </p>** @author huazie* @version 1.0.0* @since 1.0.0*/
public interface IStudentDAO extends IAbstractFleaJPADAO<Student> {/*** <p> 学生信息列表 (分页) </p>** @param name      学生姓名,可以模糊查询* @param sex       性别* @param minAge    最小年龄* @param maxAge    最大年龄* @param pageNum   查询页* @param pageCount 每页总数* @return 学生信息列表* @throws DaoException 数据操作层异常* @since 1.0.0*/List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException;/*** <p> 学生总数 </p>** @param name   学生姓名,可以模糊查询* @param sex    性别* @param minAge 最小年龄* @param maxAge 最大年龄* @return 学生总数* @throws DaoException 数据操作层异常* @since 1.0.0*/int getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException;}

5. 学生DAO层实现

StudentDAOImpl 是学生信息的数据操作层实现,继承持久化单元DAO层实现类,并实现了上述学生DAO层接口自定义的两个方法。 具体如何使用 FleaJPAQuery 可以参见下面代码 :

/*** <p> 学生DAO层实现类 </p>** @author huazie* @version 1.0.0* @since 1.0.0*/
@Repository("studentDAO")
public class StudentDAOImpl extends FleaJpaDAOImpl<Student> implements IStudentDAO {@Override@SuppressWarnings(value = "unchecked")public List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException {FleaJPAQuery query = initQuery(name, sex, minAge, maxAge, null);List<Student> studentList;if (pageNum > 0 && pageCount > 0) {// 分页查询studentList = query.getResultList((pageNum - 1) * pageCount, pageCount);} else {// 全量查询studentList = query.getResultList();}return studentList;}@Override@SuppressWarnings(value = "unchecked")public long getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException {FleaJPAQuery query = initQuery(name, sex, minAge, maxAge, Long.class);// 统计数目query.countDistinct();Object result = query.getSingleResult();return Long.parseLong(StringUtils.valueOf(result));}private FleaJPAQuery initQuery(String name, Integer sex, Integer minAge, Integer maxAge, Class<?> result) throws DaoException{FleaJPAQuery query = getQuery(result);// 拼接 查询条件// 根据姓名 模糊查询, attrName 为 实体类 成员变量名,并非表字段名if (StringUtils.isNotEmpty(name)) {query.like("stuName", name);}// 查询性别if (ObjectUtils.isNotEmpty(sex)) {query.equal("stuSex", sex);}// 查询年龄范围if (ObjectUtils.isNotEmpty(minAge)) {// 大于等于query.ge("stuAge", minAge);}if (ObjectUtils.isNotEmpty(maxAge)) {// 小于等于query.le("stuAge", maxAge);}return query;}
}

6. 学生SV层接口

IStudentSV 继承抽象Flea JPA SV层接口,并定义两个方法,分别获取学生信息列表(分页)和学生总数。

/*** <p> 学生SV层接口定义 </p>** @author huazie* @version 1.0.0* @since 1.0.0*/
public interface IStudentSV extends IAbstractFleaJPASV<Student> {/*** <p> 学生信息列表 (分页) </p>** @param name      学生姓名,可以模糊查询* @param sex       性别* @param minAge    最小年龄* @param maxAge    最大年龄* @param pageNum   查询页* @param pageCount 每页总数* @return 学生信息列表* @throws DaoException 数据操作层异常* @since 1.0.0*/List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException;/*** <p> 学生总数 </p>** @param name   学生姓名,可以模糊查询* @param sex    性别* @param minAge 最小年龄* @param maxAge 最大年龄* @return 学生总数* @throws DaoException 数据操作层异常* @since 1.0.0*/long getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException;}

7. 学生SV层实现

StudentSVImpl 继承抽象Flea JPA SV层实现类,并实现了上述学生SV层接口的两个自定义方法。具体实现参见如下代码:

/*** <p> 学生SV层实现类 </p>*  * @author huazie* @version 1.0.0* @since 1.0.0*/
@Service("studentSV")
public class StudentSVImpl extends AbstractFleaJPASVImpl<Student> implements IStudentSV {// 注入学生DAO层实现类@Autowired@Qualifier("studentDAO") private IStudentDAO studentDao; @Overridepublic List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException {return studentDao.getStudentList(name, sex, minAge, maxAge, pageNum, pageCount);}@Overridepublic long getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException {return studentDao.getStudentCount(name, sex, minAge, maxAge);}// 可参见AbstractFleaJPASVImpl里的实现@Overrideprotected IAbstractFleaJPADAO<Student> getDAO() {return studentDao;}
}

8. JPA接入自测

  • 新增学生信息
 private ApplicationContext applicationContext;@Beforepublic void init() {applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");LOGGER.debug("ApplicationContext={}", applicationContext);}@Testpublic void testInsertStudent() {try {IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV");Student student = new Student();student.setStuName("张三");student.setStuAge(18);student.setStuSex(1);student.setStuState(1);studentSV.save(student);student = new Student();student.setStuName("李四");student.setStuAge(19);student.setStuSex(1);student.setStuState(1);studentSV.save(student);student = new Student();student.setStuName("王二麻子");student.setStuAge(20);student.setStuSex(1);student.setStuState(1);studentSV.save(student);} catch (Exception e) {LOGGER.error("Exception : ", e);}}

执行结果:

  • 更新学生信息
     @Testpublic void testStudentUpdate() {try {IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV");// 根据主键查询学生信息Student student = studentSV.query(3L);LOGGER.debug("Before : {}", student);student.setStuName("王三麻子");student.setStuAge(19);// 更新学生信息studentSV.update(student);// 最后再根据主键查询学生信息student = studentSV.query(3L);LOGGER.debug("After : {}", student);} catch (Exception e) {LOGGER.error("Exception : ", e);}}

运行结果:

  • 删除学生信息
    @Testpublic void testStudentDelete() {try {IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV");// 根据主键查询学生信息Student student = studentSV.query(3L);LOGGER.debug("Before : {}", student);// 删除学生信息(里面会先去将学生实体信息查出来,然后再删除)studentSV.remove(3L);// 最后再根据主键查询学生信息student = studentSV.query(3L);LOGGER.debug("After : {}", student);} catch (Exception e) {LOGGER.error("Exception : ", e);}}

运行结果:

  • 查询学生信息(按条件分页查询)
    表里自行再插入些数据,用于测试查询,查询结果因各自表数据而异;
    目前我表中数据如下:
     @Testpublic void testStudentQueryPage() {try {IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV");List<Student> studentList = studentSV.getStudentList("张三", 1, 18, 20, 1, 5);LOGGER.debug("Student List = {}", studentList);} catch (Exception e) {LOGGER.error("Exception : ", e);}}

运行结果:

  • 查询学生总数(按条件查询)
 @Testpublic void testStudentQueryCount() {try {IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV");long count = studentSV.getStudentCount("张三", 1, 18, 20);LOGGER.debug("Student Count = {}", count);} catch (Exception e) {LOGGER.error("Exception : ", e);}}

运行结果:

看到这里,我们的JPA接入工作已经成功完成,本demo工程可以移步到GitHub查看 flea-jpa-test。
在JPA封装介绍博文中,针对Flea JPA查询对象还存在的一个并发问题,将在后续的博文中介绍。

flea-db使用之JPA接入相关推荐

  1. 看到外卖平台这样改善数据库架构,DBA表示放心了

    本文根据虢国飞老师在dbaplus社群[2019年1月5日数据架构与优化沙龙上海站]现场演讲内容整理而成, 讲师介绍 虢国飞 饿了么数据技术部负责人 从事数据库行业十余年,专注于 MySQL.PGSQ ...

  2. 传输滤波器的选型及使用说明

    文章目录 1 滤波器的主要类型 1.1 低通滤波器(LPF) 1.2 高通滤波器(HPF) 1.3 带通滤波器(BPF) 1.4 带阻滤波器(BRF) 2 传输滤波器的封装类型 3 传输滤波器的内部结 ...

  3. FLEAPHP框架的数据库操作

    FLEAPHP提供了自动化的crud操作,可以直接调用其save等接口. 但是,不可避免的需要一些复杂的sql语句,这时就可以使用 TableDataGateway.php 提供的findBySql接 ...

  4. FleaPHP 开发指南 - 4. 命名规范和目录结构

    FleaPHP 的命名规则和目录结构初看上去比较复杂,但习惯以后,你会发现这种命名规则带来许多好处.因此像 Zend Framework 也是采用同样的做法. 当然,FleaPHP 对于应用程序的命名 ...

  5. Go基础语法学习总结

    Go基础语法学习总结 一.基础语法 1.常见数据类型 数据类型包括有:布尔类型.字符串类型.数字类型(整型.浮点型.复数等).派生类型(数组类型.slice 切片类型.map 集合类型.struct ...

  6. 淘宝亿级流量架构服务降级,写得太好了!

    什么是服务降级 对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢? 简单来说就是,将一些不太重要的景区项目砍掉,平时 ...

  7. 闲鱼神探——线上问题定位与快速解决

    神探产品定位 线上问题的发生往往会带来两个影响:一是大量的时间投入,二是低效率解决问题导致的用户体验和公司利益的持续受损.因此无论从业务稳定性还是业务的快速开发迭代出发,都需要提高底层效率,提高问题定 ...

  8. springboot 多数据源配置与使用

    多数据源配置 这个是springboot1版本的 spingboot2移步 > springboot2.x jpa接入多数据源 application.properties 配置两个数据库 #数 ...

  9. 架构相关:服务降级思路与方法

    1. 什么是服务降级 如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是 ...

  10. JDBC,JdbcTemplate,JPA傻傻分不清楚

    2019独角兽企业重金招聘Python工程师标准>>> JDBC.JDBCTemplate.MyBatis.Hiberante.Jpa关系概述 JDBC的使用 使用JDBC访问数据库 ...

最新文章

  1. 【Paper】2021_Distributed Consensus Tracking of Networked Agent Systems Under Denial-of-Service Attack
  2. C# ERROR.未能找到程序集“Microsoft.QualityTools.Testing.Fakes”。请检查磁盘上是否存在该程序集。
  3. php把一个数组放在另一个数组的后面,在PHP中的另一个数组之间注入一个数组
  4. Mysql中limit的优化
  5. 如何在openGauss 2.1.0中使用Job?
  6. java hashmap用法_备战金九银十:Java核心技术面试题100+,助你搞定面试官
  7. Mask R-CNN结构细节回顾
  8. suse报:passwd: Module is unknown passwd: password unchanged 或 passwd: Permission denied
  9. zone2021 E-Sneaking
  10. 关于网络下载的记忆碎片
  11. Java项目:基于Jsp实现网上订餐系统
  12. arcpy更换符号系统
  13. 嵌入式商业智能软件Wyn Enterprise正式步入V5.0时代!
  14. 用burpsuit伪造xxf
  15. 外盘国际期货招商:从股票书挑出来的精华
  16. python有限元例题_《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)...
  17. Ninja 构建系统
  18. 【raid数据恢复】光纤存储raid阵列数据恢复案例
  19. 如何将文件夹打包成jar包
  20. Java实现腾讯云COS高级(大文件)上传,不考虑分块

热门文章

  1. 无论是否跳槽——都要时刻关注自身能力提升
  2. AdaBoost算法实例详解
  3. 关于装电脑系统的心得总结
  4. EXCEL学会两个函数你能打败90%的人,countifs和vlookup
  5. 如何给宝宝取一个高雅有内涵的名字
  6. ios13 微信提示音插件_ios13微信提示音如何进行更改
  7. Practical Test Reminders, Character Arrays, C-Strings
  8. Win 10 关闭系统自动更新(解决svchost.exe 占用网络问题,解决svchost.exe不断消耗流量问题)
  9. 拼接字符串并以逗号隔开
  10. 七 微服务网关gateWay和Jwt令牌