MyBatis+SpringMVC+SpringBoot

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();
}
上一篇 下一篇

猜你喜欢

热点阅读