使用mybatis提供的各种标签方法实现动态拼接Sql。使用foreach标签实现遍历查询。比如实现select * from user where id in(1,10,24)这条sql查询语句。

向sql传递数组或List,mybatis使用foreach解析,如下:

需求:

  传入多个id查询用户信息,用下边的sql实现:

  select * from user where id in(1,10,24);

1.在QueryVo类中定义:

private List<Integer> ids;
    
    public List<Integer> getIds() {
        return ids;
    }

2.在UserMapper接口中定义方法:

  public List<User> findUserByIds(QueryVo vo);

3.在UserMapper.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接口代理实现编写规则:
1.映射文件中namespace要等于接口的全路径
2.通过sql语句实现数据库的操作
3.映射文件中sql语句id要等与于接口的方法名称
4.映射文件中传入参数类型要等于接口方法的传入参数类型
5.映射文件中返回结果集类型要等于接口方法的返回值类型
 -->
<mapper namespace="com.huida.mapper.UserMapper">
    
    <select id="findUserByIds" parameterType="com.huida.vo.QueryVo" resultType="com.huida.po.User">
        <!-- select *  from user where id in(1,10,24) -->
        select * from user 
        <where>
            <!-- id in(1,10,24) -->
            <if test="ids!=null">
                <foreach collection="ids" item="id" open="id in(" close=")" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

</mapper>

  collection属性:对谁进行遍历,在这里是对ids进行遍历

  item属性:遍历的结果放到哪里,这里将ids的遍历结果放到id中。

  open属性:从何处开始进行遍历

  close属性:从何处结束遍历

  separator属性:分隔符是什么,这里的分隔符为‘,’,通过‘,’将id分离开来。

  占位符只需要写#{id}即可,花括号里面的放的为我们将遍历结果放置的地方,也就是id。

3.测试代码:

package com.huida.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.management.Query;

import org.apache.ibatis.io.Resources;
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 org.omg.PortableInterceptor.USER_EXCEPTION;

import com.huida.mapper.UserMapper;
import com.huida.po.User;
import com.huida.vo.QueryVo;

public class UserMapperTest {

    private SqlSessionFactory factory=null;
    @Before
    public void init() throws Exception{
        //通过流将核心配置文件读取进来
        InputStream inputStream=Resources.getResourceAsStream("config/SqlMapConfig.xml");
        //通过核心配置文件输入流来创建工厂
        factory=new SqlSessionFactoryBuilder().build(inputStream);
    }
    
    @Test
    public void testfindUserByIds(){
        //创建SqlSession
        SqlSession openSession=factory.openSession();
        //通过会话的getMapper方法来实例化接口(实现类的对象)
        UserMapper userMapper=openSession.getMapper(UserMapper.class);//参数放接口的字节码文件
        QueryVo vo=new QueryVo();
        List<Integer> ids=new ArrayList<>();
        ids.add(1);
        ids.add(10);
        ids.add(22);
        ids.add(24);
        vo.setIds(ids);
        List<User> list=userMapper.findUserByIds(vo);
        System.out.println(list);
    }
}
原文地址:https://www.cnblogs.com/wyhluckdog/p/10156195.html