首页 > 代码库 > mybatis动态sql——(六)

mybatis动态sql——(六)

0     什么是动态sql

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

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

  技术分享

 

-------------------------------if,where--------------------------------------

 

 

1.问题描述

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

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

2.    mapper.xml

技术分享

3.    测试代码

技术分享

 

-----------------------------------------sql片段-------------------------------------------------

1.需求

将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。

方便程序员进行开发。

技术分享

 

 

2.     定义sql片段

技术分享

3.     引用sql片段

技术分享

 

  ------------------------------------------foreach---------------------------------

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

1. 通过pojo传递list

1.1  需求:

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

 

两种方法:

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

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

 

 

1.2  方法:

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

技术分享

1.3   mapper.xml  

  修改上面的sql片段

<!-- 定义sql片段    id:sql片段的唯 一标识        经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高    在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>                        <!-- 实现  “ and id IN(1,10,16)”拼接 -->            <!-- <foreach collection="ids" item="user_id" open="and id IN(" close=")" separator=",">                每个遍历需要拼接的串                #{user_id}            </foreach> -->                        </if>        </if>    </sql>

 

引用sql片段:

<!-- 用户信息综合查询    #{userCustom.sex}:取出pojo包装对象中性别值    ${userCustom.username}:取出pojo包装对象中用户名称     -->    <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo"             resultType="cn.itcast.mybatis.po.UserCustom">    SELECT * FROM USER    <!--     where可以自动去掉条件中的第一个and     -->    <where>        <!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->        <include refid="query_user_where"></include>        <!-- 在这里还要引用其它的sql片段  -->    </where>                    </select>

 

 

 

1.4     另外一个sql的实现:

 

技术分享

 

2.   传递单个List

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

2.1  Mapper.xml

<select id="selectUserByList" parameterType="java.util.List" resultType="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>

 

2.2   Mapper接口

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

 

2.3 测试

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);        //关闭session        session.close();    }

3.  传递单个数组(数组中是pojo):

3.1    Mapper.xml

 

<!-- 传递数组综合查询用户信息 -->    <select id="selectUserByArray" parameterType="Object[]" resultType="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>

 

 

sql只接收一个数组参数,这时sql解析参数的名称mybatis固定为array,如果数组是通过一个pojo传递到sql则参数的名称为pojo中的属性名。

index:为数组的下标。

item:为数组每个元素的名称,名称随意定义

open:循环开始

close:循环结束

separator:中间分隔输出

 

 3.2   Mapper接口:

 

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

 

 

3.3  测试:

 

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.selectUserByArray(userlist);       //关闭session       session.close();    }

 

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

4.1   Mapper.xml

 

<!-- 传递数组综合查询用户信息 -->    <select id="selectUserByArray" parameterType="Object[]" resultType="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>

 

如果数组中是简单类型则写为#{item},不用再通过ognl获取对象属性值了。

 

4.2  Mapper接口:

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

 

 

4.3  测试:

 

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();    }

 

mybatis动态sql——(六)