Mybatis常见查询操作——SQL语句的拼接
1、什么是动态SQL?
官网描述:
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。
简单理解:
动态SQL就是能根据不同的查询条件,生成不同的SQL语句。
2、动态SQL主要包含哪些方面的知识呢?
对于我们初级程序员来说,只要掌握了if、choose、trim、where、when、set、foreach、otherwise等常见的标签,我们就基本能解决80%的sql问题。下面我们就通过案例说明婴喜爱这些标签该如何使用。
(1)if 标签
if 标签的使用一般是要配合test使用的。
常见的应用环境,一般是修改或者是查询条件的拼接,但是如果是查询条件的拼接的话,一定是要和where标签进行配合使用的。
(a)mapper层:
//根据if标签来进行查询条件的拼装
User2 queryByIf(HashMap map);
(b)xml配置
<select id="queryByIf" resultType="com.swagger.swaggerdemo1.Pojo.User2">
select * from user2
<where>
<if test="id != null">
id = #{
id}
</if>
<if test="name != null">
and name = #{
name}
</if>
</where>
</select>
(c)测试
@Test
public void queryByIf(){
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","小明");
User2 user2 = userMapper.queryByIf(map);
System.out.println(user2);
}
注意注意:
因此,如果查询参数只有一个可以忽略where标签,但是如果查询参数超过一个,那么就必须借助于where标签来进行判断,然后不要忘记加and。
(2)set标签
其实set标签与where标签出奇的一致,因为他俩的用法逻辑是一模一样的,但是,重点是他俩的格式不一样,where标签是用and标签进行连接的,set则是通过逗号来接性连接的。而且查询语句和更新语句的返回值是不一样的,在写mapper层的时候需要注意一下。
(a) mapper层:
//利用set标签进行更新操作
Integer updateBySet(HashMap map);
(b)xml层
<update id="updateBySet">
update user2
<set>
<if test="tid != null">
tid = #{
tid},
</if>
<if test="name != null">
name = #{
name}
</if>
</set>
<where>
<if test="id != null">
id = #{
id}
</if>
</where>
</update>
(c)测试:
@Test
public void updateBySet(){
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","小改");
Integer integer = userMapper.updateBySet(map);
System.out.println(integer);
}
修改之前:
修改之后:
再次提醒注意:
(3)SQL片段重复利用
有时候可能某个 sql 语句我们用的特别多,为了增加代码的重用性,简化代码,我们需要将这些代码抽取出来,然后使用时直接调用。
在这之中只要是依靠 sql 标签和 include 标签来实现。其实说起来感觉云里雾里,举个例子就啥都明白了。
(a)mapper层:
//利用公共代码块进行查询操作
User2 queryByCommonSQL(HashMap map);
(b)xml配置:
<sql id="CommonSQL">
select * from user2
</sql>
<select id="queryByCommonSQL" resultType="com.swagger.swaggerdemo1.Pojo.User2">
<include refid="CommonSQL"></include>
<where>
<if test="id != null">
id = #{
id}
</if>
<if test="name != null">
and name = #{
name}
</if>
</where>
</select>
(c)测试层:
@Test
public void queryByCommonSQL(){
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","小改");
User2 user2 = userMapper.queryByCommonSQL(map);
System.out.println(user2);
}
(4)foreach遍历
(a)mapper层:
//利用foreach进行循环查询
List<User2> queryByForeach(@Param("ids") List list);
(b)xml层:
<select id="queryByForeach" resultType="com.swagger.swaggerdemo1.Pojo.User2">
select * from user2
<where>
<foreach collection="ids" item="id" open="and (" close=")" separator="or">
id = #{
id}
</foreach>
</where>
</select>
(c)测试:
@Test
public void queryByForeach(){
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
List<User2> user2 = userMapper.queryByForeach(list);
user2.forEach(System.out :: println);
}
补充:
foreach标签中的collection参数的理解:
在这里其实把collection理解为集合类型,或者向我上边举的例子一样,通过@param指定集合名字也可以,当我们将collection理解为集合类型的时候,我们就不需要借助于@param参数了。在这里给大家举两个例子,一个是传递参数类型为数组类型,另外传递参数为集合类型。
—————————————————————————————————批量删除:———————————————————————————————————-
(a)mapper层:
public int BatchDelete(Integer[] ids);
(b)xml层:
<delete id="BatchDelete">
delete from tbl_user02 where id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{
id}
</foreach>
</delete>
(c)测试层:
Integer[] ids = {
1,3,5};
int row = userDao.BatchDelete(ids);
—————————————————————————————————批量添加:———————————————————————————————————-
(a)mapper层:
public int batchAdd(List<User> users);
(b)xml层:
<!--注意 因为循环添加的为一个对象 所以下面添加的值就必须是users.name ...-->
<insert id="batchAdd">
insert into tbl_user02(name,pwd,email) values
<foreach collection="list" item="users" separator=",">
(#{
users.name},#{
users.pwd},#{
users.email})
</foreach>
</insert>
(c)测试层:
List<User> list = new ArrayList<User>();
list.add(new User("张三","123","zs@qq.com"));
list.add(new User("李四","123","ls@qq.com"));
list.add(new User("王五","123","ww@qq.com"));
int row = userDao.batchAdd(list);
(5)choose标签
choose 标签作用是通过条件判断来拼接 SQL 语句,类似于 Java 中的 switch 语句,从上到下,当有匹配的条件时,跳出 choose 语句;如果所有条件都不成立则执行 otherwise 标签中的内容。
在使用choose标签的时候要配合when标签、otherwise标签。
使用细节:当有条件成立时,就不会继续执行了。
(a)mapper层:
//利用choose进行查询
List<User2> queryByChoose(HashMap map);
(b)xml层:
<select id="queryByChoose" resultType="com.swagger.swaggerdemo1.Pojo.User2">
select * from user2
<where>
<choose>
<when test="id != null">
id = #{
id}
</when>
<when test="name != null">
and name = #{
name}
</when>
<when test="tid != null">
and tid = #{
tid}
</when>
<otherwise>
and 1 = 1
</otherwise>
</choose>
</where>
</select>
(c)测试:这里我进行了三次测试,帮助大家理解choose标签的当有条件成立时,就不会继续执行了。
第一次测试:
@Test
public void queryByChoose(){
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","小改");
List<User2> user2 = userMapper.queryByChoose(map);
user2.forEach(System.out :: println);
}
第二次测试:
@Test
public void queryByChoose(){
HashMap<String, Object> map = new HashMap<>();
// map.put("id",1);
map.put("name","小改");
List<User2> user2 = userMapper.queryByChoose(map);
user2.forEach(System.out :: println);
}
第三次测试
@Test
public void queryByChoose(){
HashMap<String, Object> map = new HashMap<>();
// map.put("id",1);
// map.put("name","小改");
List<User2> user2 = userMapper.queryByChoose(map);
user2.forEach(System.out :: println);
}
如果你能把我三篇Mybatis基础博客看完,并且能自己建立几张数据表进行练习一下啊,我认为你应该能写出70%的sql,你已经满足一个初级程序员的条件了,恭喜恭喜!!!
第一篇:Mybatis常见查询总结,仅限于初级程序员阅读
https://blog.csdn.net/weixin\_43388691/article/details/127211492?spm=1001.2014.3001.5501
第二篇:Mybatis常见查询操作——mybatis parameterType 传入多个参数
https://blog.csdn.net/weixin\_43388691/article/details/127230219?spm=1001.2014.3001.5501
还没有评论,来说两句吧...