1。处理复杂的输入,也就是普通的一个model对应的类不足以包括所有的比如来自前端传递的数据,这时就需要我们建立一个包装类型来囊括我们的user和其它数据如下所示:
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-16.
*/
public class UserVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
当我们在传递输入的时候对应的在UserMapper.xml中的查询语句和输入参数就要相应的变化如下:
<!--处理复杂的输入查询-->
<select id="selectMulUser" parameterType="com.ajin.mybatis.model.UserVo" resultType="com.ajin.mybatis.model.User">
select * from userinfo where name=#{user.name}
</select>
注意上面在取得name时就变成了UserVo中user字段的name属性了。
当然如果对应的返回结果不仅仅包含User的数据,如果还有其它的子查询结果需要附属到User中,那么可以新建一个类来继承User如下:
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-16.
*/
public class UserExt extends User {
private String sex;
private String address;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
并在xml中查询结果如下:
<!--处理复杂的输入查询-->
<select id="selectMulUser" parameterType="com.ajin.mybatis.model.UserVo" resultType="com.ajin.mybatis.model.UserExt">
select id,name,password,sex,address from userinfo where name=#{user.name}
</select>
上面我这么写返回结果最终报错了,原因是我这里后面的查询结果中并没有能过查出sex和address的地方,因此,这里只是讲的当我们在做子查询或者联合查询的时候,可以用上面这种方式,如果时单表的话,需要删掉sex,address字段,并将返回结果改为User(User中只包含有id,name,password)
2.复杂输出的处理
(1)resultType
在使用resultType进行输出映射时,只有查询出来的列名和pojo中的属性名一致,该列才能够映射成功,
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象
如果查询出来的列名和pojo中有一个一致,就会创建pojo对象,没有对应的属性会给予默认空值,所以在使用的时候,一般不要取查询结果别名
只有查询出来的结果集只有一行一列,可以用简单类型来进行输出映射
对于输出pojo或者pojo列表,resultType都是pojo类型,只是方法的返回值,一个是单个对象,一个时list,mybatis动态代理会依据我们mapper接口中的方法的返回类型来看是调用selectOne还是selectList方法
(2)resultMap(完成高级输出结果的映射)
使用方法:如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系
1。定义resultMap
2。使用resultMap作为statement的输出映射类型
<!--定义resultmap,将包含别名的和user类进行映射
id:唯一表示resultmap
type:最终映射的java对象类型
-->
<resultMap id="aliasResultMap" type="com.ajin.mybatis.model.User">
<!--id表示查询结果集中的唯一标识-->
<!--column:查询出来的列名-->
<!--property:type指定的pojo类型中的属性名-->
<id column="id_" property="id"></id>
<!-- 表示其它普通列-->
<result column="name_" property="name"></result>
<result column="password_" property="password"></result>
</resultMap>
在statement中来引用
<!--使用resultMap来完成别名输出的映射-->
<!-- 如果时引用其它xml中的resultmap,需要加上命名空间-->
<select id="selectByIdResultMap" parameterType="int" resultMap="aliasResultMap">
select id id_,name name_,password password_ from userinfo where id=#{value}
</select>
在mapper接口中定义同名方法和测试用例如下:
User selectByIdResultMap(int id);
测试代码:
@Test
public void selectByIdResultMap() throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
User user=userMapper.selectByIdResultMap(2);
sqlSession.close();
}
上面就是一个简单的使用resultmap的例子,resultmap的类型可以看出,除了id和result以外,我们还可以对应更复杂的集合类型,其中有collection属性