zoukankan      html  css  js  c++  java
  • 04_Mybatis输入出映射

    1. 输入映射

    ​ 通过paramterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类、

    1.1 传递pojo的包装对象

    1.需求

    ​ 完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)

    2.定义包装类型pojo

    ​ 针对上边需求,建议使用自定义的包装类型的pojo,在包装类型的pojo中将复杂的查询条件包装进去。

    /**
     * Description: 查询时,将多个对象的属性集合在此类
     * User: jiatp
     * Date:2019/9/3 0003 下午 4:39
    */
    
    public class UserQueryVo {
        //用户的查询条件
        private UserCustom userCustom;
        //传入多个id
        private List<Integer> ids;
        //可以包装其它信息,商品,订单 等
    
        public List<Integer> getIds() {
            return ids;
        }
    
        public void setIds(List<Integer> ids) {
            this.ids = ids;
        }
    
        public UserCustom getUserCustom() {
            return userCustom;
        }
    
        public void setUserCustom(UserCustom userCustom) {
            this.userCustom = userCustom;
        }
    }
    
    

    3.mapper.xml

    在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。

      <select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
            select * from user where user.sex=#{userCustom.sex} and user.name like '%${userCustom.username}%'
     </select>
    

    4.mapper.java

    // 用户信息的综合查询
        public List<UserCustom> findUserList(UserQueryVo userQueryVo);
    

    5.测试代码

    public class MybatisThird {
        private SqlSessionFactory sqlSessionFactory;
        @Before
        public void setUp() throws IOException {
            //mybatis配置文件
            String resource = "com/mybatis/config/sqlMapConfig.xml";
            //得到配置文件流
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        }
        //综合查询,用户的所有信息
        @Test
        public void findUserList(){
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
            //创建包装对象
            UserQueryVo userQueryVo = new UserQueryVo();
            UserCustom userCustom = new UserCustom();
           // userCustom.setSex("2");
            userCustom.setUsername("李四");
            userQueryVo.setUserCustom(userCustom);
            //调用查询
            List<UserCustom> userList = mapper.findUserList(userQueryVo);
            for(UserCustom us:userList) {
                System.out.println(us);
            }
        }
      }
    

    2. 输出映射

    2.1 resultType

    ** 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。**

    如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

    1. 输出简单类型

    ​ 如:用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。

    mapper.xml

     <!--用户信息查询总数
        parameterType:指定输入参数与findUserList一样
        -->
        <select id="findUserCount" parameterType="UserQueryVo" resultType="int">
            select count(1) from user where user.sex=#{userCustom.sex} and user.name like '%${userCustom.username}%'    
    </select>
    

    mapper.java

     //用户信息总数查询
        public int findUserCount(UserQueryVo userQueryVo);
    

    测试代码

    //查询用户信息的总数
        @Test
        public void findUserCount(){
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
            //创建包装对象
            UserQueryVo userQueryVo = new UserQueryVo();
            UserCustom userCustom = new UserCustom();
            userCustom.setSex("2");
            userCustom.setUsername("李四");
            userQueryVo.setUserCustom(userCustom);
            //调用查询
           int count = mapper.findUserCount(userQueryVo);
            System.out.println(count);
        }
    

    总结:查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。

    2.输出pojo对象和pojo列表**

    ​ 不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。在mapper.java指定的方法返回值类型不一样:

    ​ 1、输出单个pojo对象,方法返回值是单个对象类型

     //根据用户id查询用户信息,使用resultMap输出
        public User findUserByIdResultMap(int id);
    
    	2、输出pojo对象list,方法返回值是List<Pojo>
    
    //根据用户名查询用户列表
        public List<User> findUserByName(String name) throws Exception;
    

    生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用).

    2.2 resultMap

    resultMap使用方法

    如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

    1、定义resultMap

    2、使用resultMap作为statement的输出映射类型

    将下边的sql使用User完成映射

    SELECT id id_,username username_ FROM USER WHERE id=#{value}
    
    

    User类中属性名和上边查询列名不一致。

    mapper.xml

     <!--使用resultMap进行输出映射
        1.定义resultMap type:resultMap最终映射的java对象类型,可以使用别名;
        id:resultMap的标识
        -->
        <resultMap id="UserResultMap" type="user">
            <!--id表示查询结果集中唯一标识-->
            <id column="id_" property="id"/>
            <result column="username_" property="username"/>
        </resultMap>
        <!--resultMap:即是前面定义的resultMap的id-->
        <select id="findUserByIdResultMap" parameterType="int" resultMap="UserResultMap">
          select id id_,username username_ from user  where id=#{id}
        </select>
    

    总结:

    使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

    如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo****属性名之间作一个映射关系。

  • 相关阅读:
    并查集的来龙去脉
    改变像素
    PHP自学之路-----javascript基础入门
    推荐管理类图书
    ewebeditor编辑器ASP/ASPX/PHP/JSP版本漏洞利用总结及解决方法
    PHP文件包含漏洞剖析
    文件上传漏洞总结
    服务器软件解析漏洞总结
    JAVA环境变量配置
    Python2.x与Python3.x的区别
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767508.html
Copyright © 2011-2022 走看看