美文网首页SpringFramework
Java编程高级进阶-Mybatis的输入与输出映射详解

Java编程高级进阶-Mybatis的输入与输出映射详解

作者: 猿生进阶 | 来源:发表于2020-12-05 22:44 被阅读0次
    Java编程高级进阶-Mybatis的输入与输出映射详解

    Mybatis的输入映射

    通过parameterType指定输入参数的类型,类型可以是

    • 简单类型
    • 已保存hashmap
    • pojo的包装类型

    传递pojo的包装对象

    • 定义包装类型pojo

    package com.iot.mybatis.po;

    /**

    • Created by Brian on 2016/2/24.

    */

    public class UserQueryVo {

    //在这里包装所需要的查询条件

    //用户查询条件

    private UserCustom userCustom;

    public UserCustom getUserCustom() {

    return userCustom;

    }

    public void setUserCustom(UserCustom userCustom) {

    this.userCustom = userCustom;

    }

    //可以包装其它的查询条件,订单、商品

    //....

    }

    其中,UserCustom类继承User

    public class UserCustom extends User{

    }

    • mapper.xml

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

    <select id="findUserList" parameterType="com.iot.mybatis.po.UserQueryVo"

    resultType="com.iot.mybatis.po.UserCustom">

    SELECT * FROM user WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'

    </select>

    注意不要将#{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'

    • mapper.java

    //用户信息综合查询

    public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;

    • 测试代码

    //用户信息的综合 查询

    @Test

    public void testFindUserList() throws Exception {

    SqlSession sqlSession = sqlSessionFactory.openSession();

    //创建UserMapper对象,mybatis自动生成mapper代理对象

    UserMapper userMapper sqlSession.getMapper(UserMapper.class);

    //创建包装对象,设置查询条件

    UserQueryVo userQueryVo = new UserQueryVo();

    UserCustom userCustom = new UserCustom();

    //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中

    userCustom.setSex("1");

    userCustom.setUsername("张三");

    userQueryVo.setUserCustom(userCustom);

    //调用userMapper的方法

    List<UserCustom> list = userMapper.findUserList(userQueryVo);

    System.out.println(list);

    }

    Mybatis的输出映射

    输出映射有两种方式

    • resultType
    • resultMap

    resultType

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

    输出简单类型

    • mapper.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>

    • mapper.java

    //用户信息综合查询总数

    @Test

    public void testFindUserCount() throws Exception {

    SqlSession sqlSession = sqlSessionFactory.openSession();

    //创建UserMapper对象,mybatis自动生成mapper代理对象

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    //创建包装对象,设置查询条件

    UserQueryVo userQueryVo = new UserQueryVo();

    UserCustom userCustom = new UserCustom();

    //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中

    userCustom.setSex("1");

    userCustom.setUsername("小");

    userQueryVo.setUserCustom(userCustom);

    //调用userMapper的方法

    int count = userMapper.findUserCount(userQueryVo);

    System.out.println(count);

    }

    • 小结

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

    输出pojo对象和pojo列表

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

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

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

    //根据id查询用户信息

    public User findUserById(int id) throws Exception;

    • 输出pojo对象list,方法返回值是List

    //根据用户名列查询用户列表

    public List<User> findUserByName(String name) throws Exception;

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

    resultMap

    mybatis中使用resultMap完成高级输出结果映射。(一对多,多对多)

    resultMap使用方法

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

    1.定义resultMap

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

    • 定义reusltMap

    <resultMap type="user" id="userResultMap">

    <id column="id_" property="id"/>

    <result column="username_" property="username"/>

    </resultMap>

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

    <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">

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

    </select>

    • mapper.java

    //根据id查询用户信息,使用resultMap输出

    public User findUserByIdResultMap(int id) throws Exception;

    • 测试代码

    @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);

    }

    小结

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

    相关文章

      网友评论

        本文标题:Java编程高级进阶-Mybatis的输入与输出映射详解

        本文链接:https://www.haomeiwen.com/subject/dienwktx.html