点滴记载,点滴进步,愿自己更上一层楼。
注:项目是在 mybatis学习之路----insert主键返回 selectKey使用 的基础上进行的。
mybatis的映射文件中,在写select的时候会有输出映射结果集属性 resultType 或者resultMap两种,当然这两种也最常用。
首先说说 resultType
resultType 可以接收基本类型,包装类型的结果集映射。但是当是包装类型的时候就有要求了,必须包装类型中的属性值跟查询结果的字段对应的上,否则的话对应不上的属性是接收不到查询结果的。
例如:
数据库customer表字段为 id c_name c_sex c_ceroNo c_ceroType c_age这些。当想要通过主键来查询信息的时候,使用了一个model但是model 中的属性跟这些字段不完全对应,
例如,customer model的属性:id name age sex ceroNo ceroType,跟表中的统一导游c_的形式不一样。这样即使查询有结果,mybatis也没发 将数据绑定到model中。
下面进行演示:
customer.xml Customer.java
package com.soft.mybatis.model;
/**
* Created by xuweiwei on 2017/9/10.
*/
public class Customer {
private String id;
private String name;
private Integer age;
private Integer sex;
private String ceroNo;
private Integer ceroType;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getCeroNo() {
return ceroNo;
}
public void setCeroNo(String ceroNo) {
this.ceroNo = ceroNo;
}
public Integer getCeroType() {
return ceroType;
}
public void setCeroType(Integer ceroType) {
this.ceroType = ceroType;
}
@Override
public String toString() {
return "Customer{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", ceroNo='" + ceroNo + '\'' +
", ceroType='" + ceroType + '\'' +
'}';
}
}
CustomerDao
Customer findById(String id);
CustomerDaoImpl
public Customer findById(String id) {
Customer user = null;
SqlSession sqlSession = null;
try {
sqlSession = SqlsessionUtil.getSqlSession();
user = sqlSession.selectOne("customer.findById", id);
} catch (Exception e) {
e.printStackTrace();
} finally {
SqlsessionUtil.closeSession(sqlSession);
}
return user;
}
测试
CustomerDaoImplTest
@Test
public void findById() throws Exception {
Customer result = customerDao.findById("9e77c26b-95f7-11e7-b376-a45d36688239");
System.out.println("查询结果 : "+result);
}
如上面测试结果,resultType输出结果映射仅仅id属性映射成功了。其他的都为null。就是因为属性跟数据库字段对应不上。
怎么样才能让查询结果集映射到model中呢?这时候resultMap就出现了。
resultMap 需要首先在xml中定义一个
Customer findById2(String id);
CustomerDaoImpl
public Customer findById2(String id) {
Customer user = null;
SqlSession sqlSession = null;
try {
sqlSession = SqlsessionUtil.getSqlSession();
user = sqlSession.selectOne("customer.findById2", id);
} catch (Exception e) {
e.printStackTrace();
} finally {
SqlsessionUtil.closeSession(sqlSession);
}
return user;
}
CustomerDaoImplTest
@Test
public void findById2() throws Exception {
Customer result = customerDao.findById2("9e77c26b-95f7-11e7-b376-a45d36688239");
System.out.println("查询结果 : "+result);
}
结果:
可以看出,成功将结果即映射到了customer里面。
由上面可以看出来 resultType resultMap的区别:
resultMap 仅仅是作用数据库表字段跟model的属性的映射关系而存在,当需要映射的model的属性跟数据库字段不一样的时候使用,
但是如果数据库字段名跟需要映射的moadel的属性名完全一致,resultMap可以不用,resultType足够了。
但是,真正项目中的model的属性跟表字段完全对应的概率很小。
resultType可以映射结果集为基本类型的,resultmap就无能为力了。