• 使用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);
        }
    }
  • 相关阅读:
    iOS使用第三方管理工具
    Mysql忘记密码怎么办
    支付宝支付流程
    关于iOS9 HTTP不能正常使用的解决方法
    ios项目开发汇总
    sqlite3
    Drupal 7.31版本爆严重SQL注入漏洞
    Google发布SSLv3漏洞简要分析报告
    Linux“Bash”漏洞大爆发
    Discuz 5.x/6.x/7.x投票SQL注入分析
  • 原文地址:https://www.cnblogs.com/wyhluckdog/p/10156195.html
Copyright © 2020-2023  润新知