7.MyBatis延时加载

时间:2023-03-09 15:34:34
7.MyBatis延时加载

1.创建javaWeb项目MyBatis_Lazy并在WebRoot下的WEB-INF下的lib下添加如下jar文件

cglib-nodep-2.1_3.jar

log4j-1.2.17.jar

mybatis-3.2.3.jar

ojdbc14.jar

2.在src下创建log4j.properties日志文件

 log4j.rootLogger=DEBUG, Console  

 #Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

log4j.properties

3.在src下创建jdbc.properties数据库属性文件

 driver=oracle.jdbc.driver.OracleDriver
url=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:orcl
username=scott
password=tiger

jdbc.properties

4.在src下创建Configuration.xml主配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- 1.jdbc链接数据库的主配置文件 -->
<properties resource="jdbc.properties"/> <!-- 2.全局参数配置 -->
<settings>
<!--打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将积极加载改为消极加载及按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings> <!-- 别名配置 -->
<typeAliases>
<typeAlias type="com.entity.Dept" alias="Dept"/>
<typeAlias type="com.entity.Emp" alias="Emp"/>
</typeAliases> <!-- 3.数据源的配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 4.注册映射文件 -->
<mappers>
<mapper resource="com/mapper/ScottMapper.xml"/>
</mappers> </configuration>

Configuration.xml

5.在src下com.entity包下创建Dept.java

 package com.entity;

 public class Dept {

     private int deptno;

     private String dname;

     public Dept() {
}
public Dept(int deptno, String dname) {
this.deptno = deptno;
this.dname = dname;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + "]";
} }

Dept.java

6.在src下com.entity包下创建Emp.java

 package com.entity;

 public class Emp {
private int empno; //员工编号
private String ename; //员工姓名
private double sal; //工资
private Dept dept; //外键列:部门对象 public Emp() {
}
public Emp(int empno, String ename, double sal, Dept dept) {
this.empno = empno;
this.ename = ename;
this.sal = sal;
this.dept = dept;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
} /* @Override
public String toString() {
return "Emp [ empno=" + empno + ", ename=" + ename
+ ", sal=" + sal + "]";
}*/ }

Emp.java

7.在src下com.util包下创建MyBatisUtil.java

 package com.util;

 import java.io.IOException;
import java.io.Reader; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory=null;
static{
try {
Reader reader=Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
} public static SqlSession getSeqlsession(boolean isCommit){
return sqlSessionFactory.openSession(isCommit);
} }

MyBatisUtil.java

8.在src下com.mapper包下创建ScottMapper.java接口

 package com.mapper;

 import java.util.List;

 import com.entity.Dept;
import com.entity.Emp; /**
* 映射接口
* @author pc
*
*/
public interface ScottMapper {
/**
* 1.查询员工表是延迟加载部门信息
* @return
*/
List<Emp> getEmpLazyLoading(); /**
* 2.根据部门编号查询某个部门信息
* @param deptno
* @return
*/
Dept findByDeptno(int deptno); }

ScottMapper.java

9.在src下com.mapper包下创建ScottMapper.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.mapper.ScottMapper">
<!-- 1.查询从表数据Emp -->
<select id="getEmpLazyLoading" resultMap="EmpLazyLoading">
select * from emp
</select> <!-- 2.配置id=EmpLazyLoading的resultMap -->
<resultMap id="EmpLazyLoading" type="Emp">
<id property="empno" column="empno"/>
<result property="ename" column="ename"/>
<result property="sal" column="sal"/> <!-- 外键字段:多对一映射 -->
<association property="dept" javaType="Dept" column="deptno" select="findByDeptno"/>
</resultMap> <!-- 3.根据部门编号查询部门信息 -->
<select id="findByDeptno" parameterType="int" resultType="Dept">
select * from dept where deptno=#{deptno}
</select> </mapper>

ScottMapper.xml

10.在src下com.mapper.impl包下创建ScottMapperImpl.java

 package com.mapper.impl;

 import java.util.List;

 import org.apache.ibatis.session.SqlSession;

 import com.entity.Dept;
import com.entity.Emp;
import com.mapper.ScottMapper;
import com.util.MyBatisUtil; public class ScottMapperImpl implements ScottMapper {
/**
* 1.查询所有员工信息
*/
public List<Emp> getEmpLazyLoading() {
SqlSession sqlSession=MyBatisUtil.getSeqlsession(false);
ScottMapper mapper=sqlSession.getMapper(ScottMapper.class);
List<Emp> emp=mapper.getEmpLazyLoading();
sqlSession.close();
return emp;
}
/**
* 2.根据部门编号查询部门信息
*/
public Dept findByDeptno(int deptno) {
SqlSession sqlSession=MyBatisUtil.getSeqlsession(false);
ScottMapper mapper=sqlSession.getMapper(ScottMapper.class);
List<Emp> emp=mapper.getEmpLazyLoading();
Dept dept=mapper.findByDeptno(deptno);
sqlSession.close();
return dept;
} }

ScottMapperImpl.java

11.在src下com.test包下创建Test.java

 package com.test;

 import java.util.List;

 import com.entity.Emp;
import com.mapper.ScottMapper;
import com.mapper.impl.ScottMapperImpl; public class Test {
public static void main(String[] args) {
ScottMapper mapper=new ScottMapperImpl();
List<Emp> list=mapper.getEmpLazyLoading();
for (Emp emp : list) {
System.out.println(emp.getDept().getDname());
}
//System.out.println(mapper.findByDeptno(10));;
} }

Test.java