记录学习的历程之 Mybatis 的动态 SQL 语句

Kite学习框架的第五天

Mybatis 的动态 SQL 语句

1.Mybatis 中简化编写的 SQL 片段

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

1.1 抽取公用的代码块 使用sql标签

<!--抽取重复的sql语句-->
    <sql id="defaultFindAll">
        select * from user
    </sql>

1.2 引用代码块中的代码

已查询所用为例子
里面的 select * from user 替换为了 :下面的include标签

<!-- 配置查询所有操作 --> 
<select id="findAll" resultType="user"> 
	 <include refid="defaultSql"></include>
</select> 

可以用同样的方法替换UserDao.xml中的 select * from user 语句

2 动态 SQL之 if , where 标签

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

2.1 在持久层UserDao接口中添加方法

    /**
     * 根据出入德参数条件
     * @param user 查询调价:有可能有用户名,也可能有性别,也有可能有地址,也有可能什么都没有
     * @return
     */
    List<User> findUserByCondition(User user);

2.2 在UserDao.xml中添加映射配置

添加了了两个条件:
username=“老闫”;
sex=“男”
结果只能输出符合这两个条件的数据

    <select id="findUserByCondition" resultMap="userMap" parameterType="user">
        <include refid="defaultFindAll"></include>
        <where>
            <if test="userName != null">
                and username = #{userName}
            </if>
            <if test="userSex != null">
                and sex = #{userSex}
            </if>
        </where>
    </select>

2.3 在测试类中添加单元测试

@Test
    public void findUserByConditionTest(){
        User user = new User();
        user.setUserName("老闫");
        user.setUserSex("女");
        List<User> users = mapper.findUserByCondition(user);
        for (User user1 : users) {
            System.out.println(user1);
        }
    }

运行结果图:
记录学习的历程之 Mybatis 的动态 SQL 语句_第1张图片

3 动态 SQL之foreach 标签

3.1 在 QueryVo 中加入一个 List 集合用于封装参数


public class QueryVo {

    private List<Integer> ids;

    private User user;

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

3.2 再UserDao接口中添加方法


    /**
     * 查询在ids中的user数据
     * @return
     */
    List<User> findInIds(QueryVo vo);

3.3 在配置文件中添加映射

foreach 标签中的标签解释:

collection:代表要遍历的集合元素,注意编写时不要写#{}
item 表示集合中每一个元素进行迭代时的别名,
index 指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open 表示该语句以什么开始,
separator 表示在每次进行迭代之间以什么符号作为分隔符,
close 表示以什么结束。

    <select id="findInIds" resultMap="userMap" parameterType="queryVo">
        <include refid="defaultFindAll"></include>
        <where>
        <if test="ids != null and ids.size() > 0">
          <foreach collection="ids" open="and id in (" close=")" item = "ids" separator=",">
            #{ids}
          </foreach>
        </if>
        </where>
    </select>

3.4 添加单元测试

    @Test
    public void findUserInIdsTest(){
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(3);
        list.add(5);
        vo.setIds(list);
        List<User> inIds = mapper.findInIds(vo);
        for (User inId : inIds) {
            System.out.println(inId);
        }

    }

运行结果图:
记录学习的历程之 Mybatis 的动态 SQL 语句_第2张图片

今天学习的内容不多
原因:
上午中午 都用来注册网站了,昨晚在阿里云注册了一个域名www.kiteyy.cn
早上又在腾讯云注册了一个域名www.kitey.cn,和买了一个服务器;然后就成功的进了一次,因为网站要进行备案才可以正常访问了;
可以利用我的服务器的ip地址进行访问给你们看看效果图(哈哈白嫖的代码)
记录学习的历程之 Mybatis 的动态 SQL 语句_第3张图片
控制台截图:
记录学习的历程之 Mybatis 的动态 SQL 语句_第4张图片
记录学习的历程之 Mybatis 的动态 SQL 语句_第5张图片

腾讯云服务器截图
记录学习的历程之 Mybatis 的动态 SQL 语句_第6张图片
腾讯云域名截图
这里添加了域名解析,才可以连接到购买的服务器
记录学习的历程之 Mybatis 的动态 SQL 语句_第7张图片
阿里云域名截图
记录学习的历程之 Mybatis 的动态 SQL 语句_第8张图片

最后希望能早点备案,
嘻嘻 每一天都要加油偶!
2020/6/10/23:17

你可能感兴趣的:(每天的学习笔记)