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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章