myabtis延迟加载和缓存
2019-11-05 本文已影响0人
dillqq
延迟加载
查询用户信息应该是什么时候使用,什么时候查询
延迟加载是指在真正使用数据时查询
多对多,一对多采用延迟加载
立即查询不管用不用都要发起查询
多对一,或者一对一采用立即加载
实现一对一
一个账户对应一个用户
账户类
public class account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
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 +
'}';
}
}
用户类
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
'}';
}
}
接受结果集
public class AccountAndUser implements Serializable {
private Integer id;
private Integer uid;
private Double money;
private 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;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "AccountAndUser{" +
"id=" + id +
", uid=" + uid +
", money=" + money +
", user=" + user +
'}';
}
}
持久层类
public interface IAccount {
List<AccountAndUser> findAllyanchi();
}
主配置文件
<?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>
<properties resource="db.properties">
</properties>
<!-- 配置参数延时参数-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<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>
<mappers>
<mapper resource="com/dao/IAcount.xml"></mapper>
<mapper resource="com/dao/Sqlmapper.xml"></mapper>
</mappers>
</configuration>
账户类映射文件
<?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.Dao.IAccount">
<!--一对一延迟操作-->
<resultMap id="accountMapUser2" type="com.User.AccountAndUser">
<id property="id" column="id"></id>
<result property="uid" column="uid"/>
<result property="money" column="money"/>
<!--建立一对多的关系映射 ,配置封装user-->
<!-- 使用select标签查询用户的唯一标识 column也就是查询的id-->
<association property="user" column="uid" javaType="com.User.User" select="com.Dao.IDao.selectById"></association>
</resultMap>
<select id="findAllyanchi" resultMap="accountMapUser2">
SELECT * FROM account
</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.Dao.IDao">
<select id="selectById" parameterType="java.lang.Integer" resultType="com.User.User">
<!--select * from test1 w-->
select * from user1 where id = #{id}
</select>
</mapper>
多对多延迟
持久层用户
public interface IDao {
List<RoleAndUser> fillAll();
}
账号
public interface IAccount {
List<AccountUser> findByUid(Integer i);
}
RoleAndUser 类
public class RoleAndUser extends User {
private List<AccountUser> list;
public List<AccountUser> getList() {
return list;
}
public void setList(List<AccountUser> list) {
this.list = list;
}
@Override
public String toString() {
return super.toString()+"RoleAndUser{" +
"list=" + list +
'}';
}
}
账号类
public class AccountAndUser implements Serializable {
private Integer id;
private Integer uid;
private Double money;
private 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;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "AccountAndUser{" +
"id=" + id +
", uid=" + uid +
", money=" + money +
", user=" + user +
'}';
}
}
主配置文件
<?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>
<!-- 配置参数-->
<properties resource="db.properties">
</properties>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<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>
<mappers>
<mapper resource="com/dao/IAcount.xml"></mapper>
<mapper resource="com/dao/Sqlmapper.xml"></mapper>
</mappers>
</configuration>
映射文件账户
<?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.Dao.IAccount">
<select id="findByUid" parameterType="java.lang.Integer" resultType="com.User.AccountUser">
select * from account where uid=#{uid}
</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.Dao.IDao">
<resultMap id="mapper1" type="com.User.RoleAndUser">
<id property="id" column="id"></id>
<result property="uid" column="uid"/>
<result property="money" column="money"/>
<!--建立一对一的关系映射 ,配置封装user-->
<collection property="list" column="uid" ofType="com.User.AccountUser" select="com.Dao.IAccount.findByUid">
</collection>
</resultMap>
<select id="fillAll" resultMap="mapper1" >
select * from user1
</select>
</mapper>
缓存
存在于内存中的数据,减少和数据库的交互数据,提高效率。经常查询的并且不经常改的,且数据结果对最终数据影响不大。
不使用缓存的 经常改变的数据,数据的正确性对数据的影响性大。
myabtis的一级缓存指的是SqlSession的对象
@Test
public void testFirstLevel()
{
User u = iDao.selectById(1);
System.out.println(u);
//sqlSession.close();
// 清空一级缓存
sqlSession.clearCache();
//如果更新了数据则会再次查询对象不会成立或者ommit等方法就会清空缓存
sqlSession = sqlSessionFactory.openSession();
iDao = sqlSession.getMapper(IDao.class);
User u1 = iDao.selectById(1);
System.out.println(u1);
System.out.println(u == u1);
}
二级缓存指的是SqlSessionFactory对象的缓存,由同一个SqlSessionFactory创建的SqlSession 对象共享其缓存。二级缓存存放的是数据而不是对象,取出的数据不是同一个对象
使用步骤
第一步让mybatis支持二级缓存(在主配置文件中设置)
<settings>
<!-- 默认值就是true-->
<setting name="cacheEnabled" value="true"/>
</settings>
第二步让当前的映射文件支持二级缓存(在映射文件设置)
第三步让当前的操作支持二级缓存(在select标签中设置 )
<?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.Dao.IDao">
<!-- 在映射文件中配置-->
<cache/>
<!-- 在select语句中配置-->
<select id="selectById" parameterType="java.lang.Integer" resultType="com.User.User" useCache="true">
select * from user1 where id = #{id}
</select>
</mapper>
测试类
@Test
public void test3() throws IOException {
InputStream in = Resources.getResourceAsStream("SqlConfigMap.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
iDao = sqlSession.getMapper(IDao.class);
User users = iDao.selectById(1);
System.out.println(users);
sqlSession.close();
sqlSession = sqlSessionFactory.openSession();
iDao = sqlSession.getMapper(IDao.class);
User users1 = iDao.selectById(1);
System.out.println(users1);
System.out.println(users == users1);
sqlSession.close();;
in.close();
}