SpringFramework

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

2020-12-05  本文已影响0人  猿生进阶
Java编程高级进阶-Mybatis的输入与输出映射详解

Mybatis的输入映射

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

传递pojo的包装对象

package com.iot.mybatis.po;

/**

*/

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{

}

在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'

//用户信息综合查询

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

输出简单类型

<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>

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

@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指定的方法返回值类型不一样:

//根据id查询用户信息

public User findUserById(int id) throws Exception;

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

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

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

resultMap

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

resultMap使用方法

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

1.定义resultMap

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

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

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

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

</resultMap>

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

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

</select>

//根据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中的属性名一致,该列才可以映射成功。

上一篇下一篇

猜你喜欢

热点阅读