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
