MyBatis参数传入集合之foreach动态sql
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
- 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
public class Employees {
private Integer employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private Date hireDate;
private String jobId;
private BigDecimal salary;
private BigDecimal commissionPct;
private Integer managerId;
private Short departmentId;
}
映射文件:
<!--List:forech中的collection属性类型是List,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
<select id="getEmployeesListParams" resultType="Employees">
select *
from EMPLOYEES e
where e.EMPLOYEE_ID in
<foreach collection="list" item="employeeId" index="index"
open="(" close=")" separator=",">
#{employeeId}
</foreach>
</select>
<!--Array:forech中的collection属性类型是array,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
<select id="getEmployeesArrayParams" resultType="Employees">
select *
from EMPLOYEES e
where e.EMPLOYEE_ID in
<foreach collection="array" item="employeeId" index="index"
open="(" close=")" separator=",">
#{employeeId}
</foreach>
</select>
<!--Map:不单单forech中的collection属性是map.key,其它所有属性都是map.key,比如下面的departmentId -->
<select id="getEmployeesMapParams" resultType="Employees">
select *
from EMPLOYEES e
<where>
<if test="departmentId!=null and departmentId!=''">
e.DEPARTMENT_ID=#{departmentId}
</if>
<if test="employeeIdsArray!=null and employeeIdsArray.length!=0">
AND e.EMPLOYEE_ID in
<foreach collection="employeeIdsArray" item="employeeId"
index="index" open="(" close=")" separator=",">
#{employeeId}
</foreach>
</if>
</where>
</select>
Mapper类:
public interface EmployeesMapper {
List<Employees> getEmployeesListParams(List<String> employeeIds);
List<Employees> getEmployeesArrayParams(String[] employeeIds);
List<Employees> getEmployeesMapParams(Map<String,Object> params);
}
public void testGetEmployeesListParams() {
List<String> employeeIds = Arrays.asList("100", "101", "200");
List<Employees> result = employeesMapper
.getEmployeesListParams(employeeIds);
assertEquals(3, result.size());
}
@Test
public void testGetEmployeesArrayParams() {
String[] employeeIds = new String[] { "100", "200" };
List<Employees> result = employeesMapper
.getEmployeesArrayParams(employeeIds);
assertEquals(2, result.size());
}
@Test
public void testGetEmployeesMapParams() {
String departmentId = "60";
List<String> employeeIdsList = Arrays.asList("103", "104", "105");
String[] employeeIdsArray = new String[] { "103", "104" };
// 传入多个参数
Map<String, Object> params = new HashMap<String, Object>();
params.put("departmentId", departmentId);
params.put("employeeIdsList", employeeIdsList);
params.put("employeeIdsArray", employeeIdsArray);
List<Employees> result = employeesMapper.getEmployeesMapParams(params);
assertEquals(3, result.size());
}
package com.ydssy.dao.product;
import java.util.List;
import java.util.Map;
import com.ydssy.model.product.ProductStore;
public interface ProductStoreMapper {
//接口 传入一个集合
List<ProductStore> parameterlist(String[] s);
}
映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ydssy.dao.product.ProductStoreMapper" >
<!--Array:forech中的collection属性类型是array,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
<select id="parameterlist" parameterType="com.ydssy.model.product.ProductStore" resultType="com.ydssy.model.product.ProductStore">
select ps.* from es_product_store ps where ps.goodsid in<foreach collection="array" item="employeeId" index="index" open="(" close=")" separator=",">
#{employeeId}
</foreach>
</select>
</mapper>
测试类
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.ydssy.dao.product.ProductStoreMapper;
import com.ydssy.model.product.ProductStore;
public class TestProductStoreMapper {
private SqlSession session;
private ProductStoreMapper dao;
@Before// @Before在··之前
public void init() {
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// SqlSessionFactory通过SqlSessionFactoryBuilder的ssfb方法里的类加载器的getResourceAsStream方法获取配置文件信息
//getResourceAsStream会创建一个流 通过这个流去获取配置文件,这个文件会返回一个importString这个流
SqlSessionFactory ssf = ssfb.build(TestProductStoreMapper.class.getClassLoader().getResourceAsStream("com/ydssy/goods/goods.xml"));
// 获得SqlSession对象
// (SqlSession是执行sql的一个容器 通过session访问数据库)。
session = ssf.openSession();
//用session对象去获取接口 ,getMapper方法会返回符合Tapper映射器( 即EmployeeDAO 接口) 要求的对象
dao = session.getMapper(ProductStoreMapper.class);
}
@Test
public void test3() {
String[] s = new String[] { "516","518" };
List<ProductStore> result = dao.parameterlist(s);
System.out.println(result);
session.commit();
session.close();
}
}
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql:///symall_emoji?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=true" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers><!-- 配置文件连接 映射器文件 -->
<mapper resource="com/ydssy/mapping/goods/GoodsCatMapper.xml" />
<mapper resource="com/ydssy/mapping/product/ProductStoreMapper.xml" />
</mappers>
</configuration>
包
转载于:https://www.cnblogs.com/mxcl/p/8318463.html
MyBatis参数传入集合之foreach动态sql相关推荐
- mybatis入门(四)之动态SQL
转载自 mybatis 动态SQL 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦. ...
- Mybatis学习日记(四)——动态SQL第一部分
Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...
- c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...
目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...
- Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...
- MyBatis学习笔记(六)动态sql
在一些情况下,如查询参数不确定时,需要用到动态sql 例子,根据动态输入的查询条件查询student. 一.if语句 1.StudentTMapper [html] view plain copy p ...
- 【Mybatis 之应用篇】 4_动态SQL、缓存
文章目录 Mybatis 十二.动态SQL 1.IF 2.choose(when,otherwise) 3.where,set 4.SQL片段 5.Foreach 十三.缓存 (了解) 1.简介 2. ...
- 【MyBatis】学习纪要六:动态SQL
2019独角兽企业重金招聘Python工程师标准>>> 引言 动态SQL:Dynamic SQL. 本节我们来通过 MyBatis 的官方文档进行学习. Description(描述 ...
- mybatis中mapper文件中的动态sql语句
有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...
- mybatis的注解开发之三种动态sql
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
最新文章
- 全球五大顶级域名一周统计 .BIZ环比上升7.3%
- opencv转pytorch
- 第九届河南理工大学算法程序设计大赛 正式赛(ABCDEFGHJKL)
- js cookies 存数组_用一个例子理解JS函数的底层处理机制
- WAR文件与具有嵌入式服务器的Java应用程序
- Jsoup使用DOM方法来遍历一个文档
- linux设备模型之tty驱动架构分析,linux设备模型之uart驱动架构分析
- 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
- linux中的文本处理方法集锦
- 企业微信分享小程序功能
- 网络百科——网络接口卡
- 分析与提取QQ木马盗号技术
- 【图的表示】:如何存储微博、微信等社交网络中的好友关系?
- 命令行实现URL编解码
- .Net6.0系列-6 .Net 6LinQ(二)常用扩展方法
- layui 读取本地excel内容_layui-excel
- win7下设置 WiFi AP
- CentOS 7.2 添加磁盘并创建新区
- 【OpenCV 学习笔记】第二十章: 角点检测之:harris算法以及Shi-Tomasi算法
- Docker快速入门与使用