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****属性名之间作一个映射关系。

原文地址:https://www.cnblogs.com/jatpeo/p/11767508.html