MyBatis参数传入集合之foreach动态sql
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔符,close表示以什么結束,在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:?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);
} 測試方法(未貼完整代碼): @Test?
??? 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node创建web静态服务
- 下一篇: sizeof和strlen的区别