Mybatis03—动态SQL语句(if、where、foreach)

动态SQL之if标签

持久层Dao接口:

 List<User> findUserByCondition(User user);

持久层Dao映射配置:


 <select id="findUserByCondition" resultMap="userMap" parameterType="com.review.domain.User">
        select * from user where 1=1
        <if test="username!=null and username != ''">
            and username like #{username}
        </if>
        <if test="sex != null">
            and sex like #{sex}
        </if>
    </select>

测试:

@Test
    public void testFindByUser() {
    
    
        User u = new User();
        u.setUsername("老王");
        u.setSex("男");
        List<User> users = userDao.findUserByCondition(u);
        for (User user:users){
    
    
            System.out.println(user);
        }
    }

控制台输出结果:

动态SQL之where标签

为了简化上面where 1=1的条件拼装,我们可以采用标签来简化开发。
持久层Dao映射配置:

 <select id="findUserByCondition" resultMap="userMap" parameterType="com.review.domain.User">
        select * from user
        <where>
            <if test="username!=null and username != ''">
                and username like #{username}
            </if>
            <if test="sex != null">
                and sex like #{sex}
            </if>
        </where>
 </select>

控制台输出结果:

动态标签之foreach标签

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

QueryVo类:

public class QueryVo {
    
    
    private User user;
    private List<Integer> ids;

    public User getUser() {
    
    
        return user;
    }

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

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

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

持久层Dao接口:

List<User> findUserInIds(QueryVo vo);

持久层Dao映射配置:

<select id="findUserInIds" resultMap="userMap" parameterType="com.review.domain.QueryVo">
        select * from user
<!--    <include refid="defaultUser"></include>-->
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

测试类:

 @Test
    public void testFindInIds(){
    
    
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(41);
        list.add(42);
        list.add(46);
        vo.setIds(list);

        //5.执行查询所有方法
        List<User> users = userDao.findUserInIds(vo);
        for(User user : users){
    
    
            System.out.println(user);
        }
    }

控制台输出结果:

Mybatis中简化编写的SQL片段

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

<sql id="defaultUser">
        select * from user
</sql>

引用代码片段:

<select id="findUserByCondition" resultMap="userMap" parameterType="com.review.domain.User">
        <!-- 简化重复的sql语句-->
        <include refid="defaultUser"></include>
        <where>
            <if test="username!=null and username != ''">
                and username like #{username}
            </if>
            <if test="sex != null">
                and sex like #{sex}
            </if>
        </where>
    </select>

猜你喜欢

转载自blog.csdn.net/weixin_43514899/article/details/107787491