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. __name__ __doc__ __package__

    __name__只有主程序调用才可以 如果自己的唯一入口被调用 if __name__ == '__main__' : 才执行下面的代码 """ 这个是format的注释 ...

  2. 10ci

  3. js中new函数后带括号和不带括号的区别

    用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Pare ...

  4. windows 10系统在右键中添加管理员打开cmd

    需要修改注册表内容,新建文件,后缀名改为reg,文件中粘贴下边的代码 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory ...

  5. 从SQLServer转储数据到MySQL

    前一段时间,由于项目需要将数据库从SQLServer迁移到MySQL,在网上百度了很久,基本都是通过SQLyog实现的.其实使用平时常用的数据库管理软件Navicat Premium也能做到,并且操作 ...

  6. egret 简单的四方向的a星寻路,在wing中可以直接跑

    /** * main类中加载场景 * 创建游戏场景 * Create a game scene */ private createGameScene() { MtwGame.Instance.init ...

  7. day14 内置函数二

    lamda 语法: 函数名 = lambda 参数: 返回值注意: 1. 函数的参数可以有多个. 多个参数之间⽤逗号隔开 2. 匿名函数不管多复杂. 只能写⼀⾏, 且逻辑结束后直接返回数据 3. 返回 ...

  8. 对接https数据(3des加密)

    private void checkThread() { Urls urls = new Urls(type);//根据唯一识别类型初始化参数,可根据实际情况修改此构造函数 //访问国家平台接口,取出 ...

  9. mysql知识点拾遗梳理

    mysql卸载重装过程: sudo apache2ctl stop sudo apt-get --purge remove mysql-client mysql-server mysql-common ...

  10. mssqlserver超级班助类 带详细用法

    using System; using System.Collections; using System.Collections.Generic; using System.Configuration ...