MyBatis_Day04

MyBatis_Day04

mybatis中的延遲加載

1. 什麼是延遲加載

在真正使用數據時才發起查詢,不用的時候不查詢。按需加載(懶加載)

2. 什麼是立即加載

不管用不用,只要一調用方法,馬上發起查詢。

3. 一對一延遲加載實現

在這裏插入圖片描述

4. 一對多延遲加載實現

在這裏插入圖片描述

mybatis中的緩存

1. 什麼是緩存

存在於內存中的臨時數據

2. 爲什麼使用緩存

減少數據庫交互次數,提高效率

3. 什麼樣的數據能使用緩存

適合使用緩存的數據
  1. 經常查詢的數據
  2. 不經常改變的數據
  3. 數據的正確與否對最終結果沒有太大影響
不適合使用緩存的數據
  1. 正確與否對最終結果影響特別大的

4. MyBatis中的一級緩存和二級緩存

一級緩存

一級緩存指Mybatis中sqlsession對象的緩存,當我們執行查詢之後,查詢得到的數據會同時存儲到sqlsession爲我們提供的一塊區域中,該區域的結構式一個Map,當我們再次查詢相同的數據,MyBatis會先去SQLsession中查詢是否擁有,有的話直接使用,當sqlsession消失,一級緩存隨之消失

一級緩存是 SqlSession 範圍的緩存,當調用 SqlSession 的修改,添加,刪除,commit(),close()等方法時,就會清空一級緩存

二級緩存

二級緩存產生的步驟

  1. 讓Mybatis框架支持二級緩存(在SqlMapConfig.xml中配置)
    在這裏插入圖片描述
  2. 讓當前的映射文件支持二級緩存(在IUserDao.xml中配置)
    在這裏插入圖片描述
  3. 讓當前的操作支持二級緩存(在select標籤中配置)
    在這裏插入圖片描述

在這裏插入圖片描述

mybatis的註解開發

1. 環境搭建

  1. SqlMapConfig.xml的創建
<?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>
    <!--引入jdbc.properties配置文件-->
    <properties resource="jdbc.properties"/>
    <!--使用typeAliases配置別名,它只能配置domain中類的別名 -->
    <typeAliases>
        <package name="com.lld.domain"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <!--事務配置-->
            <transactionManager type="JDBC"></transactionManager>
            <!--連接數據庫參數配置-->
            <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>


    <!--讀取mapper配置文件-->
    <mappers>
        <!--<mapper resource="com/lld/dao/UserDao.xml"/>-->
        <package name="com.lld.dao"/>
    </mappers>
</configuration>
  1. jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://39.106.68.251:3306/eesy_mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=1

2. 單表CRUD

  1. UserDao.java
package com.lld.dao;

import com.lld.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * @ClassName UserDao
 * @Description TODO
 * @Author LLD
 * @Date 2020/2/6 14:57
 * @Version 1.0
 */
public interface UserDao {
    /**
     * 註解開發:查詢所有
     */
    @Select("select * from user")
    List<User> findAll();

    /**
     * 註解開發:更新
     */
    @Update("update user set username = #{username},address = #{address},sex = #{sex},birthday = #{birthday} where id = #{id}")
    void updateUser(User user);

    /**
     * 註解開發:保存
     */
    @Insert("insert into user(username,address,birthday,sex) values(#{username},#{address},#{birthday},#{sex})")
    void saveUser(User user);

    /**
     * 註解開發:刪除
     */
    @Delete("delete from user where id = #{id}")
    void deleteUser(Integer id);

    /**
     * 註解開發:通過id查詢user
     */
    @Select("select * from user where id = #{id}")
    User findUserById(Integer id);

    /**
     * 註解開發:查詢記錄個數
     */
    @Select("select count(1) from user")
    Integer findCount();

    /**
     * 註解開發:模糊查詢
     */
    @Select("select * from user where username like #{username}")
    List<User> findUserByUsername(String username);
}

  1. UserTest.java
package com.lld.test;


import com.lld.domain.User;
import com.lld.dao.UserDao;
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.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @ClassName userTest
 * @Description TODO
 * @Author LLD
 * @Date 2020/2/6 14:59
 * @Version 1.0
 */
public class userTest {

    private InputStream in;
    private SqlSession sqlSession;
    private UserDao userDao;
    private SqlSessionFactory factory;

    @Before
    public void init()throws Exception{
        //1.使用流讀取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.創建sqlsessionFactory
        factory = new SqlSessionFactoryBuilder().build(in);
        //3.獲得sqlsession
        sqlSession = factory.openSession();
        //4.獲得代理對象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After
    public void close()throws Exception{
        //提交事務
        sqlSession.commit();
        //6.關閉資源
        sqlSession.close();
        in.close();
    }

    /**
     * 測試註解開發的查詢所有
     */
    @Test
    public void demo1(){
        List<User> all = userDao.findAll();
        for (User user : all) {
            System.out.println(user);
        }
    }

    /**
     * 測試註解開發更新user
     */
    @Test
    public void demo2(){
        User user = new User();
        user.setAddress("山亭");
        user.setSex("男");
        user.setUsername("張渣");
        user.setBirthday(new Date());
        user.setId(51);
        userDao.updateUser(user);
    }

    /**
     * 註解開發測試保存user
     */
    @Test
    public void demo3(){
        User user = new User();
        user.setBirthday(new Date());
        user.setUsername("奧特曼");
        user.setSex("男");
        user.setAddress("光之國");
        userDao.saveUser(user);
    }

    /**
     * 註解開發測試刪除user
     */
    @Test
    public void demo4(){
        userDao.deleteUser(48);
    }

    /**
     * 註解開發測試查詢一個user
     */
    @Test
    public void demo5(){
        User user = userDao.findUserById(51);
        System.out.println(user);
    }

    /**
     * 註解開發測試查詢記錄個數
     */
    @Test
    public void demo6(){
        Integer count = userDao.findCount();
        System.out.println(count);
    }
    /**
     * 註解開發測試根據姓名模糊查詢
     */
    @Test
    public void demo7(){
        List<User> users = userDao.findUserByUsername("%曲%");
        for (User user : users) {
            System.out.println(user);
        }
    }
}

3. 註解解決表中字段與類中屬性名稱不匹配

在這裏插入圖片描述

4. 多表查詢操作

一對一配置

一對一建議使用立即加載
在這裏插入圖片描述

一對多配置

一對多建議使用延遲加載
在這裏插入圖片描述

5. 緩存配置

二級緩存配置
  1. 在SqlMapConfig.xml中開啓
    在這裏插入圖片描述
  2. 然後在UserDao.java上添加一個註解
    在這裏插入圖片描述
發佈了48 篇原創文章 · 獲贊 10 · 訪問量 1232
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章