1. 程式人生 > >SpringBoot整合MyBatis 在不使用xml檔案的情況下如何做if判斷

SpringBoot整合MyBatis 在不使用xml檔案的情況下如何做if判斷

(1)動態語言註解
(2)@Provider使用思路
(3)@SelectProvider小試牛刀
(4)@SelectProvider初露鋒芒
(5)@SelectProvider過關斬將
(6)@InsertProvider小弟不敢當
(7)@UpdateProvider你加我來改
(8)@DeleteProvider不高興就刪

接下來看下具體的內容:

(1)動態語言註解

對於建立動態的查的語言。MyBatis提供了多個註解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,這些都是建立動態語言和讓MyBatis執行這些語言。

(2)@Provider使用思路

      對於MyBatis提供的幾個@Provider,裡面最主要的引數是type,也就是sql類的Calss物件,另外就是對應的方法名,我們看SelectProvider的原始碼:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SelectProvider {
  Class<?> type();
 
  String method();
}

所以要實現動態的SQL查詢,那麼大體的思路就是,編寫一個SqlProvider,比如:DemoSqlProvider,在此方法中返回一條SQL語句即可。然後在Mapper類中使用@SelectProvider註解,指定provider類和對應的SQL方法。

      接下來我們來解決上一篇部落格的問題:

問題:有一個表中有id,name,email等欄位,有這麼一個查詢要求:我們希望的是如果name不為null的話,那麼就當做條件,否則就不要當做條件;如果email不為null,那麼就當做條件,否則不當做條件。

      接下里看看怎麼使用@SelectProvider。

(3)@SelectProvider小試牛刀

      我們先編寫一個DemoSqlProvider,程式碼如下:


package com.kfit.demo.mapper;
 
import com.kfit.demo.bean.Demo;
 
public class DemoSqlProvider {
   
    /**
     * 查詢語句.
     * @param demo
     * @return
     */
    public String select5(Demo demo){
       StringBuffer sql = new StringBuffer("select *from demo where 1=1 ");
       if(demo.getName() != null){
           sql.append(" and name=#{name}");
       }
       if(demo.getEmail() != null){
           sql.append(" and email=#{email}");
       }
       return sql.toString();
    }
   
}

 在DemoMapper中加入查詢方法:

@SelectProvider(type=DemoSqlProvider.class,method="select5")
public List<Demo> select5(Demo demo);

 這裡使用@SelectProvider,不是@Select了。

SELECT * from Demo WHERE 1=1
SELECT * from Demo WHERE 1=1 and name=?

訪問3:http://127.0.0.1:8080/select4?name=王五&[email protected]會返回name=王五並且[email protected]的資料,動態SQL是:

SELECT * from Demo WHERE 1=1 and name=? and email=?

(4)@SelectProvider初露鋒芒

      上面的程式碼直接純SQL編寫了,可讀性還是相對差了點,MyBatis提供了SQL類(org.apache.ibatis.jdbc.SQL),可以讓程式碼看起來更有意義。

      在DemoSqlProvider中加入方法:

/**
     * 查詢語句.使用SQL
     * @param demo
     * @return
     */
    public String select6(final Demo demo){
       return new SQL(){{
           SELECT("id,name,email");
           FROM("demo");
           if(demo.getName() != null){
              WHERE("name=#{name}");
           }
           if(demo.getEmail() != null){
              WHERE("email=#{email}");
           }
       }}.toString();
    }

在DempMapper中加入程式碼:

@SelectProvider(type=DemoSqlProvider.class,method="select6")
    public List<Demo> select6(Demo demo);

(5)@SelectProvider過關斬將

      原以為萬事大吉了,開心的不行,於是乎,信手拈來句程式碼,在查詢程式碼加入:

PageHelper.startPage(1, 2);整個程式碼如下:

@RequestMapping("/select6")
    public List<Demo> select6(Demo demo){
       PageHelper.startPage(1, 2);
       return demoService.select6(demo);
    }
nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'providerTakesParameterObject' in 'class org.apache.ibatis.builder.annotation.ProviderSqlSource'

 出現以上問題,是由於我們使用的PageHelper版本導致的,升級版本即可。

原先的版本為:

<dependency>  
    <groupId>com.github.pagehelper</groupId>  
    <artifactId>pagehelper</artifactId>  
<version>4.1.0</version>  
</dependency>
<dependency>  
    <groupId>com.github.pagehelper</groupId>  
    <artifactId>pagehelper</artifactId>  
<version>4.1.0</version>  
</dependency>  

升級為:

<dependency>  
    <groupId>com.github.pagehelper</groupId>  
    <artifactId>pagehelper</artifactId>  
<version>4.2.1</version>  
</dependency>  
<dependency>  
    <groupId>com.github.pagehelper</groupId>  
    <artifactId>pagehelper</artifactId>  
<version>4.2.1</version>  
</dependency> 

(6)@InsertProvider小弟不敢當

      最麻煩的查詢搞定了之後,這個就簡單了,

      在DemoSqlProvider中加入如下程式碼:

/**
     * 查詢語句.使用SQL
     * @param demo
     * @return
     */
    public String save3(final Demo demo){
       return new SQL(){{
           INSERT_INTO("demo");
           //多個寫法.
           INTO_COLUMNS("name","email");
           INTO_VALUES("#{name}","#{email}");
          
           //條件寫法.
//         if(demo.getName() != null){
//            VALUES("name","#{name}");
//         }
//         if(demo.getEmail() != null){
//            VALUES("email","#{email}");
//         }
          
       }}.toString();
    }

在DemoMapper中加入如下程式碼:

@InsertProvider(type=DemoSqlProvider.class,method="save3")
    @Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true)
    public void save3(Demo demo);

到此搞定。

(7)@UpdateProvider你加我來改

       DemoSqlProvider中的程式碼如下:


/**
     * @param demo
     * @return
     */
    public String update2(final Demo demo){
       return new SQL(){{
           UPDATE("demo");
      
           //條件寫法.
           if(demo.getName() != null){
              SET("name=#{name}");
           }
           if(demo.getEmail() != null){
              SET("email=#{email}");
           }
           WHERE("id=#{id}");
       }}.toString();
    }

在DemoMapper中的程式碼:


@UpdateProvider(type=DemoSqlProvider.class,method="update2")
public int update2(Demo demo);

(8)@DeleteProvider不高興就刪

       DemoSqlProvider程式碼:


/**
     * @param demo
     * @return
     */
    public String delete2(){
       return new SQL(){{
           DELETE_FROM("demo");
           WHERE("id=#{id}");
       }}.toString();
    }

在DemoMapper中的程式碼:

@UpdateProvider(type=DemoSqlProvider.class,method="delete2")
public int delete2(int id);

(初學者記錄學習中的總結,希望各位大牛進行點評指正,謝謝大家!)

相關推薦

SpringBoot整合Mybatis(使用配置檔案方式)

1.首先看下一下maven的依賴,主要是mybatis依賴,mysql驅動,以及之後測試使用的依賴spring-boot-test <!--mybatis依賴包--> <dependency> <groupId>

springboot整合mybatis(Mapper.xml和註解兩種方式)

本部落格中介紹了兩種整合方式,分別是xml配置和註解 依賴 <dependency>             <groupId>mysql</groupId>             <artifactId>mysql-co

SpringBoot整合MyBatis使用xml檔案情況如何if判斷

(1)動態語言註解 (2)@Provider使用思路 (3)@SelectProvider小試牛刀 (4)@SelectProvider初露鋒芒 (5)@SelectProvider過關斬將 (6)@InsertProvider小弟不敢當 (7)@UpdateProvider

springboot 整合mybatis,mapper介面和對應的mapper對映檔案放在同一個包的配置

一、springboot整合mybatis後,需要進行幾個步驟的配置: 1、mapper包下的mapper介面都需要新增@Mapper註解。 2、啟動類上面新增@MapperScan(basepackages={"com.web.mapper"})註解。 3、需要在po

刪除資料情況轉換檔案系統型別,從FAT32轉到NTFS

轉換檔案系統型別,從FAT32轉到NTFS(不刪除資料) 如果是從NTFS轉FAT32就不能用下面的方法,需要備份你的資料之後再格式化 最近下完電影想把電影傳到U盤裡,結果顯示檔案過大不能傳,然後看了看我的U盤屬性是FAT32,FAT32是不支援4G以上的檔案傳輸的,所以需要改變

Springboot 整合mybatis可能出現的小問題之selectByPrimaryKey(id)查詢出資料

作為一個菜鳥,在學習Springboot的時候是一頭霧水,出現問題由於不知道原理所以解決起來很是坎坷,在這裡記錄下小小的經驗。 出現問題如下:     通過指定id查詢資料,發現結果總是查不到,debug除錯發現程式沒有任何異常,就是查詢到的user為空,資料庫連線也

idea中springboot整合mybatis到mapper介面的原因及解決方法

整合網上以及開發時遇到的錯誤原因總結:路徑不對 1.maper.xml名稱空間不對應mapper介面的位置 2.xml方法名未對應上mappe接口裡面的方法名 、 3.mapper檔案未注入成功,也就是位置掃描錯誤。 4.如果都檢查完了,一定要檢查編譯後的檔

SpringBoot整合MyBatis(註解版+XML配置版)

一.公共部分 1.建立SpringBoot專案,加入依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs

Springboot整合mybatis、以及xml配置例項、熱部署

整合mybatis: 引入jar包,這個包是dao+server整合,內涵mybatis生成的xml,及mapper介面和bean物件 引入包後,其包的依賴也會下來,所依賴的jar yml檔案配置連線引數,資料來源如果有引入jar則還可以配置資料來源,myb

SpringBoot整合Mybatis 編譯失敗:找到符號 程式包存在

問題描述:jpa不好用,轉用mybatis,配置多資料來源  但是配置後無法編譯mvn clean install  dao層這些報錯,找不到entity的包    問題解決:罪魁禍首:熱部署的部分 註

mybatisxml檔案中的SQL語句能以分號結尾

在mybatis的sql配置檔案中,如果是單獨的sql語句,就是不是儲存過程,寫的sql語句是不能使用分號做結尾的,不然程式執行的時候會報ora-00911: 無效字元.如: 百度了下,具體的原因是   “Oracle資料庫介面對書寫格式要求非常嚴格,有時候即使多加

springboot整合mybatis-plus(解決引用jar包配置類起作用問題)

新增依賴 <dependency> <groupId>org.springframework.boot</groupId> <

SpringBoot整合MyBatis(iBatis),基於註解和XML兩種方式

工具 IDEA Maven 專案建立 1. 通過IDEA建立SpringBoot專案 2. 結構目錄和JAVA版本選擇 3. 新增MySQL和MyBatis支援 4. 新增Lombok外掛,簡化GET、SET方法 5. WEB支援和啟動類 6. 專

SpringBoot整合Mybatis掃描到Mapper的問題

閒來無事,想學學springboot,開始搭建一個專案,但是一直顯示mapper掃描不到的錯誤: “Exception encountered during context initialization - cancelling refresh attem

MyBatis學習-----解決在"資料表中欄位與自己定義的屬性類的屬性欄位相同“的情況的問題

  在平時的開發中,我們表中的欄位名和表對應實體類的屬性名稱不一定都是完全相同的,下面來演示一下這種情況下的如何解決欄位名與實體類屬性名不相同的衝突。 一、準備演示需要使用的表和資料 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCRE

簡單快速的用SpringBoot整合myBatis(註解+xml

跟著上一篇的節奏我們繼續,SpringBoot整合myBatis的兩種方式:1)註解,2)xml。 首先,我們先來看第一種方式:註解……. 第一步,先引入Springboot整合mybatis,JDBC,mysql的Jar檔案..

springboot整合mybatis,freemarker

ons ren mac har rom cee www -name prefix springboot 整合mybaits,,freemarker pom.xml文件 <?xml version="1.0" encoding="UTF-8"?><pr

公司流程規範的情況,如何做好測試工作?(轉http://www.51testing.com/html/11/15160311-3719792.html)

www html 相關 負責人 ron 測試 testin pac div 這對我們來說是個機遇! 首先我要說,公司目前制度不規範,對我們來說是個機遇,絕對是個機遇!遇到這個好機會你還在等什麽?如果說這個公司已經足夠好了,那他還請你過來做什麽?你的能力還足以讓公司有更高的

邊框在2個邊,重疊接觸的情況是梯形。

clas com wid nbsp code http height left border <div class="border"></div> .border{border: 80px solid red;width:

springboot整合mybatis及封裝curd操作-配置文件

enabled () init tps github mys tde oos maven 1 配置文件 application.properties #server server.port=8090 server.address=127.0.0.1 server.ses