Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql(转发同上)

原地址:http://www.cnblogs.com/shanheyongmu/p/7121807.html

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

mybatis提供各种标签方法实现动态拼接sql。

1. if&where

1.2 需求

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

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

1.3 mapper.xml

<select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.UserCustom">
        SELECT * FROM USER
        <!--where可以自动去掉条件中的第一个and  -->
        <where>
            <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>
        </where>
    </select>

    <select id="findUserCount" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="int">
        SELECT count(*) FROM USER
        <!--where可以自动去掉条件中的第一个and  -->
        <where>
            <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>
        </where>
    </select>

1.4测试代码

 @Test
    public void findUserListTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //创建包装对象,设置查询条件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
        //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
//        userCustom.setSex("1");
        userCustom.setUsername("张三丰");
        userQueryVo.setUserCustom(userCustom);
        List<UserCustom> list=userMapper.findUserList(userQueryVo);
        System.out.println(list);
    }

打印的sql:如果不设置sex的值,条件不会拼接在sql中

2.sql片段

2.1 需求

将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。

2.2 定义sql片段

<!--定义sql片段
        id:sql片段的唯一标识

        经验:1.是基于单表来定义sql片段的,这样的话这个sql片段可重用性才高
            2.在sql片段中不要包括where
      -->
    <sql id="query_user_where">
        <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>

2.3 引用sql片段

在mapper.xml中定义statement中引用sql片段:

 <select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.UserCustom">
        SELECT * FROM USER
        <!--where可以自动去掉条件中的第一个and  -->
        <where>
            <!--引用sql片段的id,如果refid指定的id不在本mapper文件中,需要在前边加namespace  -->
            <include refid="query_user_where"></include>
            <!--在这里还可以引用其它的sql片段  -->
        </where>
    </select>

    <select id="findUserCount" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="int">
        SELECT count(*) FROM USER
        <!--where可以自动去掉条件中的第一个and  -->
        <where>
            <!--引用sql片段的id,如果refid指定的id不在本mapper文件中,需要在前边加namespace  -->
            <include refid="query_user_where"></include>
            <!--在这里还可以引用其它的sql片段  -->
        </where>
    </select>

3. foreach

向sql传递数组或List,mybatis使用foreach解析。

3.1 需求

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

sql语句如下,两种方法:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

SELECT * FROM USER WHERE id IN(1,10,16)

3.2 在输入参数类型中添加List<Integer> ids传入多个id

3.3 修改mapper.xml

WHERE id=1 OR id=10 OR id=16

在前面的查询条件中,查询条件定义成了一个sql片段,现在我们需要修改sql片段。

 <!--定义sql片段
        id:sql片段的唯一标识

        经验:1.是基于单表来定义sql片段的,这样的话这个sql片段可重用性才高
            2.在sql片段中不要包括where
      -->
    <sql id="query_user_where">
        <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遍历传入的ids
                    collection:指定输入对象中集合属性
                    item:每个遍历生成的对象名
                    open:开始遍历时拼接的串
                    close:结束遍历时拼接的串
                    separator:遍历的两个对象中需要拼接的串
                 -->
                 <!--是要实现下边的sql拼接:
                     AND (id=1 OR id=10 OR id=16)
                   -->
                <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
                    <!--每个遍历需要拼接的串  -->
                    id=#{user_id}
                </foreach>
            </if>
        </if>
    </sql>

3.4 测试代码

 @Test
    public void findUserListTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //创建包装对象,设置查询条件
        UserQueryVo userQueryVo=new UserQueryVo();
        UserCustom userCustom=new UserCustom();
        //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
//        userCustom.setSex("1");
        userCustom.setUsername("小明");
        //传入多个id
        List<Integer> ids=new ArrayList<>();
        ids.add(1);
        ids.add(10);
        ids.add(16);
        userQueryVo.setIds(ids);
        userQueryVo.setUserCustom(userCustom);
        List<UserCustom> list=userMapper.findUserList(userQueryVo);
        System.out.println(list);
    }

转载自 http://www.cnblogs.com/Joanna-Yan/p/6908763.html

时间: 2024-10-11 04:50:54

Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql(转发同上)的相关文章

Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射 mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sq

Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--SpringMVC和MyBatis整合 1.商品修改功能开发 1.1需求 操作流程: (1)进入商品查询列表页面: (2)点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询),  要修改的商品从数据库查询,根据商品id(主键)查询商品信息: (3)在商品修改页面,修改商品信息,修改后,

Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇) 本文主要内容: (1)SpringMVC校验 (2)数据回显 (3)异常处理器 (4)图片上传 (5)Json数据交互 (6)支持RESTful 1.SpringMVC校验 1.1校验理解 项目中,通常使用较多的是前端的校验,比如页面中js校验.对于安全要求较高的

Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发 MyBatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) setting(全局配置参数) typeAliases(类名别名) typeHandlers(类名处理器) objectFactory(对

Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十)--MyBatis逆向工程 1.什么SpringMVC Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一个模块.SpringMVC和Spring无需通过中间整合层进行整合. SpringMVC是一个基于mvc的web框架. 2.mvc在b/s系统下的应用 (1)用户发

Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发(转发同上)

前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 原地址:http://www.cnblogs.com/shanheyongmu/p/7121016.html 使用MyBatis开发Dao,通常有两种方法,即原始Dao开发方法和Mapper接口开发方法. 1.SqlSession使用范围 1.1 SqlsessionFactoryBuilder 通过SqlSessionFac

Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(九)--MyBatis和Spring整合 使用官方网站的mapper自动生成工具mybatis-generator-core-1.3.2来生成po类和mapper映射文件. 1.什么是逆向工程 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程可以针对单表自动生成mybatis执行所需要

Spring+SpringMVC+MyBatis深入学习及搭建(十四)——SpringMVC和MyBatis整合

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7010363.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十三)--SpringMVC入门程序(二) 1.需求 使用springmvc和mybatis完成商品列表查询. 2.整合思路 springmvc+mybatis的系统架构: 第一步:整合dao层 mybatis和spring整合,通过spring管理mapper接口. 使用mapper的扫描器自动扫描mappe

Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

1.什么是查询缓存 mybatis提供查询缓存,用于减轻数据库压力,提高数据库性能. mybatis提供一级缓存和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据.不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的. 二级缓存是mapper级别的缓存,多个sqlSession去操作同一个Mapper的sql语句,多个sqlSession可以共用二级缓存,二级缓存