MyBatis动态参数为数组、list、Map,并使用oder by给结果排序

原创 2016年05月30日 11:31:31

在使用Mybatis时,传入的参数有可能为数组、链表和Map,如果参数为数组或链表,主要使用foreach标签来进行迭代处理,以下给出示例:
实体类

public class TestResult {
    private Integer resultId;
    private Date startTime;
    ...
    private Integer taskId;
    private Integer deviceId;
    ...
}

映射文件
1.数组
传入参数为数组,Mapper.xml文件中为:

<select id="selectByTaskIds" resultType="TestResult">
    SELECT
    *
    FROM t_test_result
    WHERE fk_task_id IN
    <foreach collection="array" item="taskIds" index="index" open="(" separator="," close=")">
        #{taskIds}
    </foreach>
</select>

foreach标签中,collection的值为array。

2.List
传入参数为List,则Mapper.xml文件中为:

<select id="selectByTaskIds" resultType="TestResult">
    SELECT
    *
    FROM t_test_result
    WHERE fk_task_id IN
    <foreach collection="list" item="taskIds" index="index" open="(" separator="," close=")">
        #{taskIds}
    </foreach>
</select>

foreach标签中,collection的值为list。
由上可知,根据参数类型的不同,foreach标签里面的collection值也不同,数组为array,List为list。其中 item的值可以任意取名,但是必须与#{}里面的值一样
建议使用mybatis-generator直接生成dao(后续添加链接),然后再添加其他功能。

3.Map
传入参数为Map,

<select id="getResultsMapParmas" resultType="TestResult">
        SELECT
        *
        FROM t_test_result
        <if test="taskIds != null and taskIds.size != 0">
            WHERE fk_task_id IN
            <foreach collection="taskIds" item="taskIds" index="index" open="(" separator="," close=")">
                #{taskIds}
            </foreach>
        </if>
        <if test="orderName != null and orderName != ''">
            ORDER BY ${orderName} DESC
        </if>
        <if test="startRow != null and pageSize != null and pageSize != ''">
            limit #{startRow},#{pageSize}
        </if>
    </select>

测试类

@Test
public void testGetResultsMapParmas(){

    //参数是数组,则在xml文件中if判断时,taskIds.length != 0
//    int[] array = new int[5];
//    array[0] = 9;
//    array[1] = 12;

    //参数是列表,则在xml文件中if判断时,taskIds.size != 0
    List<Integer> taskIds = new ArrayList<>();
    taskIds.add(9);
    taskIds.add(12);

    Map<String, Object> params = new HashMap<>();
    String orderName = "start_time";
    params.put("taskIds",taskIds);
    params.put("orderName", orderName);
    //设置分页,startRow可以为0,pageSize不能为0
    params.put("startRow", 0);
    params.put("pageSize",1);

    List<TestResult> results = testResultDao.getResultsMapParmas(params);
    for(TestResult result : results){
        System.out.println("resultId:" + result.getResultId() + " ** startTime:" + result.getStartTime());
    }
}

由上面的映射文件与单元测试方法可以看出, 如果Map中value为数组或者链表,那么在foreach标签中的collection值必须与它的key值一样,否则会报错。当value为数组时,在if标签中判断时为taskIds.length != 0,当value为链表时,则在if标签中判断时为taskIds.size != 0
如果使用mybatis-generator自动生成dao,则可以对某张表配置enableSelectByExample=”true”,然后使用Example来传入List参数,并添加其他条件。

4.Order by排序
在使用order by对查询结果进行排序时,要使用${}把列名括起来 ORDER BY ${orderName} ,否则排序无效。原因可以参考mybatis中的#和$的区别。其实我们在进行单元测试的时候,将日志输出级别调为DEBUG,运行测试,然后在控制台查看SQL语句,就可以看到,当使用${}时,为ORDER BY start_time DESC,当使用#{}时,为OEDER BY ? DESC。

版权声明:本文为博主原创文章,可以转载,互相学习、促进。

相关文章推荐

MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 用$传参时,直接将参数的值放在sql语句中,如:

SELECT * FROM                       (SELECT A.*, ROWNUM RN FROM                             (SELEC...

MyBatis动态参数排序的注意事项

文章来源:http://blog.csdn.net/weibing_huang/article/details/7368556 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处...
  • cktmyh
  • cktmyh
  • 2015年11月09日 11:28
  • 2564

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符...

Mybatis,Order By排序问题

曾写过一篇博客,是接触了一段时间的mybatis开发总结的:《Mybatis,怀疑--使用--感悟》。又过去了一段时间,前不久和别人联调接口,遇到了mybatis的排序问题。这篇博客就来总结一下,在m...

Mybatis,Order By排序问题

转自:http://blog.csdn.net/hu_zhiting/article/details/53026448     曾写过一篇博客,是接触了一段时间的mybatis开发总结的:《Mybat...

解决mybatis动态传入order by 参数的时候不生效的问题

字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的...

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#, #{}和${}的区别以及order by注入问题

ORDER BY ${columnName} 这里MyBatis不会修改或转义字符串。 重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你...

Mybatis 中的 List Array Map 的foreach 、in

在mybatis 的配置文件中我们经常会用到集合 数组以及map的批量查询,这样我们就会经常用到 foreach 了,首先来看看foreach的属性: 这张图写的很全,很好就那个了你知道的…… 知...
  • QH_JAVA
  • QH_JAVA
  • 2016年02月27日 13:57
  • 8976

MyBatis参数传入集合之foreach动态sql

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。ite...

Mybatis动态Sql的Foreach遍历拼接输入参数中的List或数组

pojo、pojo包装类 public class User { private int id; private String username; private String sex; p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MyBatis动态参数为数组、list、Map,并使用oder by给结果排序
举报原因:
原因补充:

(最多只允许输入30个字)