您的位置:首页 > 其它

【mybatis】懒加载的应用 一对一、一对多 实例

2020-07-25 17:29 89 查看

懒加载(延迟加载)的使用

  • 懒加载是一种延迟技术,当我们没有使用被标记延迟加载的元素时,mybatis便不会执行select的语句的实现。
  • 通俗的讲,有使用到,就会被加载即被association或者collection标签关联的数据。
  • 本例中用户对应多个账户,账户对应一个用户。
  • 表信息如下
  • 主配置文件mybatis-config.xml 需要添加 懒加载的配置。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
  • 实体类 Account / User
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List<Account> accounts;
}
public class Account {
private Integer id;
private Integer uid;
private Double money;
private User user;
}
  • AccountMapper.xml / UserMapper.xml 映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wei.mapper.AccountMapper">
<resultMap id="accountUserMap" type="account">
<id property="id" column="id" />
<result property="uid" column="uid" />
<result property="money" column="money" />
<association property="user" column="uid" javaType="user" select="com.wei.mapper.UserMapper.findUserById" >
</association>
</resultMap>

<select id="findAll" resultMap="accountUserMap">
select * from account
</select>
<!--通过id查找-->
<select id="findAccountById" resultType="com.wei.pojo.Account" parameterType="int">
select * from account where uid = #{id}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wei.mapper.UserMapper">

<resultMap id="userAccountMap" type="user">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
<collection property="accounts" ofType="Account" column="id" select="com.wei.mapper.AccountMapper.findAccountById"  >
<id property="id" column="id" />
<result property="uid" column="uid" />
<result property="money" column="money" />
</collection>
</resultMap>

<select id="findAll" resultMap="userAccountMap">
select * from user
</select>
<!--通过id查找-->
<select id="findUserById" resultType="com.wei.pojo.User" parameterType="int">
select * from user where id = #{uid}
</select>
</mapper>
  • AccountMapper / UserMapper mapper接口
public interface AccountMapper {
List<Account> findAll();
List<Account> findAccountById(Integer id);
}

public interface UserMapper {
List<User> findAll();
User findUserById(Integer id);
}
  • 测试类
public class MybatisTest {

@Test
public void fun1(){
SqlSession sqlsession = MybatisUtils.getSqlsession();
AccountMapper mapper = sqlsession.getMapper(AccountMapper.class);
List<Account> all = mapper.findAll();
for (Account account : all) {
System.out.println(account);
}
sqlsession.close();
}

@Test
public void fun2(){
SqlSession sqlsession = MybatisUtils.getSqlsession();
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
System.out.println(user.getAccounts());
}
sqlsession.close();
}
}

一对一 的延迟加载结果

  • 延迟加载之前的输出

  • 使用延迟加载,为了简洁,未打印user

与没有开启延迟加载的区别是,延迟加载只有使用到才会使用sql去查询,并且是一个一个输出。而非延迟加载是全部sql都执行一遍。


一对多的延迟加载

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: