上一篇文章:《Mybatis基本知識十八:Mybatis註解式開發-多表註解式開發》
若文中有紕漏,請多多指正!!!
1.前言
前面講解了單表、多表的註解式開發,本章節主要講解Mybatis通過註解的方式實現動態sql。
動態sql除了支持xml方式以外,還支持使用純註解的方式,與動態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),可以自己動手調試。
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);}
注意:
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