java-mybaits-00402-Mapper-动态sql

1、动态sql(重点)

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

什么是动态sql

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

需求

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

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

1.1、If

  <!-- 传递pojo综合查询用户信息 -->
    <select id="findUserList" parameterType="user" resultType="user">
       select * from user
       where 1=1
       <if test="id!=null and id!=‘‘">
       and id=#{id}
       </if>
       <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
       </if>
    </select>

注意要做不等于空字符串校验。

注意直接是属性,不用类名.属性

1.2、Where

上边的sql也可以改为:

   <select id="findUserList" parameterType="user" resultType="user">
       select * from user
       <where>
       <if test="id!=null and id!=‘‘">
       and id=#{id}
       </if>
       <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
       </if>
       </where>
    </select>

<where />可以自动处理第一个and。

1.3、foreach

向sql传递数组或List,mybatis使用foreach解析,如下:

1.3.1、通过pojo传递list

  • 需求

传入多个id查询用户信息,用下边两个sql实现:

SELECT * FROM USERS WHERE username LIKE ‘%张%‘ AND (id =10 OR id =89 OR id=16)

SELECT * FROM USERS WHERE username LIKE ‘%张%‘  id IN (10,89,16)

  • 在pojo中定义list属性ids存储多个用户id,并添加getter/setter方法

  

  mapper.xml

<if test="ids!=null and ids.size>0">
  <foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
    #{id}
  </foreach>
</if>

  测试代码:

List<Integer> ids = new ArrayList<Integer>();
ids.add(1);//查询id为1的用户
ids.add(10); //查询id为10的用户
queryVo.setIds(ids);
List<User> list = userMapper.findUserList(queryVo);

1.3.2、传递单个List

传递List类型在编写mapper.xml没有区别,唯一不同的是只有一个List参数时它的参数名为list。

如下:mapper.xml

<select id="selectUserByList" parameterType="java.util.List"
        resultType="com.lhx.mybatis.po.User">
        select * from user
        <where>
            <!-- 传递List,List中是pojo -->
            <if test="list!=null">
                <foreach collection="list" item="item" open="and id in("
                    separator="," close=")">
                    #{item.id}
                </foreach>
            </if>
        </where>
    </select>

mapper接口

public List<User> selectUserByList(List<User> userlist) throws Exception;

测试类

    public void testselectUserByList() throws Exception {
        // 获取session
        SqlSession session = sqlSessionFactory.openSession();
        // 获限mapper接口实例
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 构造查询条件List
        List<User> userlist = new ArrayList<User>();
        User user = new User();
        user.setId(1);
        userlist.add(user);
        user = new User();
        user.setId(2);
        userlist.add(user);
        // 传递userlist列表查询用户列表
        List<User> list = userMapper.selectUserByList(userlist);
        System.out.println(list.size()+"");
        // 关闭session
        session.close();
    }

1.3.3、传递单个数组(数组中是pojo):

mapper.xml

    <!-- 传递数组综合查询用户信息 -->
    <select id="selectUserByArrayPojo" parameterType="Object[]"
        resultType="com.lhx.mybatis.po.User">
        select * from user
        <where>
            <!-- 传递数组 -->
            <if test="array!=null">
                <foreach collection="array" index="index" item="item" open="and id in("
                    separator="," close=")">
                    #{item.id}
                </foreach>
            </if>
        </where>
    </select>

mapper接口

    public List<User> selectUserByArrayPojo(Object[] userlist) throws Exception;

测试代码

    public void testselectUserByArray() throws Exception {
        // 获取session
        SqlSession session = sqlSessionFactory.openSession();
        // 获限mapper接口实例
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 构造查询条件List
        Object[] userlist = new Object[2];
        User user = new User();
        user.setId(1);
        userlist[0] = user;
        user = new User();
        user.setId(2);
        userlist[1] = user;
        // 传递user对象查询用户列表
        List<User> list = userMapper.selectUserByArrayPojo(userlist);
        // 关闭session
        session.close();
    }

1.3.4、传递单个数组(数组中是字符串类型):

mapper.xml

    <!-- 传递数组综合查询用户信息 -->
    <select id="selectUserByArray" parameterType="Object[]"
        resultType="com.lhx.mybatis.po.User">
        select * from user
        <where>
            <!-- 传递数组 -->
            <if test="array!=null">
                <foreach collection="array" index="index" item="item" open="and id in("
                    separator="," close=")">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>

mapper接口

public List<User> selectUserByArray(Object[] userlist) throws Exception;

测试代码

    public void testselectUserByArray() throws Exception {
        // 获取session
        SqlSession session = sqlSessionFactory.openSession();
        // 获限mapper接口实例
        UserMapper userMapper = session.getMapper(UserMapper.class);
        // 构造查询条件List
        Object[] userlist = new Object[2];
        userlist[0] = "1";
        userlist[1] = "2";
        // 传递user对象查询用户列表
        List<User> list = userMapper.selectUserByArray(userlist);
        // 关闭session
        session.close();
    }

1.4、Sql片段

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的,方便程序员进行开发如下:

<!-- 传递pojo综合查询用户信息 -->
    <select id="findUserList" parameterType="user" resultType="user">
       select * from user
       <where>
       <if test="id!=null and id!=‘‘">
       and id=#{id}
       </if>
       <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
       </if>
       </where>
    </select>

将where条件抽取出来

<sql id="query_user_where">
    <if test="id!=null and id!=‘‘">
       and id=#{id}
    </if>
    <if test="username!=null and username!=‘‘">
       and username like ‘%${username}%‘
    </if>
</sql>

使用include引用

<select id="findUserList" parameterType="user" resultType="user">
       select * from user
       <where>
       <include refid="query_user_where"/>
       </where>
    </select>

注意:

1.如果引用其它mapper.xml的sql片段,则在引用时需要加上namespace,如下:

<include refid="namespace.sql片段”/>

2.经验,是基于单表定有的sql片段,这样sql可重用性高

3.一般不添加where,方便引用多个片段

时间: 2024-08-01 22:37:08

java-mybaits-00402-Mapper-动态sql的相关文章

Java下拼接执行动态SQL语句(转)

在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.csdn.net/topics/390981627 https://www.linkedin.com/groups/SQL-Query-Help-needed-137774.S.5948812806903119877?trk=groups_items_see_more-0-b-ttl http://bb

Java下拼接执行动态SQL语句

Java拼接动态SQL的一般做法有       1.使用动态语句 很多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句.MSSQL的EXEC和SP_EXECUTESQL.Mysql的预处理语句等.这些功能让我们在数据库端来处理动态查询提供了极大遍历,但这种方式只适用于相对简单地动态查询,复杂的情况经常会采用下面的方式. 2.使用存储过程 对于复杂的情况,一般会在存储过程中来拼接动态SQL.使用存储过程完成相对灵活,但编码复杂度过高,有时运行效率较低. 3

mybaits深入浅出之动态 SQL(四)

上一篇文章:  mybaits入门demo映射文件详解(三) 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL 能力.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 字符串有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意映射的 SQ

Mybaits(7) Mybatis动态 SQL

1.概述 我们在使用JDBC或者类似Hibernate的其他框架时,需要根据需求去拼装sql,这是很烦的一件事情.有时一个查询有许多查询条件,有时需要控制有点条件为空的情况,我们使用其他框架进行大量的Java代码进行判断,可读性差,而Mybatis框架提供了对sql语句动态组装能力,使用xml的几个简单元素便可完成sql相应的功能.大量的判断可以MyBatis的映射配置文件xml中进行配置,大大减少了代码量,同时也可以在注解中配置sql,但由于注解功能受限,对复杂sql可读性差,所以很少使用.

MyBatis知多少(25)动态SQL

使用动态查询是MyBatis一个非常强大的功能.有时你已经改变WHERE子句条件的基础上你的参数对象的状态.在这种情况下的MyBatis提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的动态SQL标签. 所有的逻辑是使用一些额外的标签放在:XML文件.下面是一个例子,其中的SELECT语句将努力在两个方面: 如果想传递一个ID,然后它会返回所有与该ID的记录, 否则,将返回所有雇员ID为NULL的记录. <?xml version="1.0" encoding=&q

java mybatis学习之$和#区别,mapper代理接口,动态SQL,在日志中输出mybatis的sql语句

1.在mybatis中,$和#的区别: #{}:表示一个预处理参数,参数类型不定,是根据传入的参数类型来设定的.类似于JDBC中的? 特例使用,模糊查询:(针对oracle): and username like concat(concat('%',#{username}),'%') ${}:相当于是我们的JDBC里的字符串拼接.这里就相当于传入的就是一个字符串(不管传入什么样的数据类型,都是字符串) and username like '%${value}%' 2.$和#在mybatis中的优

[刘阳Java]_MyBatis_动态SQL标签用法_第7讲

1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwise) trim where set foreach 可以看出MyBatis的动态SQL的标签元素和接近JSP中的JSTL语法,下面我就分别详细的介绍一下 3.动态SQL中if的用法 <?xml version="1.0" encoding="UTF-8" ?&g

Java SSM框架之MyBatis3(八)MyBatis之动态SQL

前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 创建User表 /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `username` varchar(20

mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 a

mybatis 动态sql语句

mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的