1. 程式人生 > >mybatis實現零配置

mybatis實現零配置

基於 com.github.abel533-mapper改造的實現的動態查詢欄位,mapper已經實現了單表的操作不需要寫配置檔案,但是唯一的不足就是查詢的時候不能根據具體的業務區查詢指定的欄位,預設是查詢所有的欄位,這樣在資料訪問量大的情況下效能會跟不上。幾天基於這種物配製的基礎,在原有的基礎上修改了查詢方便實現了根據業務查詢指定的欄位,實現方法很簡單,在執行sql之前把需要查詢的欄位和本地執行緒繫結,然後在正真構造sql的時候用根本的執行緒的資料替換掉預設的所以欄位,具體實現如下:

用自己的介面掩蓋掉預設的介面(大多數是copy,因為預設介面是泛型,所以如果直接繼承會有很多問題需要處理,所以這裡是直接copy整個介面的程式碼,並添加了一個介面)

  1. package com.github.liuzw.mapper.Mapper;  
  2. import java.util.List;  
  3. import org.apache.ibatis.annotations.DeleteProvider;  
  4. import org.apache.ibatis.annotations.InsertProvider;  
  5. import org.apache.ibatis.annotations.Param;  
  6. import org.apache.ibatis.annotations.SelectProvider;  
  7. import org.apache.ibatis.annotations.UpdateProvider;  
  8. /**  
  9.  * 改寫預設的Mapper介面,新增根據id批量刪除介面  
  10.  *   
  11.  * @author good-zhiwei 劉志偉  
  12.  * @data 2016年7月10日 下午12:41:00  
  13.  * @param <T>
  14.  */  
  15. public interface LiuzwMapper<T> {  
  16.     /**  
  17.      * 根據實體類不為null的欄位進行查詢,條件全部使用=號and條件  
  18.      *   
  19.      * @param record  
  20.      * @return  
  21.      */  
  22.     @SelectProvider(type
     = LiuzwMapperProvider.class, method = "dynamicSQL")  
  23.     List<T> select(T record);  
  24.     /**  
  25.      * 根據實體類不為null的欄位查詢總數,條件全部使用=號and條件  
  26.      *   
  27.      * @param record  
  28.      * @return  
  29.      */  
  30.     @SelectProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  31.     int selectCount(T record);  
  32.     /**  
  33.      * 根據主鍵進行查詢,必須保證結果唯一 單個欄位做主鍵時,可以直接寫主鍵的值 聯合主鍵時,key可以是實體類,也可以是Map  
  34.      *   
  35.      * @param key  
  36.      * @return  
  37.      */  
  38.     @SelectProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  39.     T selectByPrimaryKey(Object key);  
  40.     /**  
  41.      * 插入一條資料 支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫) 優先使用傳入的引數值,引數值空時,才會使用序列、UUID,自動增長  
  42.      *   
  43.      * @param record  
  44.      * @return  
  45.      */  
  46.     @InsertProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  47.     int insert(T record);  
  48.     /**  
  49.      * 插入一條資料,只插入不為null的欄位,不會影響有預設值的欄位 支援Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)  
  50.      * 優先使用傳入的引數值,引數值空時,才會使用序列、UUID,自動增長  
  51.      *   
  52.      * @param record  
  53.      * @return  
  54.      */  
  55.     @InsertProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  56.     int insertSelective(T record);  
  57.     /**  
  58.      * 根據實體類中欄位不為null的條件進行刪除,條件全部使用=號and條件  
  59.      *   
  60.      * @param key  
  61.      * @return  
  62.      */  
  63.     @DeleteProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  64.     int delete(T key);  
  65.     /**  
  66.      * 通過主鍵進行刪除,這裡最多隻會刪除一條資料 單個欄位做主鍵時,可以直接寫主鍵的值 聯合主鍵時,key可以是實體類,也可以是Map  
  67.      *   
  68.      * @param key  
  69.      * @return  
  70.      */  
  71.     @DeleteProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  72.     int deleteByPrimaryKey(Object key);  
  73.     /**  
  74.      * 根據主鍵進行更新,這裡最多隻會更新一條資料 引數為實體類  
  75.      *   
  76.      * @param record  
  77.      * @return  
  78.      */  
  79.     @UpdateProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  80.     int updateByPrimaryKey(T record);  
  81.     /**  
  82.      * 根據主鍵進行更新 只會更新不是null的資料  
  83.      *   
  84.      * @param record  
  85.      * @return  
  86.      */  
  87.     @UpdateProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  88.     int updateByPrimaryKeySelective(T record);  
  89.     /**  
  90.      * 根據主鍵ID批量刪除  
  91.      *   
  92.      * @param key  
  93.      * @return  
  94.      */  
  95.     @DeleteProvider(type = LiuzwMapperProvider.class, method = "dynamicSQL")  
  96.     int deleteByIDS(@Param("ids") Object[] key);  
  97. }  
介面寫好以後就需要實現類,大部分是沿用預設的方法,從寫了三個查詢方法,添加了一個批量刪除方法(上面介面中新增了一個批量刪除的介面)
  1. package com.github.liuzw.mapper.Mapper;  
  2. import static org.apache.ibatis.jdbc.SqlBuilder.BEGIN;  
  3. import static org.apache.ibatis.jdbc.SqlBuilder.DELETE_FROM;  
  4. import static org.apache.ibatis.jdbc.SqlBuilder.SQL;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import java.util.Set;  
  8. import org.apache.ibatis.builder.StaticSqlSource;  
  9. import org.apache.ibatis.jdbc.SQL;  
  10. import org.apache.ibatis.mapping.MappedStatement;  
  11. import org.apache.ibatis.mapping.ParameterMapping;  
  12. import org.apache.ibatis.scripting.xmltags.ForEachSqlNode;  
  13. import org.apache.ibatis.scripting.xmltags.IfSqlNode;  
  14. import org.apache.ibatis.scripting.xmltags.MixedSqlNode;  
  15. import org.apache.ibatis.scripting.xmltags.SqlNode;  
  16. import org.apache.ibatis.scripting.xmltags.StaticTextSqlNode;  
  17. import org.apache.ibatis.scripting.xmltags.TextSqlNode;  
  18. import org.apache.ibatis.scripting.xmltags.WhereSqlNode;  
  19. import com.github.abel533.mapper.MapperProvider;  
  20. import com.github.abel533.mapperhelper.EntityHelper;  
  21. import com.github.abel533.mapperhelper.MapperHelper;  
  22. import com.github.liuzw.threadlocal.DynamicColumnThreadLocal;  
  23. /**  
  24.  * 改寫預設的MapperProvider,新增根據id批量刪除方法,支援動態欄位的查詢  
  25.  *   
  26.  * @author good-zhiwei 劉志偉  
  27.  * @data 2016年7月10日 下午12:41:40  
  28.  */  
  29. public class LiuzwMapperProvider extends MapperProvider {  
  30.     public LiuzwMapperProvider(Class<?> mapperClass, MapperHelper mapperHelper) {  
  31.         super(mapperClass, mapperHelper);  
  32.         // TODO Auto-generated constructor stub  
  33.     }  
  34.     /**  
  35.      * 根據本地執行緒獲取需要查詢的欄位  
  36. 相關推薦

    mybatis實現配置

    基於 com.github.abel533-mapper改造的實現的動態查詢欄位,mapper已經實現了單表的操作不需要寫配置檔案,但是唯一的不足就是查詢的時候不能根據具體的業務區查詢指定的欄位,預設是查詢所有的欄位,這樣在資料訪問量大的情況下效能會跟不上。幾天基於這

    spring3和struts2整合實現配置的教程

    我們目前做的專案使用的就是這種方式,今天比較有空,就寫了個demo演示下這個功能。所謂的零配置其實並不是沒有配置檔案,只是約定大於配置而已,約定做好了,整個專案都會清晰明瞭很多。詳細的約定在struts2-spring-plugin-xxx.jar裡面的struts-

    struts2 利用struts2-convention-plugin外掛實現配置

    struts2使用convention-plugin外掛可以減少,xml檔案的配置。 <!-- 設定各個ACTION預設繼承哪個package --> <constant name="struts.convention.default.parent.

    mysql+spring+mybatis實現資料庫讀寫分離[程式碼配置]

    場景:一個讀資料來源一個讀寫資料來源。 原理:藉助spring的【org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource】這個抽象類實現,看名字可以瞭解到是一個路由資料來源的東西,這個類中有一個方法

    spring3配置註解實現Bean定義(包括JSR-250、JSR-330)

     註解實現Bean定義  概述 前邊介紹的Bean定義全是基於XML方式定義配置元資料,且在【12.2註解實現Bean依賴注入】一節中介紹了通過註解來減少配置數量,但並沒有完全消除在XML配置檔案中的Bean定義,因此有沒有方式完全消除XML配置Be

    springboot+mybatis多資料來源配置實現

    簡單實現了根據註解動態切換資料來源,支援同一個資料庫的宣告式事務,但不支援JTA事務。處理流程: 根據配置的資料來源資訊,建立動態資料來源bean 利用DataSourceAspect處理@DataSource註解,設定當前要使用的具體資料來源 pom.xm

    Spring Boot + Mybatis 多資料來源配置實現讀寫分離

    本文來自網易雲社群作者:王超應用場景:專案中有一些報表統計與查詢功能,對資料實時性要求不高,因此考慮對報表的統計與查詢去操作slave db,減少對master的壓力。根據網上多份資料測試發現總是使用master資料來源,無法切換到slave,經過多次除錯修改現已完美通過,現

    使用SpringAOP實現事務(聲明式事務管理、配置

    特定 管理器 表示 可能 事務 常量 ger 事務傳播 不可 前言: 聲明式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式

    Spring Boot整合MyBatis實現多資料來源配置

    Spring Boot最大的特點是簡化開發,因此使用Java Config實現去xml配置,本文將使用這種方式完成對SpringBoot+Mybatis的多資料來源配置。同時,會用到阿里巴巴的開源資料來源Druid。依賴:<?xml version="1.0" encoding="UTF-8"?>

    springboot druid mybatis 通過註解配置實現配置即可使用

    application-dev.yml檔案內容: spring: datasource: enabled: true url: jdbc:mysql://127.0.0.1:3306/lt-iot?autoReconnect=true&useUnicode=true&am

    Spring+MyBatis多資料來源配置實現

    最近用到了MyBatis配置多資料來源,原以為簡單配置下就行了,實際操作後發現還是要費些事的,這裡記錄下,以作備忘 不多廢話,直接上程式碼,後面會有簡單的實現介紹 jdbc和log4j的配置 #定義輸出格式 ConversionPattern=

    Spring+MyBatis多資料來源配置實現(mysql和sqlserver資料庫)

    最近用到了MyBatis配置多資料來源,原以為簡單配置下就行了,實際操作後發現還是要費些事的,這裡記錄下,以作備忘 不多廢話,直接上程式碼,後面會有簡單的實現介紹 jdbc和log4j的配置 #定義輸出格式 ConversionPattern=%d %-5p [%t] %c - %m%n log4j.

    SSM配置Mybatis實現自動獲取插入資料的自增id至目標物件中

    Mybatis配置: <!-- 設定: 將插入資料的主鍵返回並新增到Contents物件中--> <insert id="insert" parameterType="com.c

    Springboot+Mybatis實現多資料來源配置

    1、預設application.properties配置檔案增加多資料來源配置,也可另行自己增加新的配置檔案獨立維護 ## master資料來源[主端業務]:用於mybatis自動程式碼生成呼叫及spring對資料庫的系列操作 master.datasource.url=j

    Spring+SpringMVC+Mybatis 利用AOP自定義註解實現配置

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5

    Spring+Mybatis多資料來源配置(四)——AbstractRoutingDataSource實現資料來源動態切換

    有時候需要在程式中動態切換資料來源,那麼這個系列的之前的博文所闡述的方法就不再使用了,總不能通過程式更改config.properties檔案的dataSource的值,然後再重啟web伺服器以便載入applicationContext.xml檔案。這裡講訴的是如何利用Ab

    Mybatis多表查詢之一對一查詢的多種實現-XML配置

            Mybatis 中對於多表查詢提供了非常強大的實現方式,主要是通過resultMap的結果對映對於多表查詢後的返回值進行封裝,讓我們來看一下官網上對於resultMap的解釋:resultMap 元素是 MyBatis 中最重要最強大的元素。它

    Spring+SpringMVc+Mybatis實現數據庫查詢

    java代碼 格式 jdb web.xml配置 set ransac load idle name 大家好,本篇博客小Y將會給大家帶來一篇SSM框架實現數據查詢的Demo,使用的數據庫是Mysql,Server是TomCat.現在的SSM整合非常流行,因為springm

    Spring+SpringMVC+MyBatis深入學習及搭建(三)——MyBatis全局配置文件解析

    保持 nbsp 延遲加載 行為 span 方便 doc ima actor 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有寫到Spring+SpringMVC+MyBatis深入學習及搭建(二)&

    Spring MVC 配置

    只有一個 col 純粹 相同 如果 http 註冊 name 指定 1. pring MVC的核心就是DispatcherServlet類,Spring MVC處理請求的流程如下圖所示: 2. Spring MVC中典型的上下文層次 當我們初始化一個Dispat