這篇“MySQL動態(tài)SQL拼接怎么實現(xiàn)”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“MySQL動態(tài)SQL拼接怎么實現(xiàn)”文章吧。
創(chuàng)新互聯(lián)建站是專業(yè)的禹州網(wǎng)站建設(shè)公司,禹州接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行禹州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
能夠使用mybatis的標(biāo)簽實現(xiàn)動態(tài)SQL拼接
我們在前邊的學(xué)習(xí)過程中,使用的SQL語句都非常簡單。而在實際業(yè)務(wù)開發(fā)中,我們的SQL語句通常是動態(tài)拼接而成的,比如:條件搜索功能的SQL語句。
# 提供了一個功能:用戶可以在頁面上根據(jù)username、sex、address進(jìn)行搜索
# 用戶輸入的搜索條件:可以是一個條件,也可能是兩個、三個
# 只輸入一個條件:姓名是"王"
SELECT * FROM USER WHERE username LIKE '%王%'
# 只輸入一個條件:性別是“男”
SELECT * FROM USER WHERE sex = '男'
# 輸入兩個條件:姓名“王”,性別“男”
SELECT * FROM USER WHERE username LIKE '%王%' AND sex = '男'
# 輸入三個條件:姓名“王”,性別“男”,地址“北京”
SELECT * FROM USER WHERE username LIKE '%王%' AND sex = '男' AND address LIKE '%北京%';
在Mybatis中,SQL語句是寫在映射配置的XML文件中的。Mybatis提供了一些XML的標(biāo)簽,用來實現(xiàn)動態(tài)SQL的拼接。
常用的標(biāo)簽有:
:用來進(jìn)行判斷,相當(dāng)于Java里的if判斷
:通常和if配合,用來代替SQL語句中的where 1=1
:用來遍歷一個集合,把集合里的內(nèi)容拼接到SQL語句中。例如拼接:in (value1, value2, ...)
:用于定義sql片段,達(dá)到重復(fù)使用的目的
創(chuàng)建java項目,導(dǎo)入jar包;準(zhǔn)備JavaBean
創(chuàng)建映射器接口UserDao
創(chuàng)建映射配置文件UserDao.xml
創(chuàng)建全局配置文件SqlMapConfig.xml
創(chuàng)建日志配置文件log4j.properties
標(biāo)簽:根據(jù)用戶的名稱和性別搜索用戶信息。把搜索條件放到User對象里,傳遞給SQL語句
映射器接口UserDao上加方法
package com.demo.dao;import com.demo.domain.User;import java.util.List;public interface UserDao {
/**
* 根據(jù)username和sex搜索用戶
* @param user 封裝了搜索條件的User對象
* @return 搜索的結(jié)果
*/
List
映射文件UserDao.xml里配置statement
功能測試,在測試類里加測試方法
package com.demo;import com.demo.dao.UserDao;import com.demo.domain.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;public class SqlTest {
private UserDao userDao;
private SqlSession session;
private InputStream is;
/**
* 要求:根據(jù)username和sex搜索用戶
* 搜索條件放到user對象里
*/
@Test
public void testSearch(){
User user = new User();
// user.setUsername("王");
// user.setSex("男");
List
標(biāo)簽在剛剛的練習(xí)的SQL語句中,我們寫了where 1=1
。如果不寫的話,SQL語句會出現(xiàn)語法錯誤。Mybatis提供了一種代替where 1=1
的技術(shù):
標(biāo)簽。
把上一章節(jié)的實現(xiàn)代碼進(jìn)行優(yōu)化,使用
標(biāo)簽代替where 1=1
映射器UserDao的search2方法:已有,不用修改
/**
* 根據(jù)username和sex搜索用戶
* @param user 封裝了搜索條件的User對象
* @return 搜索的結(jié)果
*/List
在映射文件UserDao.xml里修改SQL語句
在測試類里進(jìn)行功能測試:測試方法不需要修改
@Testpublic void testSearch(){
User user = new User();
// user.setUsername("王");
// user.setSex("男");
List
標(biāo)簽foreach標(biāo)簽,通常用于循環(huán)遍歷一個集合,把集合的內(nèi)容拼接到SQL語句中。例如,我們要根據(jù)多個id查詢用戶信息,SQL語句:
select * from user where id = 1 or id = 2 or id = 3;select * from user where id in (1, 2, 3);
假如我們傳參了id的集合,那么在映射文件中,如何遍歷集合拼接SQL語句呢?可以使用foreach
標(biāo)簽實現(xiàn)。
有搜索條件類QueryVO如下:
package com.itheima.domain;public class QueryVO {
private Integer[] ids;
public Integer[] getIds() {
return ids;
}
public void setIds(Integer[] ids) {
this.ids = ids;
}}
在映射器UserDao里加方法
/**
* QueryVO里有一個Integer[] ids
* 要求:根據(jù)ids查詢對應(yīng)的用戶列表
*/List
在映射文件UserDao.xml里配置statement
功能測試
@Test
public void testSearch3(){
QueryVO vo = new QueryVO();
vo.setIds(new Integer[]{41,42,43,44,45});
List
標(biāo)簽在映射文件中,我們發(fā)現(xiàn)有很多SQL片段是重復(fù)的,比如:select * from user
。Mybatis提供了一個
標(biāo)簽,把重復(fù)的SQL片段抽取出來,可以重復(fù)使用。
在映射文件中定義SQL片段:
在映射文件中引用SQL片段:
在查詢用戶的SQL中,需要重復(fù)編寫:select * from user
。把這部分SQL提取成SQL片段以重復(fù)使用
要求:QueryVO里有ids,user對象。根據(jù)條件進(jìn)行搜索
修改QueryVO,增加成員變量user
package com.itheima.domain;/**
* @author liuyp
* @date 2021/09/07
*/public class QueryVO {
private Integer[] ids;
private User user;
//get/set方法……}
在映射器UserDao里加方法
/**
* 動態(tài)SQL拼接的綜合應(yīng)用:if、where、foreach
* 要求:QueryVo里有ids、username、sex值,根據(jù)這些值進(jìn)行搜索
*/
List
在映射文件UserDao.xml里配置statement
在測試類里加測試方法
@Test
public void testSearch4(){
QueryVO vo = new QueryVO();
vo.setIds(new Integer[]{41,42,43,44,45});
// User user = new User();
// user.setUsername("王");
// user.setSex("男");
// vo.setUser(user);
List
以上就是關(guān)于“MySQL動態(tài)SQL拼接怎么實現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。