您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Mybatis中如何實現動態SQL,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
二、動態SQL
1、 IF 標簽
在Product.xml中
<select id="listProduct" resultType="Product"> select * from product_ <if test="name!=null"> where name like concat('%',#{name},'%') </if> </select>
在TestIF.java中
System.out.println("查詢所有的"); List<Product> ps = session.selectList("listProduct"); for (Product p : ps) { System.out.println(p); } System.out.println("模糊查詢"); Map<String,Object> params = new HashMap<>(); params.put("name","a"); List<Product> ps2 = session.selectList("listProductByName",params); for (Product p : ps2) { System.out.println(p); }
2、WHERE SET TRIM 標簽
(1)WHERE標簽
如果要進行多條件判斷,可能會出現select * from product_ and price > 10 的矛盾
這個問題可以通過<where>標簽來解決
<select id="listProduct" resultType="Product"> select * from product_ <where> <if test="name!=null"> and name like concat('%',#{name},'%') </if> <if test="price!=null and price!=0"> and price > #{price} </if> </where> </select>
<where>標簽會進行自動判斷
如果任何條件都不成立,那么就在sql語句里就不會出現where關鍵字
如果有任何條件成立,會自動去掉多出來的 and 或者 or。
(2)SET標簽
與where標簽類似的,在update語句里也會碰到多個字段相關的問題。 在這種情況下,就可以使用set標簽
<set> <if test="name != null">name=#{name},</if> <if test="price != null">price=#{price}</if> </set>
(3)TRIM標簽,用來定制想要的功能
比如:替換where標簽
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
替換set標簽
<trim prefix="SET" suffixOverrides=","> ... </trim>
3、CHOOSE WHEN OTHERWISE 標簽
(1)Mybatis里面沒有else標簽,但是可以使用when otherwise標簽來達到這樣的效果。
在Product.xml中
<mapper namespace="com.how2java.pojo"> <select id="listProduct" resultType="Product"> SELECT * FROM product_ <where> <choose> <when test="name != null"> and name like concat('%',#{name},'%') </when> <when test="price !=null and price != 0"> and price > #{price} </when> <otherwise> and id >1 </otherwise> </choose> </where> </select> </mapper>
其作用是: 提供了任何條件,就進行條件查詢,否則就使用id>1這個條件。
4、FOREACH 標簽,通常用于in 這樣的語法里.
如例,如圖查詢出id等于1,3,5的數據出來。
在Product.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.how2java.pojo"> <select id="listProduct" resultType="Product"> SELECT * FROM product_ WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select> </mapper>
在TestForeach.java中
package com.how2java; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; 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 com.how2java.pojo.Product; public class TestMybatis { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); List<Integer> ids = new ArrayList(); ids.add(1); ids.add(3); ids.add(5); List<Product> ps = session.selectList("listProduct",ids); for (Product p : ps) { System.out.println(p); } session.commit(); session.close(); } }
5、bind標簽
bind標簽就像是再做一次字符串拼接,方便后續使用
如本例,在模糊查詢的基礎上,把模糊查詢改為bind標簽。
在Product.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.how2java.pojo"> <!-- 本來的模糊查詢方式 --> <!-- <select id="listProduct" resultType="Product"> --> <!-- select * from product_ where name like concat('%',#{0},'%') --> <!-- </select> --> <select id="listProduct" resultType="Product"> <bind name="likename" value="'%' + name + '%'" /> select * from product_ where name like #{likename} </select> </mapper>
在TestMybatis.java中
package com.how2java; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; 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 com.how2java.pojo.Product; public class TestMybatis { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); Map<String, String> params =new HashMap(); params.put("name", "product"); List<Product> ps = session.selectList("listProduct",params); for (Product p : ps) { System.out.println(p); } session.commit(); session.close(); } }
上述就是小編為大家分享的Mybatis中如何實現動態SQL了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。