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 Double 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

子:IAccountDao.xml

select * from Account select * from Account where uid=#{id}

子:IUserDao.xml

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); } }

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...