JPA、Hibernate框架、通用mapper之間的關系及通用mapper的具體實現


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM