这篇文章主要介绍了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); } }