现在思考一个问题
假如我的GoodsInfo.java实体类里边的属性,跟数据库表里的属性 名字不一致会怎样?
现在我把实体类的属性名字 修改一下,变成
一旦这个实体类属性名字和数据库表里的属性名字不一致,你觉得我再继续封装,能把这个值封装到对象里吗?
老套路第1步
/Mybatis02/src/com/chen/dao/GoodsDao2.javal
//查询所有 (查询所有不需要参数)
public List<GoodsInfo> selAll();
老套路第2步
/Mybatis02/config/mappers/GoodsInfoMapper.xml
<select id="selAll" resultType="com.chen.GoodsInfo">
select * from goods
</select>
resultType="com.chen.GoodsInfo" 。但是,GoodsInfo对象 的属性 名字已经全改了。还能起作用吗? 那么现在测试一下。
老套路第3步
/Mybatis02/src/test/Start2.java
public class Start2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-conf.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession();
//拿到接口的代理对象
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
List<GoodsInfo> list =dao.selAll();
System.out.println(list.size());
//如果上面不设置自动提交表单,那么就需要commit方法
session.commit();
}
}
点击运行
居然查到了有73条数据, 好奇怪,为什么不会报错呢?
但是我们现在打印一下这个数据
居然出现了73个空对象
系统它是知道你有73条数据,但是它们没有封装上
是什么原因导致它没有被封装上? 答案无疑是:实体类的属性名称不一致
解决办法有2种
第1种方式--取别名
套路第二步改为
/Mybatis02/config/mappers/GoodsInfoMapper.xml
<select id="selAll" resultType="com.chen.GoodsInfo">
select id e_id,name e_name from goods
</select>
点击运行便可看到结果出来了
第2钟方式---用resultMap ( 也就是我们今天的主题)
现在不用resultType了 ,因为这和我实体类的属性名已经对不上了,它不能帮你完成自动封装。这时需要手动方式设置封装方式。那么现在改用用resultMap
那么怎么来配置这resultMap属性?
老套路第1步
/Mybatis02/src/com/chen/dao/GoodsDao2.java
public List<GoodsInfo> selAll2();
老套路第2步
/Mybatis02/config/mappers/GoodsInfoMapper.xml
<!-- type一定要对应实体类
id就是给当前配置的封装格式起一个唯一标识 -->
<resultMap type="com.chen.GoodsInfo" id="abc">
<!-- 下面这个id标签表示配置逐渐的封装格式 -->
<id column="ID" property="e_id" />
<result column="name" property="e_name" />
</resultMap>
<!-- 当你使用resultMap的时候一定要跟你配置的resultMap标签的id一致。而且使用resultType就不能使用resultMap,既有它没我 -->
<select id="selAll2" resultMap="abc">
select * from goods
</select>
老套路第3步
/Mybatis02/src/test/Start2.java
public class Start2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-conf.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession();
//拿到接口的代理对象
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
List<GoodsInfo> list = dao.selAll2();
System.out.println(list);
//如果上面不设置自动提交表单,那么就需要commit方法
session.commit();
}
}