Mybatis-延迟加载
立即加载:只要一调用就立即发起加载。举例:一个用户有100个账户,查询账户时有必要把用户信息也显示出来。
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作;
可以简单理解为,只有在使用的时候,才会发出sql语句进行查询;延迟加载的有效期是在session打开的情况下,当session关闭后,会报异常。
当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句
package bean; public class student { private Integer s_id;//id private Integer c_id;//关联id private String s_name;//name private classes classes;//班级对象 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public classes getClasses() { return classes; } public void setClasses(classes classes) { this.classes = classes; } }
package bean; import java.util.List; public class classes { private Integer c_id;//班级id private String c_name;//班级name private List<student> student;//学生集合对象 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } public List<student> getStudent() { return student; } public void setStudent(List<student> student) { this.student = student; } }
<!-- classes接口xml--> <!-- resultMap手动定义 --> <resultMap type="classes" id="claMap"> <!-- id标签,主键 --> <id column="id" property="id" /> <!-- result标签,普通列 --> <result column="cname" property="cname" /> <collection property="student" ofType="student" select="dao.studao.selbyid" column="id"> </collection> </resultMap> <!-- select标签用于查询 --> <select id="selallC" resultMap="claMap"> select * from classes </select> <!-- student接口xml--> <select id="selbyid" resultType="student"> select * from student where cid=#{cid} </select>
全局配置xml
<settings> <!-- 开启延迟加载支持 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 将积极加载改为消极加载 按需加载 --> <setting name="aggressiveLazyLoading" value="false" /> </settings>
测试类
package Test; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.ws.Action; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import bean.classes; import bean.student; import dao.cladao; import dao.studao; public class MybatisyTest { InputStream inputstream; SqlSessionFactory factory; SqlSession session; cladao cdao; studao sdao; @Before public void init() throws IOException{ //读取配置文件 inputstream=Resources.getResourceAsStream("mybatis-config.xml"); factory =new SqlSessionFactoryBuilder().build(inputstream); session =factory.openSession(); cdao=session.getMapper(cladao.class); } @Test public void selallcla() throws IOException{ List<classes> cla =cdao.selallC(); for(classes c:cla) { System.out.println("班级id:"+c.getId()+",班级名称:"+c.getCname()); if(c.getId()==2) { List<student> stu=c.getStudent(); for(student s:stu) { System.out.println("学生id:"+s.getId()+",学生姓名:"+s.getSname()); } } } } @After public void destory() throws IOException { //关闭 session.commit(); session.close(); inputstream.close(); } }
执行@Test注解
只查询班级表中的所有数据,当你点击想查询的班级(传入id值),再执行sql语句查询学生表符合条件的学生信息