Mybatis基本知識十九:註解式開發-動態Sql註解開發

2020-08-28 一隻奮鬥的猿

上一篇文章:《Mybatis基本知識十八:Mybatis註解式開發-多表註解式開發》

若文中有紕漏,請多多指正!!!

1.前言

前面講解了單表、多表的註解式開發,本章節主要講解Mybatis通過註解的方式實現動態sql。

動態sql除了支持xml方式以外,還支持使用純註解的方式,與動態sql相關註解主要有四種:

  • 1.@SelectProvider 動態查詢SQL語句對應註解
  • 2.@InsertProvider 動態插入SQL語句對應註解
  • 3.@UpdateProvider 動態修改SQL語句對應註解
  • 4.@DeleteProvider 動態刪除SQL語句對應註解

這四個註解都有以下兩個屬性:

  • type:用於指定獲取SQL的類名;
  • method:用於指定獲取執行SQL的方法。

下面將以單表操作分別講解使用案例。

2.表數據及映射實體

/**商品信息表*/create table productinfo( id int primary key auto_increment, --主鍵 proName varchar(50),--商品名稱 proNo varchar(50), --商品編號 proDescription varchar(200),--商品描述 proAmount decimal(10,2)--價格);/**商品信息實體*/public class ProductInfo { private Integer id;//主鍵 private String proName;//商品名稱 private String proNo;//商品編號 private String proDescription;//商品描述 private BigDecimal proAmount;//價格}

3.註解測試

本測試主要簡單講解動態SQL的實現,案例中未用到的其他方法(MyBatis結構化SQL),可以自己動手調試。

  • DAO接口註解

public interface ProductInfoDao { //保存 @InsertProvider(type=com.mybatis.dao.ProductInfoSQL.class,method=&34;) @Options(useGeneratedKeys=true,keyColumn=&34;,keyProperty=&34;) void saveProductInfo(ProductInfo info); //查詢 @SelectProvider(type=com.mybatis.dao.ProductInfoSQL.class,method=&34;) List<ProductInfo> findProductInfo(ProductInfo productInfo); //更新 @UpdateProvider(type=com.mybatis.dao.ProductInfoSQL.class,method=&34;) void updatePro(ProductInfo productInfo); //刪除 @DeleteProvider(type=com.mybatis.dao.ProductInfoSQL.class,method=&34;) void deleteProductInfo(ProductInfo productInfo);}

  • SQL獲取

注意:

1.方法的定義必須定義成public。

2.示例中獲取SQL的方法為結構化SQL,也就是new SQL(){{}}.toString()模式,其中的INSERT_INTO、VALUES等都是MyBatis中已經定義好的方法。

3.結構化SQL只是獲取SQL的一種形式,當然也可以自己利用字符串拼接的形式進行sql片段拼接。比如( String sql =&34;;sql+=&34;)。

public class ProductInfoSQL { //保存 public String saveProductInfo_SQL(final ProductInfo info){ return new SQL(){ { INSERT_INTO(&34;); if(info.getProName()!= null){ VALUES(&34;, &{proName}&34;proNo&34;34;); } if(info.getProDescription()!= null){ VALUES(&34;, &{proDescription}&34;proAmount&34;34;); } } }.toString(); } //查詢 public String findProductInfo_SQL(final ProductInfo info){ return new SQL(){ { SELECT(&34;); FROM(&34;); if(info.getProName()!= null){ WHERE(&{proName}&34;proNo=34;); } if(info.getProDescription()!= null){ WHERE(&{proDescription}&34;proAmount=34;); } } }.toString(); } //更新 public String updatePro_SQL(final ProductInfo info){ return new SQL(){ { UPDATE(&34;); if(info.getProName()!= null){ SET(&{proName}&34;proNo=34;); } if(info.getProDescription()!= null){ SET(&{proDescription}&34;proAmount=34;); } WHERE(&{id}&34;productInfo&34;proName=34;); } if(info.getProNo()!= null){ WHERE(&{proNo}&34;proDescription=34;); } if(info.getProAmount()!= null){ WHERE(&{proAmount}&34;id = 34;); } }.toString(); }}

  • 測試方法

/**保存 */@Testpublic void saveProductInfo(){ ProductInfo info = null; for (int i = 0; i < 2; i++) { info = new ProductInfo(&34;+i+&34;,null,&34;+i+&34;,BigDecimal.valueOf(i)); System.out.println(info); dao.saveProductInfo(info); System.out.println(info); } sqlSession.commit();}/** 查詢 */@Testpublic void findProductInfo(){ list = dao.findProductInfo(new ProductInfo(null,null,null,new BigDecimal(19)));}/**更新 */@Testpublic void updateProductInfo(){ dao.updatePro(new ProductInfo(23,&34;,&34;,&34;,new BigDecimal(23)));}/**刪除 */@Testpublic void deleteProductInfo(){ ProductInfo productInfo = new ProductInfo(); productInfo.setId(23); dao.deleteProductInfo(productInfo);}


4.動態SQL的另一種實現-將SQL腳本化(也就是xml拼寫)

所謂的腳本化,其實就是利用一對<script>標籤將mapper配置中的SQL移植到<script>標籤內即可。但需要注意特殊字符的轉義。其次如果表過多的話,結構冗餘、可讀性和維護性太差。

例:mapper配置

<select id=&34; resultType=&34;> select * from productinfo where 1=1 <if test=&39;&34;><!-- 商品名稱不為空 --> and proName = 34;proAmount > 10&{proAmount} </if></select>

轉化成 腳本化SQL配置

//腳本化SQL@Select({&34;, &34;, &34;proName != null and proName != &39;\&34;, &{proName}&34; </if> &34; <if test=\&34;> &34; and proAmount > 34;, &34;, &34;})List<ProductInfo> findProductInfo_SCRIPT(ProductInfo productInfo);

5.練習下載

連結:https://pan.baidu.com/s/1GL6OQFla5BoIofS0DSeh-A 提取碼:2pna

6.結束語

Mybatis基本知識到這裡就結束了,關於Mybatis的自動化工具MyBatis Generator 的使用,大家可以自行查閱資料閱讀學習,自己也保存了網上的一份資料,大家可以下載參考。後面將會為大家介紹Spring的基本知識。

MyBatis Generator資料:

連結:https://pan.baidu.com/s/1KekMh3xyal01dLVesgZI4Q 提取碼:jn35

相關焦點

  • Mybatis基本知識十八:Mybatis註解式開發-多表註解式開發
    上一篇文章:《Mybatis基本知識十七:Mybatis註解式開發-單表註解式開發》若文中有紕漏,請多多指正!!!1.前言上一章節主要是MyBatis註解的一個入門案例,在實際開發中關聯關係查詢是在經常不過的事情,本章節主要講解演示在關聯關係查詢時,應該怎樣使用MyBatis進行註解開發,本章節主要講解內容包括:
  • Mybatis基本知識十七:Mybatis註解式開發-單表註解式開發
    上一篇文章:《Mybatis基本知識十六:查詢緩存之第三方查詢緩存》若文中有紕漏,請多多指正!!!1.前言使用Mybatis進行開發,不僅可以使用mapper配置文件進行開發,也可以使用註解的方式。映射文件中無非就是存放著增、刪、改、查的SQL映射標籤,Mybatis註解式開發就是要替換映射文件中的SQL標籤。
  • MyBatis開發,你用 xml 還是註解?
    最近在看公司項目時發現有的項目mybatis是基於註解開發的,而我個人的習慣是基於xml文件開發。對於mybatis註解開發的原理理解不夠,於是翻閱了部分源碼,寫下此文。主要介紹了mybatis開發的兩種形式、三種寫法。還有一點瞎思考,介紹了一處騷代碼、還有一個坑。原創不易,感謝閱讀,感謝關注,感謝點讚,感謝轉發。
  • mybatis開發,你用 xml 還是註解?我 pick xml
    最近在看公司項目時發現有的項目mybatis是基於註解開發的,而我個人的習慣是基於xml文件開發。對於mybatis註解開發的原理理解不夠,於是翻閱了部分源碼,寫下此文。主要介紹了mybatis開發的兩種形式、三種寫法。還有一點瞎思考,介紹了一處騷代碼、還有一個坑。
  • Mybatis第三講 緩存與註解
    ;/>3 </transactionManager>註解名稱 註解作用@Insert 插入 sql , 和 xml insert sql 語法完全一樣@Update 修改 sql , 和 xml update sql 語法完全一樣@Delete 刪除 sql , 和 xml delete sql 語法完全一樣
  • Mybatis 中xml和註解映射,原來如此簡單
    在實際開發中,這種常見是在所難免。我們可以使用下面的這種方式解決。註解方式九個頂級映射元素對應註解:其他部分註解是配合九個註解進行使用的。select註解把本地的UserMapper.xml刪掉,然後改一下mybatis-config.xml,把其中的UserMapper.xml給注釋掉。
  • Mybatis中mapper相關註解解析類詳解
    接著上一篇通過掃描接口添加mapper的方法會創建MapperAnnotationBuilder並執行parse方法,具體源碼如下圖:MapperAnnotationBuilder關鍵屬性說明:statementAnnotationTypes:靜態屬性,存有各種sql對於在mybatis
  • 開發MyBatis自定義Interceptor攔截器的使用
    開發MyBatis自定義Interceptor攔截器的使用一、使用背景 筆者前幾天分享的在Spring Cloud架構中,關於數據權限的處理。筆者在團隊中採用的就是通過MyBatis攔截器,攔截sql語句,動態組裝sql來完成添加數據權限的配置,本文筆者分享MyBatis自定義Interceptor的使用。
  • mybatis-plus思維導圖,讓mybatis-plus不再難懂
    MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成資料庫中的記錄。但mybatis有個讓我比較頭疼的一個問題是sql工作量很大,尤其是欄位多的時候。
  • MyBatis:緩存,延遲加載,註解應用
    注意:因為 MyBatis 的二級緩存會存在髒讀問題,所以實際開發中會使用第三方的緩存技術 Redis 解決問題。>這幾年來註解開發越來越流行,MyBatis 也可以使用註解開發方式,這樣我們就可以減少編寫 Mapper 映射文件了。
  • Mybatis第四講 插件開發
    3.1.4 Mybatis 開發流程1、實現 Interceptor 接口2、使用 Interceptors 註解完成插件聲明public class MyFirstInterceptor implements Interceptor{ // 攔截指定對象方法 public Object intercept
  • springboot使用mybatis插件動態修改sql
    來源 | urlify.cn/3mMf6r一、關於mybatismybatis很大的一個功能就是解析mapper.xml文件,按照規則解析sql,並交由資料庫驅動最終執行sql,然後對結果集進行處理二、先說一下我們要做的事情:在sql執行前對sql進行動態修改,
  • 小學妹問:Mybatis常見註解有哪些?
    當下,註解非常流行,以前很長篇的代碼,現在基本上一個註解就能搞定。那,在Mybatis中又有哪些註解呢?Mybatis中的註解基本上都在org.apache.ibatis.annotations目錄下:@MapperScan該註解存在著爭議,但不可否認的是這個註解確實是Mybatis的註解,是為了集成Spring而寫的註解。
  • 使用mybatis-plus必須掌握的基本技能,自定義SQL和分頁查詢
    1 創建項目先創建一個集成了mybatis-plus的spring boot項目。參考小編的另一篇文章【2 自定義SQLMybatis-plus自帶的條件構造器雖然很強大,在項目實戰的時候,各種複雜的應用場景,你肯定避免不了要寫稍微複雜一點的sql語句,又或者一些朋友習慣通過寫sql來操作數據,那麼小編來說說mybatis-puls是怎麼自定義sql語句。
  • 從零開始學SpringBoot之MyBatis-註解
    看到直接支付的集成,結果是快速開發模式,SQL是在類中編寫的,想看看配置模式之神創建一個嗎?」粉絲需要,這才是真正的需要。好吧,胡說太多了,不好,不好。讓我們直說重點。本節概述:(1) 關於mybatis(2) 註解思想(3) 新建項目並添加依賴項包(4) 創建啟動類App.java(5) 編寫實體類演示(6) 寫映射接口DemoMapper(7) 編寫服務類DemoService(8) 寫控制類DemoController(9) 配置資料庫連接池(10) 測試讓我們來看看這個部分:(1) 關於mybatis
  • 手擼rpc框架,並基於spring進行二次註解開發
    實現包的接口,供客戶端遠程調用(像上面示例一樣,只要使用@RpcServiceImpl註解即可)。動態代理是spring框架的一大基石,掌握理解對開發與面試非常重要,可以參考兩萬字吐血總結,代理模式及手寫實現動態代理(aop原理,基於jdk動態代理)/*** api接口的實際處理者*/public class RpcHandler implements
  • spring boot項目集成mybatis-plus之常用註解之條件構造器二
    1 創建一個集成了mybatis-plus的項目項目總體工程目錄如下圖,可參考上一篇文章。基於Spring Boot整合mybatis-plus完整詳細版經驗分享一2 常用註解MyBatisPlus提供了一些註解供我們在實體類和表信息出現不對應的時候使用。通過使用註解完成邏輯上匹配。
  • SpringBoot開發常用的註解及作用
    springboot它是spring開源組織下的子項目,主要是用來簡化spring的難度以及不足,節省程式設計師的繁重的配置,為程式設計師開發過程中各種啟動器。springboot的常用註解:1,@SpringBootApplication:該註解是springboot最核心註解,也是組合註解,聲明它就可以讓springboot自動給程序進行必要的配置(簡單的說,開啟組件掃描和自己配置的功能)。
  • 別用註解了!教你用 Springboot 整合Mybatis
    雖然說只用Spring boot也可以開發,但是對於多表多條件分頁查詢,Spring boot就有點力不從心了,所以LZ把Mybatis整合進去,發現這樣工作事半功倍!後悔沒早搭建了!!本文主要是講解下 Springboot 如何整合 MyBatis,這裡使用的是xml配置SQL而不是用註解。
  • Spring boot 基於註解方式配置datasource
    -- 資料庫基本信息配置 --><property name="url"value="${url}" /><property name="username"value="${username}" /><property name="password"value="${password}" /><property