mybatis--使用in的多个参数查询。

本文介绍了一个使用 MyBatis 实现的 in 条件查询示例,包括 XML 配置文件、DAO 层及 Service 层实现,并演示了如何通过 List 或数组传递参数进行 in 条件查询。

一、xml配置文件【select_in_foreach.xml】

<?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.test.in">
	<select id="SELECT_IN" resultType="map">
		select * from JOBS
		<where>
		    <if test="other != null">
		    	JOB_TITLE = #{other,jdbcType=VARCHAR}
		    </if>
			<if test="ids != null">
				and JOB_ID in
				<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">  
					#{item}  
 				</foreach>
			
			</if>
		</where>
	
	</select>

</mapper>    



二、dao层

package com.test.dao.impl;

import java.util.List;
import java.util.Map;

import com.test.dao.IDataQuery;
import org.apache.ibatis.session.SqlSession;

public class BaseDataQueryDAO implements IDataQuery {
    private SqlSession session;
    
	public SqlSession getSession() {
		return session;
	}

	public void setSession(SqlSession session) {
		this.session = session;
	}

	 
	@SuppressWarnings("unchecked")
	@Override
	public List<Map> queryData(String str, Map map) {
		List<Map> list = this.session.selectList(str, map);
		return list;
	}

	@Override
	public Map queryDataByID(String str, Map pid) {
		Map map = (Map)this.session.selectOne(str, pid);
		return map;
	}

}


三、service层

package com.test.services.impl;

import com.test.utils.ConstantEnum;
import com.test.utils.MyBatisUtil;
import com.test.dao.impl.BaseDataQueryDAO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;

import org.apache.ibatis.session.SqlSession;

public class SelectIN extends BaseDataQueryDAO {
	//查询数据
	public String queryJobsList(){
		SqlSession session = null;
      //获取数据库连接
        session = MyBatisUtil.createSession();
        this.setSession(session);
        try {
        	<strong><span style="color:#ff6666;">Map<String, Object> params = new HashMap<String, Object>();
            //方法一,使用数组
        	//String[] ids = {"AD_PRES","AD_VP"};
        	//方法二,使用List
        	List<String> ids = new ArrayList<String>();
        	ids.add("AD_PRES");
        	ids.add("AD_VP");
            params.put("ids", ids);
            params.put("other", "President");
        	//参数map
            List<Map> map = this.queryData("com.test.in.SELECT_IN", params);</span></strong>
            if(map.isEmpty()){
                return ConstantEnum.FAILURE_SEARCHDATA;
            }
            JSONObject result = new JSONObject();
            JSONObject table = new JSONObject();
            table.put("row", map);
            result.put("datas", table);
            result.put("result", "1");
            result.put("info", "查询成功!");
            System.out.println(result);
            return result.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantEnum.ERROR_SEARCHDATA;
		}finally{
			
			MyBatisUtil.closeSession(session);
		}
		
	}
	
	//测试
	public static void main(String[] args) {
		SelectIN selectIN = new SelectIN();
		
		selectIN.queryJobsList();
		}
}

使用Map<String, Object> params = new HashMap<String, Object>();

参考

http://www.suyunyou.com/aid5.html

http://www.2cto.com/database/201301/185980.html

http://fireinjava.iteye.com/blog/1779420




<think>首先,用户的问题是关于使用MyBatis-Plus-Join进行条件查询,特别是IN条件的用法。他们问的是"MyBatis-Plus-Join IN条件查询使用方法"。 我需要回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户提供的引用是关于MyBatis-Plus-Join的: - [^1]:讨论了Mybatis-Plus-Join的连表查询,特别是对于非单一属性对象的查询使用IN查询聚合。 - [^2]:关于Mybatis-Plus-Join使用教程和环境要求。 - [^3]:分享了使用MyBatis-Plus-Join进行联表查询的体验。 - [^4]:介绍了mybatis-plus-join框架,支持连表查询- [^5]:详细描述了mybatis-plus-join的用法,包括select(), selectAs(), leftJoin()等,特别提到条件查询可以正常使用原生方法,没有SQL注入风险。 用户的问题聚焦在IN条件查询上。从引用[^1]中:"而对于非单一属性对象的查询是提供了两个注解,但底层是分成多条SQL语句采用IN查询得到结果后再聚合。" 这表明IN查询是用于处理多表查询时的聚合。 引用[^5]中提到:"条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险"。这暗示条件查询可以使用原生MyBatis-Plus方法,包括IN条件。 在MyBatis-Plus-Join中,条件查询类似于MyBatis-Plus的QueryWrapper。对于IN条件,通常使用in()方法。 所以,我的回答应该: 1. 解释如何使用MyBatis-Plus-Join进行IN条件查询。 2. 提供步骤清晰的指导。 3. 使用代码示例来演示。 4. 确保引用正确:在相关段落末尾添加引用标识。 5. 生成相关问题。 6. 整个回答用中文。 结构回答: - 开头:简要介绍MyBatis-Plus-JoinIN条件查询- 步骤:逐步解释使用方法。 - 代码示例:提供示例代码。 - 结尾:总结或注意事项。 - 生成相关问题。 使用引用: - 当提到底层实现时,引用[^1]。 - 当提到整体用法时,引用[^5]。 具体回答内容: 1. **介绍**:MyBatis-Plus-Join扩展了MyBatis-Plus,支持多表查询IN条件查询常用于筛选某个字段在值列表中的记录。 2. **方法**: - 使用QueryWrapper或类似对象。 - 调用in()方法指定字段和值列表。 - 在连表查询中,同样适用。 3. **示例**:假设我们有一个用户表和一个地址表,查询用户ID在指定列表中的用户地址。 - 代码:创建Wrapper,使用leftJoin()连接表,添加in()条件。 4. **注意事项**:确保字段正确,避免SQL注入(框架已处理)。 生成相关问题: - 基于用户查询,如:如何优化IN查询?如何处理大型IN列表?等。 最终回答格式: - 用中文。 - 段落清晰。 - 代码块用于代码。 - 在引用处添加[^n]。</think>### MyBatis-Plus-Join IN条件查询使用方法 MyBatis-Plus-Join 是一个扩展 MyBatis-Plus 的组件,支持多表关联查询和复杂条件操作。IN 条件查询用于筛选字段值在指定集合中的记录,常用于批量数据过滤(如用户 ID 列表)。以下是基于引用内容的详细使用步骤,确保语法正确且无 SQL 注入风险[^5]。 #### 步骤说明 1. **创建 Wrapper 对象**:使用 `JoinWrapper`(或 `MPJLambdaWrapper`)构建查询条件,类似于 MyBatis-Plus 的 `QueryWrapper`。 2. **添加 IN 条件**:通过 `in()` 方法指定目标字段和值集合。 - **语法**:`wrapper.in(字段名, 值集合)` - 字段名需使用实体类属性(驼峰命名),框架自动转换为数据库列名。 3. **连表查询(可选)**:如果涉及多表,使用 `leftJoin()` 或 `innerJoin()` 连接表,并在条件中引用关联表字段[^4][^5]。 4. **执行查询**:调用 `selectJoinList()` 或 `selectJoinOne()` 方法获取结果。 #### 完整代码示例 假设有两个表:`User`(用户表)和 `Order`(订单表),查询用户 ID 在 `[1, 2, 3]` 中且订单状态为 "paid" 的用户及其订单。 ```java import com.github.yulichang.join.MPJLambdaWrapper; import com.github.yulichang.toolkit.JoinWrappers; // 1. 创建 Wrapper MPJLambdaWrapper<User> wrapper = JoinWrappers.lambda(User.class) // 2. 添加 IN 条件(主表字段) .in(User::getId, Arrays.asList(1, 2, 3)) // 用户ID在指定列表中 // 3. 连表查询(关联订单表) .leftJoin(Order.class, Order::getUserId, User::getId) // 4. 添加其他条件(关联表字段) .eq(Order::getStatus, "paid") // 5. 选择字段(支持主表和关联表) .select(User::getName, Order::getOrderNo); // 6. 执行查询 List<UserDTO> result = userMapper.selectJoinList(UserDTO.class, wrapper); ``` #### 关键点解析 - **IN 条件位置**: - 主表字段(如 `User::getId`)直接调用 `in()`。 - 关联表字段(如 `Order::getStatus`)需先连表,再添加条件[^5]。 - **值集合类型**:支持 `Collection` 类型(如 `List`, `Set`),例如 `Arrays.asList(1, 2, 3)`。 - **性能优化**: - 避免超大集合(如超过 1000 个值),可分批查询或改用 EXISTS 子查询- 连表查询时,IN 条件会生成高效 SQL(底层通过 JOIN 或子查询优化)[^1][^5]。 - **注意事项**: - 字段名必须使用实体类属性(如 `User::getId`),而非数据库列名。 - 框架自动防 SQL 注入,无需手动转义参数[^5]。 #### 常见问题场景 - **单表 IN 查询**:直接在主表 Wrapper 上调用 `in()`,无需连表。 - **多字段 IN 查询**:使用 `and()` 或 `or()` 组合多个 `in()` 条件,例如: ```java wrapper.in(User::getId, userIds) .in(Order::getStatus, Arrays.asList("paid", "shipped")); ``` 通过以上方法,您可以灵活实现 IN 条件查询,适用于用户过滤、批量操作等场景。如需进一步优化,可参考 MyBatis-Plus-Join 的聚合函数或分页支持[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值