Mybatis動態(tài)SQL之if、choose、where、set、trim、foreach標記實例詳解
動態(tài)SQL就是動態(tài)的生成SQL。
if標記
假設有這樣一種需求:查詢用戶,當用戶名不等于“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(); } }
運行結果為:
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>
操作之前的數(shù)據(jù):
操作:
操作結果:
<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標記
通常用于循環(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標記實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法
這篇文章主要介紹了java實現(xiàn)新浪微博Oauth接口發(fā)送圖片和文字的方法,涉及java調用新浪微博Oauth接口的使用技巧,具有一定參考接借鑒價值,需要的朋友可以參考下2015-07-07