JPA是描述对象-关系表的映射关系,将运行期实体对象持久化到数据库中,提出以面向对象方式操作数据库的思想。

Hibernate框架核心思想是ORM-实现自动的关系映射。缺点:由于关联操作提出Hql语法。执行CRUD时产生大量冗余的sql,性能较低

mybatis继承Hibernate优点,使用通用mapper插件 实现JPA的思想操作数据库

通用mapper:

一、配置通用mapper插件

<!-- 通用Mapper插件 -->
<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
<!--主键自增回写方法,默认值MYSQL,详细说明请看文档 -->
<property name="IDENTITY" value="MYSQL" />
<!--通用Mapper接口,多个通用接口用逗号隔开 -->
<property name="mappers" value="com.jt.common.mapper.SysMapper" />
</plugin>

  

二、通过注解的方式将POJO对象与表进行关联,之后可以通过通用Mapper方式进行操作.

详细步骤:实体类上加注解@Table(name="表名"),id属性加@Id标识主键信息,如果是自增则标识@GeneratedValue(strategy=GenerationType.IDENTITY)

三、通用mapper的流程

1、从serviceImpl实现类里面读取到调用的mapper的方法

2、通过反射获取找到该mapper类

3、获取当前mapper的父级接口,并判断该父级接口是不是泛型

4、从泛型中获取泛型的类型是哪个类

5、找到该类,并查看该类上面的注解,读取注解信息,获取name属性对应的数据库表名

6、编写sql实现数据查询

 public SqlNode TestFindCount(MappedStatement ms){
try {
//1.获取客户端调用的方法 com.jt.manage.mapper.ItemMapper.findTextCount()
String methodPath = ms.getId(); //2.获取ItemMapper的字符串
String targetPath = methodPath.substring(0, methodPath.lastIndexOf(".")); //3.获取ItemMapper对象
Class<?> targetClass = Class.forName(targetPath); //4.获取ItemMapper的父级接口 由于接口是可以多继承的
Type[] types = targetClass.getGenericInterfaces(); //5.获取SysMapper
Type targetType = types[0]; //判断该类型是否为泛型 SysMapper<Item>
if(targetType instanceof ParameterizedType){
//表示当前接口是一个泛型,并且获取泛型参数
ParameterizedType parameterizedType = (ParameterizedType) targetType; //SysMapper<T,V,K> 获取泛型的全部参数
Type[] supers = parameterizedType.getActualTypeArguments(); //表示成功获取第一个参数
Class<?> targetMethodClass = (Class<?>) supers[0]; //判断Class不能为空
if(targetMethodClass !=null){ //判断该类中是否含有注解
if(targetMethodClass.isAnnotationPresent(Table.class)){
//获取目标对象的注解
Table table = targetMethodClass.getAnnotation(Table.class); //获取表名
String tableName = table.name(); //定义查询sql语句
String sql = "select count(*) from "+tableName; //定义sqlNode对象
SqlNode sqlNode = new StaticTextSqlNode(sql); return sqlNode;
}
}
} } catch (ClassNotFoundException e) { e.printStackTrace();
}
return null;
}

  

说明:

targetClass.getGenericInterfaces() 表示获取接口的父级类型

java.lang.reflect.ParameterizedType; 泛型类型的接口

java.lang.reflect.Type;  接口的超类Type

JPA、Hibernate框架、通用mapper之间的关系及通用mapper的具体实现的更多相关文章

  1. Hibernate框架之双向多对多关系映射

    昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...

  2. 五、hibernate表与表之间的关系(一对多关系)

    数据库表与表之间的关系 一对多:一个学校可以有多个学生,一个学生只能有一个学校 多对多:一个学生可以有多个老师,一个老师可以教多个学生 一对一:一个人只能有一个身份证号,一个身份证号只能找到一个人 一 ...

  3. Hibernate框架学习之注解配置关系映射

         上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下: 单向的一 ...

  4. 六、hibernate表与表之间的关系(多对多关系)

    多对多关系 创建实体类和对应映射文件 Student.java package com.qf.entity; import java.util.HashSet; import java.util.Se ...

  5. 使用spring jpa hibernate框架时报错:javax.validation.UnexpectedTypeException: HV000030

    错误信息: [#%&*^]20190521121942:497.!react:all.,RctJobExecutor-1#D9AA5167921A464CA9DDA14943545426%NA ...

  6. Hibernate框架学习(七)——多对多关系

    一.关系表达 1.表中的表达 2.实体中的表达 3.orm元数据中的表达 在User.hbm.xml中添加: 在Role.hbm.xml中添加(与上相反): 二.操作关联属性 1.保存员工及角色 pu ...

  7. java设计模式、框架、架构、平台之间的关系

        设计模式<框架<架构<平台,从复用角度讲,设计模式是代码级复用.框架是模块级复用.架构是系统级复用.平台是企业应用级复用. 1.设计模式 为什么要先说设计模式?因为设计模式在 ...

  8. VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)

    前面一节中鸡啄米进行了文档.视图和框架的概述,本节主要讲解文档.视图.框架结构中各对象之间的关系. 各个对象之间的关系 文档.视图.框架结构中涉及到的对象主要有:应用程序对象.文档模板对象.文档对象. ...

  9. hibernate框架学习笔记3:API详解

    Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...

随机推荐

  1. hdu1256

    画横线总是一个字符粗,竖线随着总高度每增长6而增加1个字符宽.当总高度从5增加到6时,其竖线宽度从1增长到2.下圈高度不小于上圈高度,但应尽量接近上圈高度,且下圈的内径呈正方形.每画一个"8 ...

  2. 面向对象DAO模式

    DAO模式编写数据访问层代码步骤? 1.  接口 增.删.改.查的方法 方法的返回类型为泛型集合 Int rows=select语句的条数 If(rows>0) 方法的返回类型为泛型集合 If( ...

  3. 从excel表中生成批量SQL,将数据录入到数据库中

    excel表格中有许多数据,需要将数据导入数据库中,又不能一个一个手工录入,可以生成SQL,来批量操作.     1.首先在第二行的H列,插入函数:=CONCATENATE("INSERT ...

  4. 常用类-API文档-Integer

    package IntegerTest;import java.util.Base64.Decoder; public class test01 { /** * 包装类的基本数据类型 * int =& ...

  5. oralce定时任务

    oracle定时任务(dbms_job) author:skate time:2007-09-12 http://publish.it168.com/2006/0311/20060311017002. ...

  6. HYPERSPACE

    Windows中,不管是应用程序还是内核程序,都不能直接访问物理内存,所有非IO指令都只能访问虚拟内存地址,如Mov eax, DWORD PTR[虚拟地址]形式,但是,有时候,我们明明已经知道了某个 ...

  7. ISCSI

    感谢: https://www.cnblogs.com/wuchanming/p/4019660.html

  8. 使用 navicat 导入导出数据库

    1.使用 navicat 导出数据库 2.使用 navicat 导入数据库导入之前需要先建好数据库 3.可以直接使用navicat 到数据传输功能直接将一个数库copy到另一个数据库

  9. hive lock命令的使用

    1.hive锁表命令 hive> lock table t1 exclusive;锁表后不能对表进行操作 2.hive表解锁: hive> unlock table t1; 3.查看被锁的 ...

  10. 让虚拟环境解决python多版本并行

    一.安装篇 1.本文操作系统为CentOS7 依赖包(安装时可能还存在其他依赖包,结合报错进行安装) [root@Corre home]# yum install make build-essenti ...