Mybatis入门到精通系列

05 Mybatis的动态Sql

2020-04-24  本文已影响0人  better_future

Mybatis的动态Sql

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

动态 SQL 之<if> 标签
List<User> findByUser(User user);
<select id="findByUser" resultType="com.it.pojo.User" parameterType="com.it.pojo.User">
            select * from user where 1=1
            <if test="username!=null and username != ''">
                and username like #{username}
            </if>
            <if test="address != null">
                and address like #{address}
            </if>
        </select>

注意:<if>标签的test属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。
另外要注意 where 1=1的作用~!
测试:

    @Test
    public void testFindUser(){
        User user = new User();
        user.setUsername("%王");
        user.setAddress("北京");
        List<User> users = userDao.findByUser(user);
        System.out.println(users);
    }
动态 SQL 之<where> 标签

为了简化上面 where 1=1的条件拼装,我们可以采用<where>标签来简化开发。

<select id="findByUser" resultType="com.it.pojo.User" parameterType="com.it.pojo.User">
            select * from user
            <where>
                <if test="username!=null and username != ''">
                    and username like #{username}
                </if>
                <if test="address != null">
                    and address like #{address}
                </if>
            </where>
 </select>

有代码片段拼接的时候不要使用分号;

动态标签之<foreach> 标签

传入多个 id 查询用户信息,用下边两个 sql 实现:

SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)
public class QueryIdVo implements Serializable {

    private List<Integer> ids;
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}
List<User> findInIds(QueryIdVo vo);
<select id="findInIds" resultType="com.it.pojo.user" parameterType="com.it.vo.QueryIdVo">
            select * from user
      <where>
         <if test="ids !=null and ids.size() > 0">
              <foreach  open="id in (" close=")"  collection="ids"  item="uid" separator=",">
                        #{uid}
             </foreach>
         </if>
     </where>
 </select>

先判断pojo中的ids属性是否为空,然后执行sql语句,将ids进行遍历,获得所有id的值再ids中的数据。
SQL 语句:
select 字段 from user where id in (?)
<foreach>标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符

 @Test
    public void testFindInds(){
        QueryIdVo queryIdVo = new QueryIdVo();
        ArrayList<Integer> ids = new ArrayList<Integer>();
        ids.add(41);
        ids.add(42);
        ids.add(43);
        ids.add(46);
        ids.add(57);
        queryIdVo.setIds(ids);
        List<User> users = userDao.findInIds(queryIdVo);
        for(User user:users){
            System.out.println(user);
        }
    }

相当于

select * from user where id in (41,42,43,46,57)

Mybatis 中简化编写的 SQL

<!-- 抽取重复的语句代码片段 -->
<sql id="defaultSql">
select * from user
</sql>

引用代码片段

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

猜你喜欢

热点阅读