Mybatis動態(tài)SQL之if、choose、where、set、trim、foreach標(biāo)記實例詳解
動態(tài)SQL就是動態(tài)的生成SQL。
if標(biāo)記
假設(shè)有這樣一種需求:查詢用戶,當(dāng)用戶名不等于“admin”的時候,我們還需要密碼為123456。
數(shù)據(jù)庫中的數(shù)據(jù)為:

MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--定義別名 注意typeAliases一定要在environments之前--> <typeAliases> <typeAlias type="jike.book.pojo.JiKeUser" alias="JiKeUser"/> <typeAlias type="jike.book.pojo.Author" alias="Author"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/jikebook"/> <property name="username" value="root"/> <property name="password" value="*****"/> </dataSource> </environment> </environments> <mappers> <mapper resource="jike/book/map/jikeUser.xml"/> </mappers> </configuration>
JiKeUser.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="/">
<select id="selectSQL" resultType="JiKeUser" parameterType="JiKeUser">
SELECT * FROM jikebook.jikeuser
WHERE 1=1
<if test="userName!='admin'">
AND password=#{password}
</if>
</select>
</mapper>
測試類:
package jike.book.test;
import jike.book.pojo.JiKeUser;
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 java.io.IOException;
import java.io.Reader;
import java.util.List;
/**
* DateTime: 2016/9/6 13:36
* 功能:
* 思路:
*/
public class TestSQL {
public static void main(String[] args) {
// 資源路徑
String resource="jike/book/map/MyBatisConfig.xml";
Reader reader=null;
SqlSession session;
try {
reader= Resources.getResourceAsReader(resource);
} catch ( IOException e ) {
e.printStackTrace();
}
SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);
session=sqlMapper.openSession();
JiKeUser jiKeUser=new JiKeUser();
jiKeUser.setPassword("123456");
List<JiKeUser> userList=session.selectList("selectSQL",jiKeUser);
for ( JiKeUser user:userList ) {
System.out.println("userName:"+user.getUserName());
}
session.close();
}
}
運(yùn)行結(jié)果為:

choose標(biāo)記
假設(shè)我們當(dāng)前有這么一個需求:查詢用戶,如果用戶名不為空就加上用戶名這個條件,如果id不為空也加上id這個條件,否則的話就是設(shè)置密碼不為空,這就是一個多路選擇。
MyBatisConfig.xml不改變,在JikeUser.xml中加上:
<select id="selectJiKeUserChoose" resultType="JiKeUser" parameterType="JiKeUser">
select * from jikeuser where 1=1
<choose>
<when test="userName!=null">
and userName like #{userName}
</when>
<when test="id!=0">
and id =#{id}
</when>
<otherwise>
and password is not null
</otherwise>
</choose>
</select>
測試類:假設(shè)用戶名不為空:
package jike.book.test;
import jike.book.pojo.JiKeUser;
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 java.io.IOException;
import java.io.Reader;
import java.util.List;
/**
* DateTime: 2016/9/6 13:36
* 功能:
* 思路:
*/
public class TestSQL {
public static void main(String[] args) {
// 資源路徑
String resource="jike/book/map/MyBatisConfig.xml";
Reader reader=null;
SqlSession session;
try {
reader= Resources.getResourceAsReader(resource);
} catch ( IOException e ) {
e.printStackTrace();
}
SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);
session=sqlMapper.openSession();
JiKeUser jiKeUser=new JiKeUser();
jiKeUser.setUserName("YEN");
List<JiKeUser> userList=session.selectList("selectJiKeUserChoose",jiKeUser);
for ( JiKeUser user:userList ) {
System.out.println("userName:"+user.getUserName());
}
session.close();
}
}
結(jié)果為:

假設(shè)不設(shè)置用戶名這個條件,即注釋掉jiKeUser.setUserName("YEN");:

where標(biāo)記、set標(biāo)記
上面我們在choose中查詢是不能確定子連接條件中的and是寫還是不寫,因此加了一個1=1.而where會只能的去判斷該不該加。
<select id="selectJiKeUserWhere" resultType="JiKeUser" parameterType="JiKeUser">
select * from jikeuser
<where>
<if test="userName!=null">
and userName like #{userName}
</if>
<if test="id!=null">
and id =#{id}
</if>
</where>
</select>
set標(biāo)記智能賦值,會自動去掉多余的”,”。
<update id="updateJiKeUserSet" parameterType="JiKeUser">
update JiKeUser
<set>
<if test="userName != null">userName=#{userName},</if>
<if test="password != null">password=#{password},</if>
</set>
where id=#{id}
</update>
操作之前的數(shù)據(jù):

操作:

操作結(jié)果:


<update id="updateUserTrim" parameterType="JiKeUser">
UPDATE JiKeUser
<trim prefix="SET" suffixOverrides="," suffix="WHERE id = #{id}" >
<if test="userName != null and userName != '' ">
userName = #{userName},
</if>
<if test="password != null and password != '' ">
password=#{password},
</if>
</trim>
</update>

foreach標(biāo)記
通常用于循環(huán)查詢或循環(huán)賦值

<select id="selectJiKeUserForeach" resultType="JiKeUser" parameterType="list">
select * from jikeuser
<where>
id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</where>
</select>
測試:

以上所述是小編給大家介紹的Mybatis動態(tài)SQL之if、choose、where、set、trim、foreach標(biāo)記實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Springboot使用thymeleaf動態(tài)模板實現(xiàn)刷新
這篇文章主要介紹了Springboot使用thymeleaf動態(tài)模板實現(xiàn)刷新,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
(starters)springboot-starter整合阿里云datahub方式
這篇文章主要介紹了(starters)springboot-starter整合阿里云datahub方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
IDEA2019.3配置Hibernate的詳細(xì)教程(未使用IDEA的自動化)
這篇文章主要介紹了IDEA2019.3配置Hibernate的詳細(xì)教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
springcloud整合gateway實現(xiàn)網(wǎng)關(guān)全局過濾器功能
本文主要介紹了springcloud整合gateway實現(xiàn)網(wǎng)關(guān)全局過濾器功能,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題
這篇文章主要介紹了解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

