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);
    }
}
相關文章
相關標籤/搜索