动态SQL
If 标签
-
用于在xml配置中进行 语句判断
-
放在where后面 若满足条件 则拼接对应的字符串
-
// .java中: class User{ //员工表 id; username; password; depId; } List<User> select(int depid,String username){ ... mapper = sqlSessin.getMapper(..); List<User> users = mapper.select(int depid,String username) } ---------------------------------- // .xml中 '查找同部门下同名的员工信息(一般不会这么去查 为了演示啦)' <select id="select" resultType = "xxx.User"> select id, username, password, depId from user where <if test="depId != null"> depId = #{depid} </if> <if test="username != null and username != '' "> and username = #{username} </if> </select> '若满足test中的判断, 则直接将标签中的sql拼接到sql语句中!' ---------------------------------- 问题来了!如果 第一条if语句未满足,而第二条if语句满足了 而拼接上去的就是 select id, username, password, depId from user where 'and username = #{username}' 可以很明显发现!and 也被拼接上了,众所周知 这个sql肯定是错误的! 那有没有办法解决了? 相信大家想到了! --也就是在where起始后面拼接上'永等式'(eg: 1 = 1)! <select id="select" resultType = "xxx.User"> select id, username, password, depId from user where 1 = 1 '这就是永等式子' <if test="depId != null"> and depId = #{depid} </if> <if test="username != null and username != '' "> and username = #{username} </if> </select> 这样子在每个if标签中含有and都不用慌了! 当然,mybatis也想到了!所以提供了下面的 <Where>标签! 没错就是替代 Where的
Where 标签
where会自动处理冲突
-
and 冲突
-
or 冲突
-
无内容冲突(当where中没有 if 标签拼接的时候,where会自动擦去)
-
// .java中: class User{ //员工表 id; username; password; depId; } List<User> select(int depid,String username){ ... mapper = sqlSessin.getMapper(..); List<User> users = mapper.select(int depid,String username) } ---------------------------------- // .xml中 <select id="select" resultType = "xxx.User"> select id, username, password, depId from user <where> <if test="depId != null"> and depId = #{depid} </if> <if test="username != null and username != '' "> and username = #{username} </if> </where> </select> 'where标签会自动处理if中的and 和 or' ---------------------------------- '如果and or 放在语句后面会怎么样呢?' <select id="select" resultType = "xxx.User"> select id, username, password, depId from user <where> <if test="depId != null"> depId = #{depid} and </if> <if test="username != null and username != '' "> username = #{username} and </if> </where> </select> 'where标签不会处理后面的and or!!!!'
-
where标签会自动处理if语句中的and 和 or,但仅限于是在语句开头的 and 、or
-
Trim 标签
这个标签就厉害了!where标签只能解决开头的and… 而Trim可以自定义控制开头、结尾,可以说 功能很强大了。
-
Trim标签中的属性**(仅当Trim标签有内容时才生效)**:
- prefix
- 指定添加trim标签内容的前缀
- suffix
- 指定添加trim标签内容的后缀
- suffixOverrides
- 指定删除trim标签内容的前缀
- prefixOverrides
- 指定删除trim标签内容的后缀
- prefix
-
// .java中: class User{ //员工表 id; username; password; depId; } List<User> select(int depid,String username){ ... mapper = sqlSessin.getMapper(..); List<User> users = mapper.select(int depid,String username) } ---------------------------------- // .xml中 <select id="select" resultType = "xxx.User"> select id, username, password, depId from user <trim prefix="where", prefixOverrides="and"> <if test="depId != null"> depId = #{depid} and </if> <if test="username != null and username != '' "> username = #{username} and </if> </trim> </select> 'trim标签当有内容时,指定前缀为where,且指定删除后缀and' '这样子就解决了!后缀and的冲突问题!' 其他属性 以此类推...
Choose
choose下有两个子标签
-
When**(至少一个)**
-
otherwise**(最多一个)**
-
when 和 otherwise 配合 可以类比成 java中的 if … else… if … else …
-
当满足when中任意条件时候,则可以不用进行往后的when
-
// .java中: class User{ //员工表 id; username; password; depId; } List<User> select(int depid,String username){ ... mapper = sqlSessin.getMapper(..); List<User> users = mapper.select(int depid,String username) } ---------------------------------- // .xml中 <select id="select" resultType = "xxx.User"> select id, username, password, depId from user <trim prefix="where"> <choose> <when test="depId != null"> depId = #{depid} </when> <when test="username != null and username != '' "> username = #{username} </when> '任意的when标签满足时,则choose标签也就结束' <otherwise> depId = 1; </otherwise> '当when语句没有一个满足时,则会执行otherwise中的内容' </choose> </trim> </select>
Foreach
循环功能来啦!有什么用呢?
当你要使用where in(…,…,…)时,通过循环将条件拼接。
-
Foreach
- collection 指定需要遍历的集合/数组的名称
- item 指定 集合遍历的临时变量名 类似 java中foreach(ing num: nums) 的num
- separator 指定遍历分隔符
- open foreach语句的前缀字符串
- close foreach语句的后缀字符串
-
// .java中: class User{ //员工表 id; username; password; depId; } List<User> select(List<Integer> Ids,List<User> users){){ ... mapper = sqlSessin.getMapper(..); mapper.delete( @Param("ids") Ids ) '注意!这里要用Param标记,因为传入的是集合 mybatis 默认以param0..为键' mapper.insert( @Param("users") users ) } ---------------------------------- // .xml中 '实现批量添加 insert into values (...),(...) 语句' <insert id="delete"> delete from user <trim prefix="where in"> '设置Param后Ids才查找的到' <foreach collection="Ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </trim> </where> </delete> ---------------------------------- '实现批量添加 insert into values (...),(...).. 语句' <insert id="delete" userGenerateKeys="true"> '开启userGenerateKeys主键自动递增' insert into values <foreach collection="users" item="user" separator=",">'每个都要用逗号隔开' (null, user.username, user.depId, ...) </foreach> </insert>
Sql、include
最后一个动态sql标签啦!
-
作用就是可以绑定指定的sql语句,使用时直接贴标签即可(怎么样!是不是很方便)
-
当使用时,使用 inculde标签 进行引用 并 设置 对refid属性赋上sql标签id值
-
// .java中: class User{ //员工表 id; username; password; depId; } List<User> select(int depid,String username){ ... mapper = sqlSessin.getMapper(..); List<User> users = mapper.select(); } ---------------------------------- // .xml中 '用于绑定sql' <sql id="userColums">id, username, password, depId</sql> <select id="select" resultType = "xxx.User"> select <include refid="userColums"/> from user </select>