0
点赞
收藏
分享

微信扫一扫

十三、MyBatis映射文件深入


文章目录

  • ​​动态 sql 语句​​
  • ​​1. 动态 sql 语句概述​​
  • ​​2. 动态 SQL 之 十三、MyBatis映射文件深入_ssm
  • ​​3. 动态 SQL 之十三、MyBatis映射文件深入_mybatis_02
  • ​​SQL片段抽取​​
  • ​​知识小结​​

动态 sql 语句

1. 动态 sql 语句概述

Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。参考的官方文档,描述如下:

十三、MyBatis映射文件深入_sql语句_03

2. 动态 SQL 之 十三、MyBatis映射文件深入_mybatis_04

我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

十三、MyBatis映射文件深入_ssm_05

<select id="findByCondition" parameterType="user" resultType="user">
-- select * from user2
<include refid="selectUser"></include>
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
</where>
</select>

当查询条件 id 和 username 都存在时,控制台打印的sql语句如下:

十三、MyBatis映射文件深入_sql_06

当查询条件只有id存在时,控制台打印的sql语句如下:

十三、MyBatis映射文件深入_sql_07

3. 动态 SQL 之十三、MyBatis映射文件深入_java_08

循环执行 sql 的拼接操作,例如:SELECT * FROM USER WHERE id IN (1,2,5)。

十三、MyBatis映射文件深入_mybatis_09

<select id="findByIds" parameterType="list" resultType="user">
-- select * from user2
<include refid="selectUser"></include>
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>

测试代码片段如下:

十三、MyBatis映射文件深入_sql语句_10

测试程序

public class MapperTest {

@Test
public void test1() throws IOException {

InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

// // 模拟条件user
// User condition = new User();
// condition.setId(1);
// condition.setUsername("zhangsan");
// condition.setPassword("123");
//
// List<User> userList = mapper.findByCondition(condition);
// System.out.println(userList);



List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);

List<User> userList = mapper.findByIds(ids);
System.out.println(userList);
}
}

foreach 标签的属性含义如下:
<foreach>标签用于遍历集合,它的属性:
• collection:代表要遍历的集合元素,注意编写时不要写#{}
• open:代表语句的开始部分
• close:代表结束部分
• item:代表遍历集合的每个元素,生成的变量名
• sperator:代表分隔符

SQL片段抽取

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

十三、MyBatis映射文件深入_sql语句_11

<!--    sql语句的抽取-->
<sql id="selectUser">select * from user2</sql>
<select id="findByCondition" parameterType="user" resultType="user">
-- select * from user2
<include refid="selectUser"></include>
<!-- 省略 -->
</select>

知识小结

MyBatis映射文件配置:

<select>:查询
<insert>:插入
<update>:修改
<delete>:删除
<where>:where条件
<if>:if判断
<foreach>:循环
<sql>:sql 片段抽取


举报

相关推荐

0 条评论