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. bootstrap modal 监听滚动条事件

    bootstrap modal 里面使用datetimepicker时间控件,滚动时,时间控件并不会隐藏,这是一个小bug,在组里改下,当滚动条滚动时,直接隐藏这个时间控件,$("#alar ...

  2. 给listview加动画,让动画执行结束后再刷新

    问题:当给listview的条目加动画时,例如添加一个条目或者移除一个条目,动画效果会和添加删除条目的逻辑同时进行,因为动画并不是阻塞式的,这样会造成动画还没有结束,条目已经添加或者移除,从而动画作用 ...

  3. 决策树(ID3、C4.5、CART)

    ID3决策树 ID3决策树分类的根据是样本集分类前后的信息增益. 假设我们有一个样本集,里面每个样本都有自己的分类结果. 而信息熵可以理解为:“样本集中分类结果的平均不确定性”,俗称信息的纯度. 即熵 ...

  4. js --"说声爱你不容易"

    <div class="tit"><label>yourName:</label><input type="text" ...

  5. 最大流 USTC1280

    挺有意思的一题,最小路径之后最大流 /************************************************************** 作者:陈新 邮箱:cx2pirate ...

  6. SSM连接数据库自动生成问题

    错误的结果为: 程序里面写的sql语句放在数据库里面去查询能查询到数据,但是程序里面查询时候,返回的结果为null 记录一下 我出现的原因是: 数据库的字段  account_id    accoun ...

  7. 开源代码chat_master分析

  8. git clone 带用户名密码

    git使用用户名密码clone的方式: git clone http://username:password@remote eg: username:  abc@qq.com, pwd: test, ...

  9. Oracle学习DaySix(PL/SQL续)

    一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...

  10. windows7 下jdk1.8 改为 1.7过程,及环境变量配置;

    一. 安装完成后 当然是配置环境变量: JAVA_HOME 是我们以后用到jdk所在位置的内容时为了方便,给jdk起的名字,也是java程序约定的变量名,如果没有,当你在cmd 输入 java  ja ...