mybatis的動態(tài)SQL和模糊查詢實例詳解
現(xiàn)在以一個例子來介紹mybatis的動態(tài)SQL和模糊查詢:通過多條件查詢用戶記錄,條件為姓名模糊匹配,并且年齡在某兩個值之間。
新建表d_user:
create table d_user(
id int primary key auto_increment,
name varchar(10),
age int(3)
);
insert into d_user(name,age) values('Tom',12);
insert into d_user(name,age) values('Bob',13);
insert into d_user(name,age) values('Jack',18);
建表成功:

新建實體類User:
public class User {
private Integer id;
private String name;
private Integer age;
//getters and setters
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public User(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public User() {
super();
}
}
創(chuàng)建查詢條件實體類ConditionUser:
public class ConditionUser {
private String name;
private int minAge;
private int maxAge;
//getters and setters
public ConditionUser(String name, int minAge, int maxAge) {
super();
this.name = name;
this.minAge = minAge;
this.maxAge = maxAge;
}
public ConditionUser() {
super();
}
}
新建映射文件userMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.test7.userMapper">
<select id="getUser" parameterType="ConditionUser" resultType="User">
SELECT * FROM d_user WHERE age >= #{minAge} AND age <= #{maxAge}
<if test="name!=null">
AND name LIKE CONCAT(CONCAT('%',#{name}),'%')</if>
</select>
</mapper>
編寫測試類:
public class Test {
private SqlSessionFactory sessionFactory;
private SqlSession session;
@Before
public void init(){
//讀取配置文件
String resource = "conf.xml";
InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource);
//創(chuàng)建SqlSessionFactory和SqlSession
sessionFactory = new SqlSessionFactoryBuilder().build(is);
session = sessionFactory.openSession();
}
@After
public void free(){
session.commit();
session.close();
}
@org.junit.Test
public void getUser() {
String statement = "com.mybatis.test7.userMapper"+".getUser";
ConditionUser conditionUser = new ConditionUser("o", 13, 18);
List<User> list = session.selectList(statement, conditionUser);
System.out.println(list);
}
}
運行結果:

注意:
1. 在配置文件中編寫sql語句時,為防止大于號和小于號在表示大小關系和表示標簽符號之間產(chǎn)生混淆,所以通常用>;和<;來代替sql語句中大于號和小于號。
2. 在SQL語句中添加動態(tài)SQL標簽if的原因是,當在后臺獲取的name屬性值為null時,防止生成where name like %null%的條件判斷語句,正確的邏輯應該是,當傳來的name屬性值為null時,取消此篩選條件,即不使用where name like ?的判斷條件。在mybatis中,可用的動態(tài)SQL標簽有:if,choose(when,otherwise),trim(where,set),foreach。
3. 在使用模糊查詢時,拼接%+#{name}+%的方法有如下幾種:
(1).像上述例子中一樣,在SQL語句中使用CONCAT關鍵字。
(2).使用${}代替#{}:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.test7.userMapper">
<select id="getUser" parameterType="ConditionUser" resultType="User">
SELECT * FROM d_user WHERE age >= #{minAge} AND age <= #{maxAge}
<if test="name!=null">
AND name LIKE '%${name}%'</if>
</select>
</mapper>
注意,默認情況下,使用#{}語法,MyBatis會產(chǎn)生PreparedStatement語句,并且安全地設置PreparedStatement參數(shù),這個過程中MyBatis會進行必要的安全檢查和轉義。例如:
執(zhí)行SQL:select * from emp where name = #{employeeName}
參數(shù):employeeName=>Smith
解析后執(zhí)行的SQL:select * from emp where name = ?
執(zhí)行SQL:Select * from emp where name = ${employeeName}
參數(shù):employeeName傳入值為:Smith
解析后執(zhí)行的SQL:Select * from emp where name =Smith
綜上所述,${}方式可能會引發(fā)SQL注入的問題,同時也會影響SQL語句的預編譯,所以從安全性和性能的角度出發(fā),應盡量使用#{}。當需要直接插入一個不做任何修改的字符串到SQL語句中,例如在ORDER BY后接一個不添加引號的值作為列名,這時候就需要使用${}。
(3).在程序中拼接。
總結
到此這篇關于mybatis的動態(tài)SQL和模糊查詢的文章就介紹到這了,更多相關mybatis動態(tài)SQL模糊查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot實現(xiàn)Excel讀取的實例教程
這篇文章主要給大家介紹了關于SpringBoot實現(xiàn)Excel讀取的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Java調(diào)用wsdl接口的兩種方法(axis和wsimport)
本文主要介紹了Java調(diào)用wsdl接口的兩種方法(axis和wsimport),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03
將ResultSet中得到的一行或多行結果集封裝成對象的實例
這篇文章主要介紹了將ResultSet中得到的一行或多行結果集封裝成對象的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

