MyBatis的学习与总结-第二篇

在说之前,先来引入为什么要这么使用。

在使用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查询,这也是他的特点之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值