如果User对象中只有name属性有值,sql语句是:select * from user_tb where name=#{name}
如果User对象中只有tel属性有值,sql语句是:select * from user_tb where tel=#{tel}
如果User对象的name、tel都有值,sql语句是:select * from user_tb where name=#{name} and tel=#{tel}
有时候sql语句不是一成不变的,要根据传入的数据动态生成要执行的sql语句,动态sql就适合这种情况。
比如传入的User对象只设置了tel,拼接的sql语句是:SELECT * FROM user_tb WHERE AND tel=#{tel},<where>会自动剔除多余的AND。
不使用<where>的写法:
<select id="queryUser" parameterType="user" resultType="user">
SELECT * FROM user_tb WHERE 1=1
<if test="name!=null and name!=''">
AND name=#{name}
</if>
<if test="tel!=null and tel!=''">
AND tel=#{tel}
</if>
</select>
<select id="queryPwd" parameterType="user" resultType="string">
SELECT password FROM user_tb WHERE name=#{name} AND role=#{role}
</select>
如果不一致,比如性别,传入的是male、female,数据库中存储的是0、1,就需要使用<choose>转换一下。
collection 要迭代的数据类型,数组=>array,List=>list,Map=>Map的key的数据类型。使用数组容易出错,尽量用List代替数组。
index 本次迭代的下标,指定一个临时变量表示下标
item 本次迭代的元素,指定一个临时变量表示本次迭代的元素
open 拼接这段字符串时以什么开头
close 拼接这段字符串以什么结尾
separator 迭代的元素之间用什么连接(分隔)
collection是必需的,其余均可选。
更严谨的写法:
<select id="queryUser" parameterType="list" resultType="user">
SELECT * FROM user_tb WHERE tel IN
<if test="list!=null and list.size>0">
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
<select id="queryUser" parameterType="string" resultType="user">
<bind name="pattern_name" value="'%'+name+'%'"/>
SELECT * FROM user_tb WHERE name LIKE #{pattern_name}
</select>
<bind>定义一个变量,拼接好字符串。