JAVA--高级开发--Mybatis框架

------Mybatis框架-:缓存问题-------java

<?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.bdit.dao.IUserDao">
    <!--cache 标签标示当前这个 mapper 映射将使用二级缓存开启二级缓存-->
<!--    <cache></cache>-->
   <!--一级缓存是 SqlSession 级别的缓存,-->
    <!--useCache="true" 表明当前这个 statement 要使用二级缓存,
    若是不使用二级缓存就设置为 false【针对每次查询都须要更新的数据,
    就不建议使用二级缓存】-->
    <select id="findFiby" resultType="User" parameterType="int" useCache="true">
        select *  from  user where id=#{id}
    </select>

    <resultMap id="Map6" type="User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="address" property="address"/>
        <!--关联表中的实体属性-->
        <collection property="accountList" javaType="List" ofType="Account"
                    select="com.bdit.dao.IAccountDao.byid" column="id"/>
    </resultMap>

    <select id="findAll" resultMap="Map6">
        select *  from  user
    </select>

   <!--一级缓存-->
    <select id="findAll" resultType="User">
        select * from user
    </select>

</mapper>

SqlMapConfig映射文件mysql

<?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>
<!--    &lt;!&ndash;-开启二级缓存:默认就是开启,则能够不写&ndash;&gt;-->
<!--    <settings>-->
<!--        <setting name="cacheEnabled" value="true"/>-->
<!--    </settings>-->
    <!--加载ab.properties属性文件:第二种方式-->
    <properties resource="ab.properties"></properties>
    <!--开启延迟加载:-->
    <!--
     lazyLoadingEnabled:若是等于true的话,就延迟加载,若是等于false的话就深度加载
     aggressiveLazyLoading:若是等于true的话,就延迟加载,若是等于false的话就深度加载
    -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="fasle"/>
    </settings>

    <!--定义单个别名:若是定义了别名,IUserDao中凡是用到包名.类名的 都用别名来代替-->
    <typeAliases>
<!--        <typeAlias type="User" alias="User"/>-->
        <!--若是有多个,则批量定义,扫描整个包下的类,别名为类名,(首字母大小写均可以)-->
        <package name="com.bdit.model"/>
    </typeAliases>
   
    <!--开启延迟加载:-->

    <!--配置Mybatis的环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事物的类型-->
            <transactionManager type="JDBC"/>
            <!--配置链接数据库的信息,用的数据源是(链接池)-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--告知mybatis映射文件的位置-->
    <!--SQL映射文件mybatis是不认识的,全部须要告知-->
    <mappers>
<!--        <mapper resource="com/bdit/dao/IUserDao.xml"/>-->
        <!--基于注解的方式-->
       <!--<mapper class="com.bdit.dao.IUserDao"/>-->

        <!--注册指定包下的全部 mapper接口:也就是所谓的DAO接口-->
       <package name="com.bdit.dao"/>
    </mappers>
</configuration>

测试类sql

package com.bdit;

import com.bdit.dao.IUserDao;
import com.bdit.model.Account;
import com.bdit.model.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

//测试类
public class mybatisTest1 {
    private InputStream input;
    private SqlSessionFactory factory;
    private SqlSession session;
    private IUserDao iUserDao;
    @Before //封装好的数据,初始化时加载
    public void init()throws IOException {
        //1 、 读取配置文件-->SqlMapConfig核心的配置文件
        input = Resources.getResourceAsStream("SqlMapConfig.xml");
        //二、建立SqlSessionFactoryBuilder构建者的对象。
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        // 三、使用构建者对象建立工厂对象:SqlSessionFactory
        factory = builder.build(input);
        //四、使用SqlSessionFactory对象建立SqlSession对象
        //4.1 =设置事务为自动提交
        session = factory.openSession(true);
        //五、使用SqlSession对象建立Dao接口的代理对象
        iUserDao= session.getMapper(IUserDao.class);
    }
    @After
    public  void  destory()throws IOException {
        //提交事务 --上面设置为自动提交
        //session.commit();
        //关闭释放资源
        session.close();
        input.close();
    }
    //查询帐全部的帐户:并关联全部的用户
    @Test
    public void find(){
        List<User>list=iUserDao.findAll();
        for(User ss:list){
            System.out.println(ss.getId()+"=="+ss.getUsername()+"=="+ss.getAge()+"=="+ss.getAddress());
           List<Account>list1=ss.getAccountList();
           for(Account s:list1){
               System.out.println(s.getZid()+"--"+s.getUid()+"--"+s.getMoney());
           }
        }
    }
}

package com.bdit;

import com.bdit.dao.IUserDao;
import com.bdit.model.Account;
import com.bdit.model.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

//测试类
public class mybatisTest2 {
    private InputStream input;
    private SqlSessionFactory factory;
    private SqlSession session;
    private IUserDao iUserDao;
    @Before //封装好的数据,初始化时加载
    public void init()throws IOException {
        //1 、 读取配置文件-->SqlMapConfig核心的配置文件
        input = Resources.getResourceAsStream("SqlMapConfig.xml");
        //二、建立SqlSessionFactoryBuilder构建者的对象。
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        // 三、使用构建者对象建立工厂对象:SqlSessionFactory
        factory = builder.build(input);
        //四、使用SqlSessionFactory对象建立SqlSession对象
        //4.1 =设置事务为自动提交
        session = factory.openSession(true);
        //五、使用SqlSession对象建立Dao接口的代理对象
        iUserDao= session.getMapper(IUserDao.class);
    }
    @After
    public  void  destory()throws IOException {
        //提交事务 --上面设置为自动提交
        //session.commit();
        //关闭释放资源
        session.close();
        input.close();
    }
    //一级缓存是 SqlSession 级别的缓存,
    // 只要 SqlSession 没有 flush 或 close,它就有效
    @Test
    public void find(){
        User  user=iUserDao.findFiby(2);
        System.out.println("第一次查询用户的User"+user);
        //测试一级缓存的清空
        session.clearCache();

        User  user1=iUserDao.findFiby(2);
        System.out.println("第二次查询用户的User"+user1);
        System.out.println(user==user1);
    }

    //测试二级缓存
    @Test
    public  void  method(){
        SqlSession session1=factory.openSession();
        IUserDao userDao1=session1.getMapper(IUserDao.class);
        User user=userDao1.findFiby(1);
        System.out.println("第一次查询"+user);
        session.close();
        SqlSession session2=factory.openSession();
        IUserDao userDao2=session2.getMapper(IUserDao.class);
        User user2=userDao2.findFiby(1);
        System.out.println("第二次查询"+user2);
        session.close();
        System.out.println(user==user2);
    }
}
相关文章
相关标签/搜索