MyBatis動態(tài)SQL特性詳解
概述
動態(tài)SQL:SQL語句會隨著用戶輸入或外部條件的變化而變化 。
例如:我們在做多條件查詢的時候,編寫SQL語句的查詢操作,我們并不知道用戶實際操作時會選擇多少條件進行查詢,假如有三個條件(日期,大小,名字)供用戶選擇后查詢,如果用戶只選擇了一個條件(大?。┻M行查詢,那么我們應(yīng)該動態(tài)的進行SQL語句的編寫。
再例如:當(dāng)做信息修改時,可修改信息有 用戶名,密碼,性別,愛好。用戶如果全部修改,這當(dāng)然沒什么好說的。但是如果用戶只修改某些信息,并沒有全部修改。如果我們還用修改全部的那一套SQL語句,那么沒有修改到的信息在SQL語句中對應(yīng)值就會為null。這明顯有問題,所以我們需要使用到動態(tài)SQL。
再再例如:我們做批量刪除,我們在編寫SQL語句時,并不知道用戶實際操作時選擇多少條數(shù)據(jù),所以我們使用SQL語句就可以解決這樣的問題。
動態(tài)多條件查詢
環(huán)境準(zhǔn)備:mybatis環(huán)境正常,完善數(shù)據(jù)表和pojo類。
我們在做動態(tài)多條件時,SQL語句中需要判斷用戶輸入了哪些條件,沒有輸入哪些條件,但是我們不能使用Java的判斷語法,MyBatis對動態(tài)SQL有很強大的支撐,給我們提供了一系列的標(biāo)簽供我們使用。
例如 <if> 、<choose>、<set>、<where>、<foreach>等,如何使用呢?看案例。
現(xiàn)有一張數(shù)據(jù)表,表中有三個字段:用戶名,密碼,賬戶余額。
案例需求:用戶通過用戶名,密碼這兩條件進行模糊查詢,也可以只用單個條件進行查詢,在此演示只通過用戶名中包含"A"為條件進行查詢用戶信息。
數(shù)據(jù)層接口方法
List<User> selectByCondition(User user);
SQL映射文件-SQL語句
<select id="selectByCondition" resultType="User"> select * from user_table <!--需要使用where標(biāo)簽,否則兩個條件為空時,會存在sql語法錯誤 --> <where> <if test="user != null and user != ''"> user like #{user} </if> <if test="password != null and password != null"> and password like #{password} </if> </where> </select>
測試方法
/** * 動態(tài)條件查詢: * 用戶輸入的可能不是全部參數(shù),而是部分參數(shù) * 動態(tài)SQL */ @Test public void ConditionSelectTest() throws IOException { //模擬前端傳入?yún)?shù) String userName = "A"; //String password = "4"; //處理參數(shù)-配置為模糊查詢形式 userName = "%"+ userName + "%"; //password = "%"+ password + "%"; //封裝成對象的形式傳入 User user = new User(); user.setUser(userName); //user.setPassword(password); String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //調(diào)用方法 List<User> users = mapper.selectByCondition(user); users.forEach(System.out::println); }
原始數(shù)據(jù):
執(zhí)行方法:查詢user中存在"A"的記錄信息。
User{user= 'AA ', password= '123456', balance=5500}
User{user='AB', password='123456', balance=3000}
User{user='AD', password=' 132456', balance=2000}
Process finished with exit code 0
動態(tài)修改
案例需求:通過用戶名進行修改密碼或賬戶余額??梢灾皇切薷囊粋€,也可以修改全部。
說明:
當(dāng)前案例,只是對于數(shù)據(jù)層的測試,不做業(yè)務(wù)層和表現(xiàn)層的功能實現(xiàn),所以我們都是通過模擬前端傳入數(shù)據(jù)來進行測試。
數(shù)據(jù)層接口方法
//動態(tài)修改void alterRecordByName(User user);
SQL映射文件-SQL語句
<update id="alterRecordByName"> update user_table <!--set標(biāo)簽 代表的就是set--> <set> <!--if標(biāo)簽 判斷用戶是否輸入,不輸入就不進行修改--> <if test="password != null and password != ''"> password = #{password}, </if> <if test="balance != null "> balance = #{balance} </if> </set> where user = #{user}; </update>
if標(biāo)簽中的test屬性,用于填寫條件判斷。
測試方法
/** * 修改部分-動態(tài)SQL */ @Test public void testAlterCondition() throws IOException { //模擬前端傳入?yún)?shù) String userName = "BB"; //密碼和賬戶余額修改任意,當(dāng)前只修改賬戶余額 //String password = "123456"; int balance = 5000; //封裝成對象的形式傳入,只將賬戶余額進行對象封裝,密碼不變 User user = new User(); user.setUser(userName); // user.setPassword(password); user.setBalance(balance); String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is); //獲取SqlSession對象的時候,openSession空參時:autoCommit = false SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.alterRecordByName(user); System.out.println("修改成功..."); //需要手動提交,或者設(shè)置:openSession(true) sqlSession.commit(); }
原始數(shù)據(jù):
執(zhí)行方法后數(shù)據(jù):成功。
動態(tài)批量刪除
案例需求:根據(jù)傳進來的賬戶余額鎖定用戶,都進行刪除。
數(shù)據(jù)層接口方法
//參數(shù)為數(shù)組,可接收多個值 void deleteByBalances(@Param("balance") int[] balance);
SQL映射文件-SQL語句
<!--批量刪除--> <delete id="deleteByBalances"> delete from user_table where balance in <foreach collection="balance" separator="," item="balance" open="(" close=")" > #{balance} </foreach>; </delete>
foreach標(biāo)簽屬性說明:
//collection:代表遍歷對象
//item:代表每一次獲取的對象
//separator:分隔符,數(shù)組中元素就是,為分隔符
//open,close:代表開始和結(jié)束位置需要填寫的括號()
測試方法
刪除賬戶余額為2000,3000的。
/** * 批量刪除 */ @Test public void testDeletes() throws IOException { //模擬前端傳入?yún)?shù) int[] balances = new int[]{2000,3000}; String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is); //獲取SqlSession對象的時候,openSession空參時:autoCommit = false(默認(rèn)) SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteByBalances(balances); System.out.println("刪除成功---->"); //需要手動提交,或者設(shè)置:openSession(true) sqlSession.commit(); }
原始數(shù)據(jù):
執(zhí)行方法后數(shù)據(jù):
到此這篇關(guān)于MyBatis動態(tài)SQL特性詳解的文章就介紹到這了,更多相關(guān)MyBatis動態(tài)SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot項目中使用OpenAI-Java的示例詳解
Spring?Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了Spring?Boot項目中使用OpenAI-Java的示例詳解,需要的朋友可以參考下2023-04-04Spring Security實現(xiàn)不同接口安全策略方法詳解
這篇文章主要介紹了Spring Security實現(xiàn)不同接口安全策略方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09java.lang.AbstractMethodError: org.apache.xerces.dom.Documen
這篇文章主要介紹了java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion問題解決方法,導(dǎo)致本文問題的原因是缺少一個xerces.jar jar包,需要的朋友可以參考下2015-03-03springboot 異步調(diào)用的實現(xiàn)方法
這篇文章主要介紹了springboot 異步調(diào)用的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04