延迟加载
- 懒加载,正真用到该对象时才会发送SQL
- 在Mybatis中,只针对关联对象才会有延迟,Hibernate中的延迟加载对本对象、单端关系、集合都起作用
- 全局开关:在配置文件中配置如下
<settings>
<!--开启全局延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
实体类
public class User implements Serializable {
private Integer id;
private String name;
private String password;
private Float salary;
private Date birthday;
private Department department;
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getSalary() {
return salary;
}
public void setSalary(Float salary) {
this.salary = salary;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(name, user.name) &&
Objects.equals(salary, user.salary) &&
Objects.equals(birthday, user.birthday);
}
@Override
public int hashCode() {
return Objects.hash(id, name, salary, birthday);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", salary=" + salary +
", birthday=" + birthday +
'}';
}
}
public class Department implements Serializable {
private Integer id;
private String name;
private String location;
private Set<User> set = new HashSet<>();
public Set<User> getSet() {
return set;
}
public void setSet(Set<User> set) {
this.set = set;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "Department{" +
"id=" + id +
", name='" + name + '\'' +
", location='" + location + '\'' +
'}';
}
}
mapper接口
public interface DepartmentMapper {
Department findById(Integer id);
}
public interface UserMapper {
User findById(Integer id);
}
映射文件
<?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.bjlemon.mybatis.mapper.UserMapper">
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
<resultMap id="UserBaseRM" type="User">
<id property="id" column="user_id"/>
<result property="name" column="name"/>
<result property="salary" column="salary"/>
<result property="birthday" column="birthday"/>
</resultMap>
<resultMap id="UserRM" type="User" extends="UserBaseRM">
<association property="department"
column="department_id"
javaType="Department" select="com.bjlemon.mybatis.mapper.DepartmentMapper.findById"/>
</resultMap>
<select id="findById" resultType="User" resultMap="UserRM" parameterType="int">
SELECT
u.user_id,
u.name,
u.password,
u.salary,
u.birthday,
department_id
FROM mybatis_in_action_user u
WHERE
user_id = #{id}
</select>
</mapper>
<?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.bjlemon.mybatis.mapper.DepartmentMapper">
<select id="findById" parameterType="int" resultType="Department">
SELECT
d.department_id id ,
d.department_name name,
d.department_location location
FROM
mybatis_in_action_department d
WHERE
d.department_id = #{id}
</select>
</mapper>
service
public interface UserService {
User findById(Integer id);
}
@Override
public User findById(Integer id) {
SqlSession sqlSession = null;
User user = null;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
user = mapper.findById(id);
} catch (Exception e) {
e.printStackTrace();
} finally {
MybatisUtils.clolseSqlSession();
}
return user;
}
测试
@Test
public void findUserById(){
User u =this.userService.findById(2);
}
延迟加载与直接查询出的区别在与:直接查询时返回的是当前对象,延迟加载返回为当前对象的一个代理对象