ssm框架学习---mybatis中复杂输入输出的处理

12 篇文章 0 订阅

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值