MyBatis的动态Sql语句

MyBatis的动态Sql语句

1、< if >

根据实体类的不同取值,使用不同的SQL够来进行查询。

  • 持久层Dao接口
    /*
     * 根据用户信息,查询用户表
     * @param userName
     * @return
     * */
    List<User>findByUser(User user);
  • 持久层Dao映射配置
    <!--配置根据用户信息查询-->
    <select id="findByUser" parameterType="com.oceanstar.domain.User" resultType="com.oceanstar.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 = #{sex}
        </if>;
    </select>
  • 测试
    @Test
    public void testFindByUser(){
        User u = new User();
        u.setUsername("%王%");
        u.setSex("女");
        List<User> users =   iUserDao.findByUser(u);
        for (User user : users){
            System.out.println(user);
        }
    }

2、< where >

为了简化上面where 1=1的条件拼装,我们可以使用< where >

  • 持久层Dao映射配置
    <!--配置根据用户信息查询-->
    <select id="findByUser" parameterType="com.oceanstar.domain.User" resultType="com.oceanstar.domain.User">
        select * from user
        <where>
            <if test="username != null and username  != ''">
                and username like #{username}
            </if>
            <if test="sex != null">
                and sex = #{sex}
            </if>
        </where>
    </select>

3、< foreach >

传入多个id查询用户信息,可以这样写

SELECT * FROM `user` where id = 42 or id = 43;
select * from `user` where id in (42, 43);

即:在进行范围查询时,就要将一个集合中的值,作为参数动态添加尽量
问:如何进行参数的传递?

  • 在QueryVo中加入一个List集合用于封装参数
/*
* 查询条件对象
* */
public class QueryVo implements Serializable {
    private List<Integer> ids;

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

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

  • 持久层Dao接口
    /*
     * 根据id集合,查询用户表
     * @param userName
     * @return
     * */
    List<User>findInIds(QueryVo vo);
  • 持久层Dao映射配置
    <select id="findInIds" parameterType="com.oceanstar.domain.QueryVo" resultType="com.oceanstar.domain.User">
        select * from user
        <where>
            <if test="ids != null and ids.size() > 0">
                <!--colletions表示要遍历的集合元素,open表示语句的开始部分,close表示结束部分-->
                <foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

  • 测试
    public void testFindInIds(){
        QueryVo vo = new QueryVo();
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(41);
        ids.add(42);
        ids.add(43);
        vo.setIds(ids);

        List<User> users =  iUserDao.findInIds(vo);
        for (User user : users){
            System.out.println(user);
        }
    }

4、Sql重用

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

  • 定义代码片段
    <sql id="defaultSql">
        select * from user
    </sql>
  • 引用代码片段
    <!--配置根据id查询-->
    <select id="findById" parameterType="java.lang.Integer" resultType="com.oceanstar.domain.User">
        <include refid="defaultSql"></include>
        where id = #{aaaa}
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值