一
在说之前,先来引入为什么要这么使用。
在使用JDBC时或是SpringJDBC时,都一定还记得从结果集中一一取值再赋值给对象的痛苦,SpringJDBC还好一点,提供了一个RowMapper这个接口,可以通过匿名内部类的方式进行数据的封装,或是直接通过一个类实现它,来进行封装,都是十分不容易,并且还需要一个专门的包来管理这个实现类,对于程序员来说,代码量无疑是又增加的,所以,MyBatis也对这个接口进行一次封装,就是这次猪脚 resultMap 标签。
首先这两个标签比较常用一点,一个 id,一个 type,id 自然不用多说,是一个唯一标识,能够在下文的使用中,进行定位,type 这个标签则是指定实体类,他需要实体类的全限定类名,就假如,有这样一个实体类 UserPojo 是放在 com.mycc.pojo 中,那么type就需要 type = "com.mycc.pojo.UserPojo " 这样的方式,告诉 MyBatis 它的所在位置,就可以在编译时,进行数据的封装。
<resultMap id="ResultToUser" type="com.mycc.pojo.UserPojo">
<id column="id" property="id"></id>
<result column="username" property="userName"></result>
<result column="password" property="passWord"></result>
</resultMap>
接着,id 就是在数据库表中,指定的主键, column 是在数据库中主键的列名,property 是在实体类中的字段名,<result> 则是对数据库中的普通列进行的封装,column 和 property 含义和 <id> 中的 一致。
二
懒加载
首先说一下,懒加载是一种按需加载,当调用到某个对象时,才会去数据库进行查询。
在MyBatis 懒加载默认设置是关闭的,所以需要打开,在SqlMapConfig.xml文件中,需要加入设置
<settings>
<!--打开延迟加载的特性,,默认是关闭的-->
<setting name="lazyLoadingEnabled" value="true"></setting>
<!--按需加载,true:加载对象,并且加载全部属性,false:当使用对象时,才会去加载被调用的对象-->
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
首先,第一个 setting 是打开 MyBatis 的懒加载特性,true:开启,false:关闭
接着第二个是选择加载的模式 true:加载对象时,加载全部属性,false:按需加载,当对象的属性被调用时,才会被加载
然后,设置完成了,还需要在UserMapper.xml 文件中继续写SQL,但是不同的是,需要在UserDetailMapper.xml写SQL。
首先,还是跟刚才的一样,先写 resultMap
<resultMap id="ResultToUserDetail" type="com.mycc.pojo.UserDetail">
<result column="id" property="id"></result>
<result column="phone" property="phone"></result>
<result column="sex" property="sex"></result>
<result column="user_id" property="userId"></result>
<association property="userPojo"
column="user_id"
select="com.mycc.dao.selectByUserId"></association>
</resultMap>
<select id="selectAll" resultMap="ResultToUserDetail">
select * from user_detail
</select>
可以看到,在resultMap 标签中,多了一个新的标签 association ,这个就是关联标签,
首先第一个属性 property 指的是在实体类中,引入的实体,虽然听起来有点绕口,但是,这也是比较现实的情况,就好比如,当需要一个客户的爱好和订单信息时,爱好属性一般不可能跟订单信息放在一起,所以就需要两张来存储它们,所以也就需要两个实体来存储它们,所以就需要一个关联操作,将这个查询结果展示在一起,这就是 association 的作用,接着column,这个是指在数据库中,关联的列名,select 则是在UserMapper 接口中,被调用的方法。
<select id="selectByUserId" parameterType="Integer" resultMap="com.mycc.pojo.UserPojo">
select * from user where id = #{id}
</select>
public interface UserMapper{
UserPojo selectByList(int id);
}
通过这样关联,就可以在使用的时候,将其调用。
细节:通过控制台,可以看出,懒加载在本质是两次sql查询,这也是他的特点之一。