Mybatis映射文件的深入
【摘要】 1. 动态sql语句 1.1 动态sql语句概述 1.2 动态 SQL 之 < if /> 1.3 动态 SQL 之 < foreach /> 2. SQL片段抽取 3. 知识小节 1. 动态sql语句 1.1 动态sql语句概述Mybatis 的映射文件中,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。参考的官方文档,描述如下...
1. 动态sql语句
1.1 动态sql语句概述
- Mybatis 的映射文件中,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。
- 参考的官方文档,描述如下:
1.2 动态 SQL 之 < if />
-
根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
-
当查询条件id和username都存在时,控制台打印的sql语句如下:
-
当查询条件只有id存在时,控制台打印的sql语句如下:
public class User {
private int id;
private String username;
private String password;
//省略 set get toString
}
public interface UserMapper {
public List<User> findByCondition(User condition);
}
- UserMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xdr630.mapper.UserMapper">
<!--查询操作-->
<select id="findByCondition" parameterType="user" resultType="user">
select * from user
<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>
</mapper>
public class MapperTest {
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//模拟 user
User condition = new User();
condition.setId(1);
// condition.setUsername("zhangsan");
// condition.setPassword("1234");
List<User> userList = mapper.findByCondition(condition);
System.out.println(userList);
}
}
1.3 动态 SQL 之 < foreach />
循环执行sql的拼接操作,例如:
SELECT * FROM USER WHERE id IN (1,2,5)
测试代码片段如下:
- 案例演示:
public interface UserMapper {
public List<User> findByIds(List<Integer> ids);
}
- 相当于SQL语句:
select * from user where id in (?)
<select id="findByIds" parameterType="list" resultType="user">
select * from user
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
- 测试
//模拟 ids 数据
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
List<User> userList = mapper.findByIds(ids);
System.out.println(userList);
2. SQL片段抽取
- Sql 中可将重复的 sql 提取出来,使用时用
include
引用即可,最终达到 sql 重用的目的
3. 知识小节
MyBatis映射文件配置:
<select>:查询
<insert>:插入
<update>:修改
<delete>:删除
<where>:where条件
<if>:if判断
<foreach>:循环
<sql>:sql片段抽取
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)