动态SQL语句
如果没设置条件,一定不用在 sql 语句中设置
where
使用在查询的时候,
where 是添加 where 关键字删除多余的and
使用 if 进行判断,test = "判断的条件"
<select id="getEmpByParam" parameterType="lyy.bean.Emp" resultType="lyy.bean.Emp">
SELECT
`eid`,
`ename`,
`age`,
`sex`,
`did`
FROM
`emp`
<where>
<if test=" eid != null">
AND `eid` = #{eid}
</if>
<if test=" ename != null and ename != ''">
AND `ename` = #{ename}
</if>
<if test=" age != null and age != ''">
AND `age` = #{age}
</if>
<if test=" sex == '1' or sex == '0'">
AND `sex` = #{sex}
</if>
</where>
</select>
trim
trim : 截取并拼接
- prefix : 在操作的sql语句前加入某一些内容
- suffix : 在操作的sql语句后加入某一些内容
- prefixOverrides : 把操作的sql语句前的某些内容去掉
- suffixOverrides = and|or : 把操作的sql语句后的某些内容去掉,(and|or)去掉and或者or
<select id="getEmpByParamOne" parameterType="lyy.bean.Emp" resultType="lyy.bean.Emp">
SELECT
`eid`,
`ename`,
`age`,
`sex`,
`did`
FROM
`emp`
<trim prefix="where" suffix="" prefixOverrides="" suffixOverrides="and|or">
<!-- 使用 if 进行判断,test = "判断的条件" -->
<if test=" eid != null">
`eid` = #{eid} AND
</if>
<if test=" ename != null and ename != ''">
`ename` = #{ename} AND
</if>
<if test=" age != null and age != ''">
`age` = #{age} AND
</if>
<!-- 判断值是否相等必须使用数值 -->
<if test=" sex == '1' or sex == '0'">
`sex` = #{sex} AND
</if>
</trim>
</select>
Set
主要解决修改sql语句中多出现的逗号问题
<update id="updateEmp">
UPDATE
`emp`
<set>
<if test="">
</if>
</set>
WHERE
1
</update>
Choose(when、otherwise)
主要是用于分支判断,类似于 java 中的 seitch case 只会满足所有分支中的一个,可用根据某一个已有的条件进行查询
<select id="getEmpByParam" parameterType="lyy.bean.Emp" resultType="lyy.bean.Emp">
SELECT
`eid`,
`ename`,
`age`,
`sex`,
`did`
FROM
`emp`
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
.
.
.
<!-- 都不满足的执行 -->
<otherwise>
.....
</otherwise>
</choose>
</where>
</select>
如果不使用 foreach 进行批量删除
拼接之后: DELETE FROM emp
WHERE eid
IN ('11,13,14') 运行结果: 只会删除 eid = 11 这条数据 如果使用该方式进行批量删除必须使用 DELETE FROM emp
WHERE eid
IN (${value})
<delete id="deleteMoreEmp">
DELETE FROM `emp` WHERE `eid` IN (#{value})
</delete>
foreach
主要用于循环迭代
foreach:
- collection:指定要遍历的集合或数组,如果不使用@Param那么如果传入的参数是List那么key值就为list,如果传入的参数为 Array 那么key值为array
- item:设置元素的别名
- close:设置循环体的结束内容
- open:设置循环体的开始内容
- separator:每一次循环之间的分隔符
- index:
- 若遍历的是list集合,遍历的是下标
- 容遍历的是map集合,遍历的是key值
<delete id="deleteMoreByList">
DELETE FROM `emp` WHERE `eid` IN
<foreach collection="list" item="eid" separator=",">
#{eid}
</foreach>
</delete>
执行结果的SQL语句:DELETE FROM emp
WHERE eid
IN ( ? , ? , ? )
批量删除
-
delete(删除):
-
delete from emp where id in ();
-
delete from emp where id = 1 or id = 2 or id = 3
-
-
select(查询):
-
和 delete 写法相同
-
-
update(更新):
-
预编译对象只可以有1条 SQL 语句
-
在连接的数据库的 url 加上 allowMultiQueries=true
-
写法
-
<update id="updateMoreByArray">
<foreach collection="emps" item="emp" separator=";">
UPDATE emp SET ename = #{emp.ename},age = #{emp.age},sex = #{sex} WHERE eid = #{emp.eid}
</foreach>
</update>
-
-
-
insert(添加)
-
insert into emp values(),(),()
-
写法
-
<!--
Integer addEmpByArray(@Param("empList") Emp[] emps);
-->
<insert id="addEmpByArray">
INSERT INTO `emp`( `ename`, `age`, `sex`) VALUES
<foreach collection="empList" item="emp" separator=",">
(#{emp.ename},#{emp.age},#{emp.sex})
</foreach>
</insert>
-
-
SQL 标签
用于设置一段 sql 片段,即公共 sql 可以被当前映射文件所有的 sql 语句访问
设置公共片段
<sql id="key">
SELECT
`eid`,
`ename`,
`age`,
`sex`,
`did`
FROM
`emp`
</sql>
使用公共片段
<select id="getEmpByParam" resultType="lyy.bean.Emp">
<!--访问某个 SQL 片段 -->
<include refid="key"></include>
</select>