MyBatis延迟加载与立即加载案例教程

网友投稿 850 2022-12-24

MyBatis延迟加载与立即加载案例教程

MyBatis延迟加载与立即加载案例教程

MyBatis入门-延迟加载与立即加载

加载策略

延迟加载

延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。

需要在主配置文件开启加载策略,子配置文件使用collection属性

立即加载

所谓立即加载就是查询时,所有的相关数据一次被读取出来,而不是分N次。

一对一实现理解加载——查询账户可查出用户信息(在查询账户是绑定查询用户信息的方法)

一对多实现延迟加载——查询用户可查出所以账户信息(在查询用户是绑定查询账户信息的方法)

基础数据

实体类

public class User implements Serializable {

/**

* java实体类为什么要实现Serializable接口

* 1.用于序列化与反序列化--一个类只有实现了Serializable接口,它的对象才能被序列化。

* 2.Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

*/

private Integer id;

private String username;

private Date birthday;

private String sex;

private String address;

//一对多关系映射:主表实体应该包含从表实体的集合引用

private List accounts;

@Override

public String toString() {

return "User{" +

"id=" + id +

", username='" + username + '\'' +

", birthday=" + birthday +

", sex='" + sex + '\'' +

", address='" + address + '\'' +

'}';

}

public List getAccounts() {

return accounts;

}

public void setAccounts(List accounts) {

this.accounts = accounts;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

public class Account implements Serializable {

private Integer id;

private Integer uid;

private Double money;

//一对一的关系中

//从表实体应该包含一个主表实体的对象引用

private User user;

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public Integer getUid() {

return uid;

}

public void setUid(Integer uid) {

this.uid = uid;

}

public DoublelLzyGWpb getMoney() {

return money;

}

public void setMoney(Double money) {

this.money = money;

}

@Override

public String toString() {

return "Account{" +

"id=" + id +

", uid=" + uid +

", money=" + money +

'}';

}

}

dao层的两个接口

/**

* @Author: Promsing

* @Date: 2021/4/4 - 16:21

* @Description: 描述 形容

* @version: 1.0

*/

public interface IUserDao {

/**

* 查询所有

* @return

*/

List findAll();

/**

* 根据id查询

* @param i

* @return

*/

User findById(Integer i);

}

public interface IAccountDao {

/**

* 查询所有账户,同时还有获取当前账户所属的用户信息

* @return

*/

List findAll();

/**

* 根据用户id查询

* @param i

* @return

*/

Account findById(Integer i);

}

resource下的主映射文件与子映射文件

主:SqlMapConfig_anno.xml

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

子:IAccountDao.xml

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select * from Account

select * from Account where uid=#{id}

子:IUserDao.xml

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select * from User

select * from user where id=#{id}

测试类

public class AnnotationTest {

private InputStream in;

private SqlSession sqlSession;

private IAccountDao accountDao;

private IUserDao userDao;

@Before

public void init()throws Exception{

//1.读取配置文件 Resources是myBatis封装的类

in= Resources.getResourceAsStream("SqlMapConfig_anno.xml");

//2.创建SQLSessionFactory工厂

// SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();

SqlSessionFactory factory=builder.build(in);

//3.使用工厂生产SQLSession对象

sqlSession = factory.openSession();

//4.使用SQLSession创建DAO接口的代理对象

accountDao = sqlSession.getMapper(IAccountDao.class);

userDao=sqlSession.getMapper(IUserDao.class);

}

@After

public void destroy()throws Exception{

//6.释放资源

//提交事务

sqlSession.commit();

sqlSession.close();

in.close();

}

//入门案例

@Test

public void testFindAllAccount(){

List accounts = accountDao.findAll();

System.out.println("------每个account的信息------");

for (Account account : accounts) {

System.out.println(account);

System.out.println(account.getUser());

}

}

@Test

public void testFindAccount(){

Account account = accountDao.findById(46);

System.out.println(account);

}

@Test

public void testFindAllUser(){

List users = userDao.findAll();

for (User user : users) {

System.out.println(user);

System.out.println(user.getAccounts());

}

}

@Test

public void testFindUser(){

User user = userDao.findById(49);

System.out.println(user);

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:flutter 队列阻塞(flutter 消息队列)
下一篇:民政局一体化政务服务平台(民政局一网通办)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~