• 【MyBatis】Mybatis的输入和输出映射


    1. Mybatis输入映射(掌握)

    • 通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型
      • 传递pojo的包装对象
        • 需求:完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)
        • 针对上边需求,建议使用自定义的包装类型的pojo。在包装类型的pojo中将复杂的查询条件包装进去。

    1.1 UserCustom.java

    public class UserCustom extends User{
    // 可扩展用户信息
    }
    
    • 1
    • 2
    • 3

    1.2 UserQueryVo.java

    public class UserQueryVo {
    // 这里包装所需的查询条件
    
    /**
    * 用户查询
    */
    private UserCustom userCustom;
    
    public UserCustom getUserCustom() {
        return userCustom;
    }
    
    public void setUserCustom(UserCustom userCustom) {
        this.userCustom = userCustom;
    }
    
    //可包装其他的查询条件,订单,商品......
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    1.3 UserMapper.java

    /**
    * 用户综合查询
    * @param userQueryVo
    * @return UserCustom
    * @throws Exception
    */
    public UserCustom findUserList(UserQueryVo userQueryVo) throws Exception;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.4 UserMapper.xml中配置新的查询

    
    <select id="findUserList" parameterType="cn.edu.wtu.po.UserQueryVo" resultType="cn.edu.wtu.po.UserCustom">
        select *from user where user.sex=#{userCustom.sex} and
        user.username like "%${userCustom.username}%";
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意不要将#{userCustom.sex}中的userCustom写成UserCustom,前者指属性名(由于使用IDE提示自动补全,所以只是把类型名首字母小写了),后者指类型名,这里是UserQueryVo类中的userCustom属性,是属性名。写错会报如下异常:

    org.apache.ibatis.exceptions.PersistenceException: 
    ### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'UserCustom' in 'class com.iot.mybatis.po.UserQueryVo'
    ### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'UserCustom' in 'class com.iot.mybatis.po.UserQueryVo'
    
    • 1
    • 2
    • 3

    1.5 UserMapperTest.java中新增测试

    /**
    * 用户综合查询
    * @throws Exception
    */
    @Test
    public void testFindUserList() throws Exception{
        // 创建会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 创建代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
        // 创建包对象,设置查询条件
        UserQueryVo userQueryVo = new UserQueryVo();
        UserCustom userCustom = new UserCustom();
    
        userCustom.setSex("1");
        userCustom.setUsername("张三");
    
        userQueryVo.setUserCustom(userCustom);
    
        UserCustom userCustom1 = userMapper.findUserList(userQueryVo);
        List<UserCustom> list = new ArrayList<>();
        list.add(userCustom1);
        System.out.println(list);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2. Mybatis输出映射(掌握)

    2.1 resultType

    • 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功
    • 如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
    • 只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象

    2.1.1 resultType的输出简单类型

    • UserMapper.java
      /**
       * 用户综合查询个数
       * @param userQueryVo
       * @return 用户个数
       * @throws Exception
       */
      public int findUserCount(UserQueryVo userQueryVo) throws Exception;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • UserMapper.xml
     
        <select id="findUserCount" parameterType="com.iot.mybatis.po.UserQueryVo" resultType="int">
            SELECT count(*) FROM user WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'
        select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • UserMapperTest.java
    /**
         * 用户综合查询 用户个数
         * @throws Exception
         */
        @Test
        public void testFindUserCount() throws Exception{
            // 创建会话
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 创建代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
            // 创建包装对象,设置查询条件
            UserQueryVo userQueryVo = new UserQueryVo();
            UserCustom userCustom = new UserCustom();
    
            userCustom.setUsername("1");
            userCustom.setUsername("陈晓明");
            userQueryVo.setUserCustom(userCustom);
    
            int count = userMapper.findUserCount(userQueryVo);
    
            System.out.println(count);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 小结

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

    2.1.2 resultType的输出pojo对象和pojo列表

    不管是输出的pojo单个对象还是一个列表(list中包括pojo),在UserMapper.xml中resultType指定的类型是一样的。

    在mapper.java指定的方法返回值类型不一样:

    • 输出单个pojo对象,方法返回值是单个对象类型
    //根据id查询用户信息
    public User findUserById(int id) throws Exception;
    
    • 1
    • 2
    • 输出pojo对象list,方法返回值是List
    //根据用户名列查询用户列表
    public List<User> findUserByName(String name) throws Exception;
    
    • 1
    • 2

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

    2.2 resultMap

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

    1.定义resultMap

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

    • 定义reusltMap
        
    	 <resultMap  id="userResultMap" type="cn.edu.wtu.po.Userr">
    	 	
    	 	<id column="id_" property="id"/>
    	 	
    	 	<result column="username_" property="username"/>
    	 
    	 resultMap>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 使用resultMap作为statement的输出映射类型
    
        <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
            SELECT id id_,username username_ FROM USER WHERE id=#{value}
        select>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • UserMapper.java
    //根据id查询用户信息,使用resultMap输出
    public User findUserByIdResultMap(int id) throws Exception;
    
    • 1
    • 2
    • 测试代码
    @Test
    public void testFindUserByIdResultMap() throws Exception {
    
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    
    	//创建UserMapper对象,mybatis自动生成mapper代理对象
    	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
    	//调用userMapper的方法
    
    	User user = userMapper.findUserByIdResultMap(1);
    
    	System.out.println(user);
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.3 总结

    • 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
    • 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
  • 相关阅读:
    【比较mybatis、lazy、sqltoy、lambda、操作数据 】操作批量新增、分页查询【一】
    文件上传下载
    spring MVC执行流程与源码解析
    TCP/IP网络江湖——江湖导航(网络层上篇)
    汽车电子中的安森美深力科分享一款高性能车规级芯片NCV7520MWTXG
    量子力学的应用:量子通信和量子感应
    Java笔试题
    【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.9 右键菜单事件
    阿里财报中的饿了么:守正出奇
    Kubernetes Service对象
  • 原文地址:https://blog.csdn.net/u013301892/article/details/128166203