<sql id="testId">id,user_name,age,sex</sql>
<select id="findAll" parameterType="java.util.Map" resultMap="TestBean">
select
<include refid="testId"/>
from table1
<where>
1=1
<if test="userName !=null and userName !=''">
and user_name LIKE CONCAT('%', #{userName},'%')
</if>
<if test="age !=null and age !=''">
and age ${age}
</if>
</where>
</select>
上面的user_name是数据库中对应的字段,userName是我们在实体bean中的字段,也就是我们从dao层给sql语句传入的参 数。
LIKE CONCAT('%', #{userName},'%')这是代表模糊查询。
如果传入正常的值用'#{}'接收,'${}'是用来接收表达式的,例如:我们从前端页面传入参数 age='in(12,13,15)' ,
mapper接收时会把它作为表达式处理,而不会当做字符串处理。
if标签是对sql语句的动态处理,如果传入的userName为空就会跳过它执行下面的,防止传入的值为空时报异常。
where标签是用来放我们的判断条件。
2.trim标签及它的属性的使用
<insert id="add" parameterType="TestBean" >
insert into table2
<trim prefix="(" suffix=")" suffixOverrides="," prefixOverrides="">
<if test="id != null" >
id,
</if>
<if test="userName != null" >
user_name,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=VARCHAR},
</if>
<if test="userName != null" >
#{userName,jdbcType=VARCHAR},
</if>
</trim>
</insert>
prefix:给trim标签内的sql语句加上前缀。
suffix:给trim标签内sql语句加上后缀。
suffixOverrides:去除trim标签内sql语句多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
prefixOverrides:trim标签内sql语句多余的前缀内容 。
如果不加上面的属性,拼出来的sql语句是: insert into table2 id,user_name, '1','小明' 这显然是错误的。
加上属性之后是:insert into table2 (id,user_name) values (id,userName) 。
jdbcType=VARCHAR:使用varchar类型去给数据库进行映射。
3. choose ,when, otherwise标签
<sql id="testId">id,user_name,age,sex</sql>
<select id="find" parameterType="TestBean" resultMap="TestResultMap">
select
<include refid="testId"/>
from table3
<where>
<choose>
<when test="name!=null and name!='' ">
name LIKE CONCAT(CONCAT('%', #{name}),'%')
</when>
<when test="age!= null and age!= '' ">
AND age = #{age}
</when>
<otherwise>
AND sex = #{sex}
</otherwise>
</choose>
</where>
</select>
choose语句与java中的switch语句类似,choose相当于switch,when相当于case,当when标签中有一个语句执行成功就会退出when标签,
otherwise相当于default,当when标签中的所有语句都不满足条件时就会执行otherwise。
4. foreach语句 ,主要迭代一个集合,通常是用于IN 条件。List 实例将使用“list”做为键,数组实例以“array” 做为键。
<select id="find" resultMap="TestResultMap">
select
<include refid="testId"/>
from table1
where id IN
<foreach collection="list" item="testList" open="(" separator="," close=")">
#{testList}
</foreach>
</select>
testList是我们传入的list的属性名。
open表示sql语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示sql语句以什么结束.
<update id="update" parameterType="TestBean" >
update table4
<set >
<if test="userId != null" >
user_id = #{userId,jdbcType=VARCHAR},
</if>
<if test="userName != null" >
user_name = #{userName,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
6.bind标签
<select id="find" parameterType="TestBean" ResultMap="TestBean">
<bind name="testName" value="'%'+parameter.getName()+'%'">
select * from table5
where name like #{testName}
</select>
可以从OGNL表达式中创建一个变量,并将其绑定到上下文。