05_mybatis动态sql

1.sql片段

1.sql片段****

mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

2.需求

用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。

对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。

3.定义sql片段**
  <!--定义sql片段-->
    <!--id:标识sql片段-->
    <!--经验:基于单表来定义sql片段,这样可以提高可重用性,一般不要包含where-->
    <sql id="query_user_where">
        <!--where 可以去掉条件中的第一个and-->
            <if test="userCustom!=null">
                <if test="userCustom.sex!=null and userCustom.sex!=''">
                    and user.sex=#{userCustom.sex}
                </if>
                <if test="userCustom.username!=null and userCustom.username!=''">
                    and user.username like '%${userCustom.username}%'
                </if>
            </if>
    </sql>
4.引用sql片段
 <select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
        select * from user
       <where>
          <!-- 引用sql片段,如果不在同一个mapper文件中,这时要加namespace-->
           <include refid="query_user_where"/>
       </where>
    </select>

2.foreach

1.需求

在用户查询列表和查询总数的statement中增加多个id输入查询。

sql语句如下:

两种方法:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
<!-- 法2-->
SELECT * FROM USER WHERE id IN(1,10,16)
2.在输入参数类型中添加List ids传入多个id**
/**
 * Description: 查询时,将多个对象的属性集合在此类
 * User: jiatp
 * Date:2019/9/3 0003 下午 4:39
*/

public class UserQueryVo {
    //用户的查询条件
    private UserCustom userCustom;
    //传入多个id
    private List<Integer> ids;
    //可以包装其它信息,商品,订单 等

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

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

    public UserCustom getUserCustom() {
        return userCustom;
    }

    public void setUserCustom(UserCustom userCustom) {
        this.userCustom = userCustom;
    }
}

3.修改mapper.xml
 <!--定义sql片段-->
    <!--id:标识sql片段-->
    <!--经验:基于单表来定义sql片段,这样可以提高可重用性,一般不要包含where-->
    <sql id="query_user_where">
        <!--where 可以去掉条件中的第一个and-->
            <if test="userCustom!=null">
                <if test="userCustom.sex!=null and userCustom.sex!=''">
                    and user.sex=#{userCustom.sex}
                </if>
                <if test="userCustom.username!=null and userCustom.username!=''">
                    and user.username like '%${userCustom.username}%'
                </if>
                <if test="ids!=null">
                    <!--<foreach collection="ids" open="and ("  close=")" item="user_id" separator="or">-->
                          <!--id=#{user_id}-->
                    <!--</foreach>-->
                    <foreach collection="ids" open="and id in("  close=")" item="user_id" separator=",">
                        #{user_id}
                    </foreach>
                </if>
            </if>
    </sql>
4.测试代码
  //综合查询,用户的所有信息 foreach
    @Test
    public void findUserListForEach(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
        //创建包装对象
        UserQueryVo userQueryVo = new UserQueryVo();
        UserCustom userCustom = new UserCustom();
        //由于设置了动态sql
         userCustom.setSex("1");
        //userCustom.setUsername("李四");
        userQueryVo.setUserCustom(userCustom);
        //加入多个id进行查询
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(10);
        ids.add(22);
        userQueryVo.setIds(ids);
        //调用查询
        List<UserCustom> userList = mapper.findUserList(userQueryVo);
        for(UserCustom us:userList) {
            System.out.println(us);
        }
    }
}

持续补充中…

posted @ 2019-09-17 18:50  杰醍奋  阅读(145)  评论(0编辑  收藏  举报