Mybatis之动态sql

来源:互联网 发布:家庭复式记账软件 编辑:程序博客网 时间:2024/05/22 00:50

Mybatis之动态sql

  • Mybatis之动态sql
    • if标签
    • where标签
    • trim标签
    • foreach 标签
    • set标签
    • Sql片段

Mybatis的动态SQL通过 if, choose, when, otherwise, trim, where, set, foreach标签,组合成非常灵活的SQL语句,从而提高开发人员的效率。

if标签

<!-- 根据条件查询用户 --><select id="findUserByWhere" parameterType="user" resultType="user">    SELECT id, username, birthday, sex, address FROM `user`    WHERE 1=1    <if test="sex != null and sex != ''">        AND sex = #{sex}    </if>    <if test="username != null and username != ''">        AND username LIKE        '%${username}%'    </if></select>

注意字符串类型的数据需要要做不等于空字符串校验。

上面的sql还有where 1=1 这样的语句,很麻烦

可以使用where标签进行改造UserMapper.xml,如下

where标签

<!-- 根据条件查询用户 --><select id="findUserByWhere" parameterType="user" resultType="user">    SELECT id, username, birthday, sex, address FROM `user`<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->    <where>        <if test="sex != null">            AND sex = #{sex}        </if>        <if test="username != null and username != ''">            AND username LIKE            '%${username}%'        </if>    </where></select>

trim标签

<trim prefix="WHERE" prefixOverrides="AND |OR ">  ... </trim>

当WHERE后紧随AND或则OR的时候,就去除AND或者OR。

foreach 标签

UserMapper.xml添加sql,如下:

<!-- 根据ids查询用户 --><select id="findUserByIds" parameterType="queryVo" resultType="user">    SELECT * FROM `user`    <where>        <!-- foreach标签,进行遍历 -->        <!-- collection:遍历的集合,这里是QueryVo的ids属性 -->        <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->        <!-- open:在前面添加的sql片段 -->        <!-- close:在结尾处添加的sql片段 -->        <!-- separator:指定遍历的元素之间使用的分隔符 -->        <foreach collection="list" item="id" open="id IN (" close=")"            separator=",">            #{id}        </foreach>    </where></select>

测试方法如下图:

@Testpublic void testFindUserByIds() {    // mybatis和spring整合,整合之后,交给spring管理    SqlSession sqlSession = this.sqlSessionFactory.openSession();    // 创建Mapper接口的动态代理对象,整合之后,交给spring管理    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);    // 使用userMapper执行根据条件查询用户    List<Integer> ids = new ArrayList<>();    ids.add(1);    ids.add(10);    ids.add(24);    List<User> list = userMapper.findUserByIds(ids);    for (User u : list) {        System.out.println(u);    }    // mybatis和spring整合,整合之后,交给spring管理    sqlSession.close();}

set标签

<update id="updateUser" parameterType="User">           update user set            <if test="name != null">               name = #{name},           </if>            <if test="password != null">               password = #{password},           </if>            <if test="age != null">               age = #{age}           </if>            <where>               <if test="id != null">                   id = #{id}               </if>               and deleteFlag = 0;           </where></update>

如果只有name不为null, 那么这SQL就成了 update set name = #{name}, where …….. ? name后面那逗号会导致出错。

可以通过set标签改造:

<update id="updateUser" parameterType="User">           update user        <set>          <if test="name != null">name = #{name},</if>              <if test="password != null">password = #{password},</if>              <if test="age != null">age = #{age},</if>         </set>           <where>               <if test="id != null">                   id = #{id}               </if>               and deleteFlag = 0;           </where></update>

这个用trim 可表示为:

<trim prefix="SET" suffixOverrides=",">  ...</trim>

WHERE是使用的 prefixOverrides(前缀), SET是使用的 suffixOverrides (后缀)!

Sql片段

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

把上面例子中的id, username, birthday, sex, address提取出来,作为sql片段,如下:

<!-- 根据条件查询用户 --><select id="findUserByWhere" parameterType="user" resultType="user">    <!-- SELECT id, username, birthday, sex, address FROM `user` -->    <!-- 使用include标签加载sql片段;refid是sql片段id -->    SELECT <include refid="userFields" /> FROM `user`    <!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 -->    <where>        <if test="sex != null">            AND sex = #{sex}        </if>        <if test="username != null and username != ''">            AND username LIKE            '%${username}%'        </if>    </where></select><!-- 声明sql片段 --><sql id="userFields">    id, username, birthday, sex, address</sql>

如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace

原创粉丝点击