動態SQL就是動態的生成SQL。
if標記
假設有這樣一種需求:查詢用戶,當用戶名不等于“admin”的時候,我們還需要密碼為123456。
數據庫中的數據為:

MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//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 mapperPUBLIC "-//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.jikeuserWHERE 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();}}運行結果為:

choose標記
假設我們當前有這么一個需求:查詢用戶,如果用戶名不為空就加上用戶名這個條件,如果id不為空也加上id這個條件,否則的話就是設置密碼不為空,這就是一個多路選擇。
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>測試類:假設用戶名不為空:
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();}}結果為:

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

where標記、set標記
上面我們在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標記智能賦值,會自動去掉多余的”,”。
<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>操作之前的數據:

操作:

操作結果:


<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標記
通常用于循環查詢或循環賦值

<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動態SQL之if、choose、where、set、trim、foreach標記實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
新聞熱點
疑難解答