動態SQL就是動態的生成SQL。
if標記
假設有這樣一種需求:查詢用戶,當用戶名不等于“admin”的時候,我們還需要密碼為123456。
數據庫中的數據為:
MyBatisConfig.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?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> |
測試類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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中加上:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<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> |
測試類:假設用戶名不為空:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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會只能的去判斷該不該加。
1
2
3
4
5
6
7
8
9
10
11
|
< 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標記智能賦值,會自動去掉多余的”,”。
1
2
3
4
5
6
7
8
|
<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> |
操作之前的數據:
操作:
操作結果:
1
2
3
4
5
6
7
8
9
10
11
|
<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標記
通常用于循環查詢或循環賦值
1
2
3
4
5
6
7
8
9
10
|
<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標記實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.csdn.net/yen_csdn/article/details/52449436