提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 1.普通 in语句查询
- sql
- MyBatis
- 错误写法
- 正确写法
- List
- String[]
- 2.In多个字段
- sql
- 案例
- 脚本实例:
- 错误写法:
- 正确写法:
- MyBatis XML 写法:
1.普通 in语句查询
sql
select * from HealthCoupon where useType in ( '4' , '3' )
MyBatis
错误写法
如果在MyBatis中的使用in的话,像如下去做的话,肯定会报错:
其中useType=“2,3”;这样的写法,看似很简单,但是MyBatis不支持。
Map<String, Object> selectByUserId(@Param("useType") String useType)
<select id="selectByUserId" resultMap="BaseResultMap" parameterType="java.lang.String">select * from HealthCoupon where useType in (#{useType,jdbcType=VARCHAR})</select>
正确写法
MyBatis中提供了foreach语句实现IN查询,foreach语法如下
foreach语句中, collection属性的参数类型可以使:List、数组、map集合
- collection: 必须跟mapper.java中@Param标签指定的元素名一样
- item: 表示在迭代过程中每一个元素的别名,可以随便起名,但是必须跟元素中的#{}里面的名称一样。
- index:表示在迭代过程中每次迭代到的位置(下标)
- open:前缀, sql语句中集合都必须用小括号()括起来
- close:后缀
- separator:分隔符,表示迭代时每个元素之间以什么分隔
List
List<User> selectByIdSet(List idList);
<select id="selectByIdSet" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List" />from t_userWHERE id IN<foreach collection="list" item="id" index="index" open="(" close=")" separator=",">#{id}</foreach>
</select>
String[]
- 如果参数的类型是Array,则在使用时,collection属性要必须指定为 array
List<User> selectByIdSet(String[] idList);
<select id="selectByIdSet" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List" />from t_userWHERE id IN<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">#{id}</foreach>
</select>
2.In多个字段
需要根据两个字段去查询多个值,这两个字段值不同的数据,
sql
SELECT * FROM more_in
WHERE (lmm_id, item_id, `name`) IN ( (1,2, '工料机1') , (2,2, '工料机2') , (3,3, '') );
案例
脚本实例:
-- ----------------------------
-- Table structure for more_in
-- ----------------------------
DROP TABLE IF EXISTS `more_in`;
CREATE TABLE `more_in` (`id` int NOT NULL AUTO_INCREMENT,`lmm_id` int NULL DEFAULT NULL,`item_id` int NULL DEFAULT NULL,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of more_in
-- ----------------------------
INSERT INTO `more_in` VALUES (1, 1, 2, '工料机1', NULL);
INSERT INTO `more_in` VALUES (2, 2, 2, '工料机2', NULL);
INSERT INTO `more_in` VALUES (3, 3, 3, '工料机3', NULL);
INSERT INTO `more_in` VALUES (4, 4, 3, '工料机4', NULL);
INSERT INTO `more_in` VALUES (5, 5, 1, '工料机5', NULL);
INSERT INTO `more_in` VALUES (6, 2, 3, '工料机6', NULL);
错误写法:
SELECT * FROM more_in a
WHERE a.lmm_id IN (1,2,3) AND a.item_id IN (2,2,3);
通过如下语句查询,会多出ID为6的数据:
正确写法:
IN同时可以In多个字段,In的左侧两个字段,右侧必须俩字段,左右两侧能对应上:
SELECT * FROM more_in WHERE (lmm_id, item_id) IN ((1,2),(2,2),(3,3));
MyBatis XML 写法:
List<UserDto> selectByUserNameAndAge(List<User> list);
<select id="getResult" resultType="java.util.HashMap">select * from demo t where (t.id, t.name) in<foreach collection="list" item="item" open="(" close=")" separator=",">(#{item.id},#{item.name})</foreach>
</select>