码迷,mamicode.com
首页 > 数据库 > 详细

mybatis动态sql——(六)

时间:2017-08-06 19:26:31      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:aupe   atq   idf   ipo   下标   iii   ilo   euc   gui   

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——(六)

标签:aupe   atq   idf   ipo   下标   iii   ilo   euc   gui   

原文地址:http://www.cnblogs.com/qlqwjy/p/7295426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!