动态SQL
if
where
trim
XML中可以使用① html特殊转义编码 ② CDATA方式 Alt+会车提示 <![CDATA[<]]>
1、实现动态条件SQL
test 条件表达式 支持OGNL表达式
2、and动态拼接 出现报错 select * from emp where and username= ?
①改为 1=1 and ......
② 使用where标签 包含if标签 会自动在关键字 会去掉多余的and或or
③ 使用trim <trim prefix="WHERE" prefixOverrides="and|or">
功能灵活 广泛 可以用来实现where功能 prefix在包含的SQL前面加上设置的字符串
prefixOverrides 在 所有包含的SQL前面加上去除的字符串
suffix 在所有包含的字符串加上指定的字符串
<!-- <select id="selectEmp" resultType="com.kdy.pojo.Emp">-->
<!-- select * from emp-->
<!-- where 1=1-->
<!-- <if test="id!=null and id !=''"> and id = #{id}</if>-->
<!-- <if test="username!=null and username !=''">and username= #{username}</if>-->
<!-- <if test="beginDate!=null and begindate !=''">and create_date >= #{beginDate}</if>-->
<!-- <if test="endDate!=null and endDate !=''">and create_date <= #{endDate}</if>-->
<!-- <if test="dept_id!=null and dept_id !=''">and dept_id =#{dept_id}</if>-->
<!-- </select>-->
<!-- <select id="selectEmp" resultType="com.kdy.pojo.Emp">-->
<!-- select * from emp-->
<!-- <where>-->
<!-- <if test="id!=null and id !=''"> id = #{id}</if>-->
<!-- <if test="username!=null and username !=''">and username= #{username}</if>-->
<!-- <if test="beginDate!=null and begindate !=''">and create_date >= #{beginDate}</if>-->
<!-- <if test="endDate!=null and endDate !=''">and create_date <= #{endDate}</if>-->
<!-- <if test="dept_id!=null and dept_id !=''">and dept_id =#{dept_id}</if>-->
<!-- </where>-->
<!-- </select>-->
<select id="selectEmp" resultType="com.kdy.pojo.Emp11">
select * from emp
<trim prefix="WHERE" prefixOverrides="and|or">
<if test="id!=null and id !=''">and id = #{id}</if>
<if test="username!=null and username !=''">and username= #{username}</if>
<if test="beginDate!=null and begindate !=''">and create_date >= #{beginDate}</if>
<if test="endDate!=null and endDate !=''">and create_date <= #{endDate}</if>
<if test="dept_id!=null and dept_id !=''">and dept_id =#{dept_id}</if>
</trim>
</select>
froeach
<!--
foreach
collection 需要循环的集合参数
item 要循环的变量
separator 要加的分割符
open close 开始加的和结束加的字符串
index 下标 从 0开始
实现in ${} 有SQL注入风险
select * from emp where username in ("张三","李四")
-->
<select id="queryEmp3" resultType="com.kdy.pojo.Emp11">
select * from emp
<where>
<foreach collection="usernames" item="username" separator="," open=" username in (" close=")" index="i">
#{username}
</foreach>
</where>
</select>
choose when otherwise 多条件取其中一个
<select id="queryEmp1" resultType="com.kdy.pojo.Emp11">
select * from emp
<where>
<choose>
<when test="deptName=='经理'">dept_id=1</when>
<when test="deptName=='员工'">dept_id=2</when>
<otherwise>dept_id=#{id}</otherwise>
</choose>
</where>
</select>
set
<!--
set 一般用在update上面
会自动加上set 关键字 会自动去除最后的,
使用trim <trim prefix="set" suffixOverrides=",">
-->
<update id="updateEmp">
update emp
<set>
<if test="username!=null and username!=''">
username = #{username},</if>
<if test="create_date!=null and create_date!=''">create_date=#{create_date},</if>
<if test="dept_id!=null and dept_id!=''">{dept_id}</if>
</set>
where id=#{id}
</update>
bind 和 sql 代码片段
<!--
select * from emp where username like '%' #{username} '%' 空格MySQL中代表链接字符串的意思
①空格 或 CONCAT函数
②可以拼接好再传进来也可以
③ 使用bind在Mapper映射文件上下文声明一个变量 name 变量名 value 支持OGNL表达式
公共的SQL语句使用sql代码片段声明 <include refid="">进行调用 解决代码冗余
第一步 sql id 进行声明
第二部 <include refid=""> 进行调用
如果sql中 使用了 #{var1} 必须在include中加入 <property name="var1" value="*"/> 进行替换变量
-->
<select id="queryEmp4" resultType="com.kdy.pojo.Emp11">
<bind name="_username" value="'%'+username+'%'"></bind>
<include refid="selectEmpSQL">
<property name="columns" value="*"/>
</include>
where username like #{_username}
</select>
<sql id="selectEmpSQL">
select ${columns} from emp
</sql>
MyBatis 常用 OGNL表达式
or and == eq != neq lt lte gt gte
in
not in
+ - * / %
! not
e.method(args) 调用对象方法
e.property 对象属性值
e1[e2] 按索引取值 List 数组 和 map
@class@method(args) 调用类的静态方法
@class@field 调用的静态字段值