1、item表示集合中每一个元素进行迭代时的别名,
2、index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
3、open表示该语句以什么开始,
4、separator表示在每次进行迭代之间以什么符号作为分隔符,
5、close表示以什么结束,
6、collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,
主要有一下3种情况:
a、如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
b、如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
c、如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
<select id="findBy" resultMap="RfCustomerMemMap" parameterType="java.util.Map"> SELECT <include refid="Column"/> FROM rfl_customer_mem a LEFT JOIN rfl_loan b ON a.member_no = b.loan_member_no WHERE a.member_no = #{memberNo} AND b.status IN <foreach collection="status" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> <if test="name != null and name != ''"> AND name = #{name} </if> <if test="idNumber != null and idNumber != ''"> AND id_number = #{idNumber} </if> <if test="mobileNo != null and mobileNo != ''"> AND mobile_no = #{mobileNo} </if> <if test="loanNo != null and loanNo != ''"> AND loan_no = #{loanNo} </if> order by a.id DESC <if test="offset > -1 and rows > -1"> limit #{offset},#{limit} </if> </select>
public List<LoanMerchantMemEntity> findMerchantMemBy(String merchantName, String merchantNo, String socialCreditCode, String loanNo, int offset, int limit) { List<LoanMerchantMemEntity> list = new ArrayList<LoanMerchantMemEntity>(); Map<String, Object> filter = new HashMap<String, Object>(); filter.put("merchantName", merchantName); filter.put("socialCreditCode", socialCreditCode); filter.put("status", statsList()); filter.put("loanNo", loanNo); filter.put("offset", offset); filter.put("limit", limit); filter.put("merchantNo", merchantNo); try { List<LoanMerchantMemEntity> row = loanMerchantMemDao.findBy(filter); } catch (Exception e) { LOGGER.error(filter, "查询企业会员信息异常", e); } return list; } static List<String> statsList(){ List<String> statusList = new ArrayList<String>(); statusList.add("SUCCESS"); statusList.add("DUE"); statusList.add("OVER"); return statusList; }
其中,map中key为status值类型为list,这种使用场景为第三种,即collection为map中的key值
补充:当传入一个String数组后,在sql中使用foreach语句实现IN查询
当我们从前台传递过来的是一个数组是,后台我们要进行处理, 因为在数据库中表的字段类型有可能是num 或者varchar;
我这里传过来的是Map 当然也可以使用request.getparameter("name") 这个name为jsp或者htm页面中的id所对应的name,
下面代码中也是的:
String name=(String) params.get("name"); String[] hiddens = name.split(","); params.put("name", hiddens);
当我们经过这一部分的处理后,数据就存入到map中了,传入参数后进行查询
<foreach collection="name" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach>
在sql上面,我们进行查询的时候就OK啦!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。
本文向大家介绍MyBatis带参查询的方法详解,包括了MyBatis带参查询的方法详解的使用技巧和注意事项,需要的朋友参考一下 #{}占位符 类似于jdbc中通过PreparedStatement进行操作的方式, 会将sql语句中需要参数的位置使用?进行占位,后续由传进来的参数进行参数的绑定。?处绑定的都是值,不能指定表的列,转换成sql时表名会被当成字符串,会出错,防止sql注入。 简单类型参数
主要内容:一、案例,1.实际问题,2.子查询的基本使用,3.子查询的分类,二、单行子查询,1.单行比较操作符,2.代码示例,3.having中的子查询,,4.非法子查询,三、多行子查询,1.多行比较操作符,2.代码示例,四、相关子查询,1.执行流程,,2.代码示例,3.EXISTS 与 NOT EXISTS关键字,4.相关更新,5.相关删除,6.相关插入子查询指一个查询语句嵌套在另一个查询语句内部的查询。 SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中
主要内容:一、错误案例引入问题,二、多表查询的分类,1.等值连接和非等值连接,2.自连接和非自连接,3.内连接和外连接,三、实现多表查询的语法,1.内连接(INNER JOIN)的实现,2.外连接(OUTER JOIN)的实现,四、UNION的使用,五、7种SQL JOINS的实现,1.代码实现,六、SQL99语法新特性,1.自然连接,2.USING连接关联查询,也称为多表查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字
问题内容: 假设我有一个名为“ Company”的表,其中包含CompanyID关键字。还有另一个名为“ CompanyAddress”的相关表,该表具有CompanyID外键,因此可以轻松地建立联接。 该CompanyAddress表可以具有给定公司的多个地址,例如AddressType = 1或AddressType = 2 用于获取字段的联接等是微不足道的,但是我需要一个条件,在该条件下查询
问题内容: 我正在尝试使用mybatis运行一个简单的sql查询,但是它给了我以下异常 我的UserMapper.xml是 我的UserMapper是 我试图在我的LoginController中访问它 我的spring-servlet.xml文件是 我不知道为什么会出现此错误。 问题答案: 看看错误 看来myBatis找不到您的查询。那可能是因为找不到您的xml映射。它应该符合您的配置: 在项目
本文向大家介绍SQL Server中row_number分页查询的用法详解,包括了SQL Server中row_number分页查询的用法详解的使用技巧和注意事项,需要的朋友参考一下 ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于