Mapper簡介及其xml文件中的字段說明

什麼是通用mapper?

通用mapper 可以極大的方便我們開發人員進行ORM,提供極其方便的單表CRUD。
那什麼又是通用mapper,簡單說,它就是個輔助mybatis極簡單表開發的組件。

它不是爲了替代mybatis,而是讓mybatis的開發更方便。

我們可以按照自己的需要選擇通用方法,還能很方便的開發自己的通用方法。

爲什麼要用通用mapper?

原生Mybatis的痛點

1、mapper.xml文件裏有大量的sql,當數據庫表字段變動,配置文件就要修改

2、需要自己實現sql分頁,select * from table where . . . limit 1,3 自己手寫分頁,除了傳參page、pageSize,還需要返回條目總數count。

3、數據庫可移植性差:如果項目更換數據庫,比如oracle-->mysql,mapper.xml中的sql要重新寫,因爲Oracle的PLSQL 和mysql 支持的函數是不同的。

4、生成的代碼量過大。

5、批量操作,批量插入,批量更新,需要自寫。


select元素中有很多屬性(這裏簡單說下常用的):

  • id:命名空間唯一標識,可以被用來引用這條語句
  • parameterType:將會傳入這條語句的參數類的完全限定名
  • resultType:從這條語句要返回的期望類型的類的完全限定名或別名【這裏需要注意下集合類型,集合可以包含的類型,不能是集合本身】
  • resultMap:命名引用外部的resultMap,其名稱要和外部的resultMap元素中的id名稱一致,主要是用於將其結果映射到實體類中指定的對象。
  • 重要:resultType和resultMap不能同時使用。

那我們什麼時候使用resultMap,什麼時候又使用resultType呢?

①當我們去select一張表時,可以使用resultType,這些情況下,MyBatis會在幕後自動創建一個ReusltMap,基於屬性名來映射到JavaBean屬性上,所以在使用resultMap時,就必須要寫上resultMap相對應的xml

②爲了方便開發,一般在沒有特別要求的情況下,個人建議可以將column名和property名稱完全寫成一致,若不寫成一致,則colum只需對應數據庫中字段,property只需對應我們實體類中的自定義的字段即可(感覺有點繞,多寫幾次就熟悉了),否則當我們數據庫中字段和實體類中字段有任何一個字段沒有對應上,數據庫就匹配不到,後臺自然會報錯。

③在sql中比如有 andm.id = #{id ,jdbcType=VARCHAR }時,我們就需要標明jdbcType【原因是:當我們映射了一個javabean,MyBatis通常可以自動匹配類型】


通用Mapper和分頁插件代碼如下:

                                      /**
                                           * 編寫通用Mapper的思路和方法
                                           * 1.先獲取調用的方法com.jt.manage.mapper.ItemMapper.findTextCount()
                                           * 2.通過反射先獲取com.jt.manage.mapper.ItemMapper
                                           * 3.獲取當前類的父級接口
                                           * 4.判斷父級接口是不是泛型
                                           
* 5.從泛型中獲取Item對象
                                           
* 6.獲取Item的@Table註解
                                           
* 7.獲取表的名稱
                                           
* 8.編寫sql語句實現數據查詢
                                          */

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<!-- 開啓駝峯自動映射 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- 二級緩存的總開關,被redis替代 -->
		<setting name="cacheEnabled" value="false" />
	</settings>
	<plugins>
		<!-- 分頁插件:com.github.pagehelper爲PageHelper類所在包名 -->
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<!-- 方言 -->
			<property name="dialect" value="mysql" />
			<!-- 該參數默認爲false -->
			<!-- 設置爲true時,使用RowBounds分頁會進行count查詢,查詢數據總條數 -->
			<property name="rowBoundsWithCount" value="true" />
		</plugin>
		
		<!-- 通用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>
	</plugins>
</configuration>

eg:通用Mapper高級案例

package com.epoch.newjiyuan.mapper;

import java.util.List;

import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;

public interface SysMapper<T> {
	
	//該方法是測試方法,不具有通用性 
	@SelectProvider(type=SysMapperProvider.class,method="dynamicSQL")
	int TextFindCount();
	
    /**
     * 根據主鍵ID批量刪除
     * 
     * @param key
     * @return
     */
    @DeleteProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int deleteByIDS(@Param("ids") Object[] key);

    /**
     * 根據實體類不爲null的字段進行查詢,條件全部使用=號and條件
     * 
     * @param record
     * @return
     */
    @SelectProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    List<T> select(T record);

    /**
     * 根據實體類不爲null的字段查詢總數,條件全部使用=號and條件
     * 
     * @param record
     * @return
     */
    @SelectProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int selectCount(T record);

    /**
     * 根據主鍵進行查詢,必須保證結果唯一 單個字段做主鍵時,可以直接寫主鍵的值 聯合主鍵時,key可以是實體類,也可以是Map
     * 
     * @param key
     * @return
     */
    @SelectProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    T selectByPrimaryKey(Object key);

    /**
     * 插入一條數據 支持Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫) 優先使用傳入的參數值,參數值空時,纔會使用序列、UUID,自動增長
     * 
     * @param record
     * @return
     */
    @InsertProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int insert(T record);

    /**
     * 插入一條數據,只插入不爲null的字段,不會影響有默認值的字段 支持Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
     * 優先使用傳入的參數值,參數值空時,纔會使用序列、UUID,自動增長
     * 
     * @param record
     * @return
     */
    @InsertProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int insertSelective(T record);

    /**
     * 根據實體類中字段不爲null的條件進行刪除,條件全部使用=號and條件
     * 
     * @param key
     * @return
     */
    @DeleteProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int delete(T key);

    /**
     * 通過主鍵進行刪除,這裏最多隻會刪除一條數據 單個字段做主鍵時,可以直接寫主鍵的值 聯合主鍵時,key可以是實體類,也可以是Map
     * 
     * @param key
     * @return
     */
    @DeleteProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int deleteByPrimaryKey(Object key);

    /**
     * 根據主鍵進行更新,這裏最多隻會更新一條數據 參數爲實體類
     * 
     * @param record
     * @return
     */
    @UpdateProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int updateByPrimaryKey(T record);

    /**
     * 根據主鍵進行更新 只會更新不是null的數據
     * 
     * @param record
     * @return
     */
    @UpdateProvider(type = SysMapperProvider.class, method = "dynamicSQL")
    int updateByPrimaryKeySelective(T record);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章