文章目錄
MyBatis_Day04
mybatis中的延遲加載
1. 什麼是延遲加載
在真正使用數據時才發起查詢,不用的時候不查詢。按需加載(懶加載)
2. 什麼是立即加載
不管用不用,只要一調用方法,馬上發起查詢。
3. 一對一延遲加載實現
4. 一對多延遲加載實現
mybatis中的緩存
1. 什麼是緩存
存在於內存中的臨時數據
2. 爲什麼使用緩存
減少數據庫交互次數,提高效率
3. 什麼樣的數據能使用緩存
適合使用緩存的數據
- 經常查詢的數據
- 不經常改變的數據
- 數據的正確與否對最終結果沒有太大影響
不適合使用緩存的數據
- 正確與否對最終結果影響特別大的
4. MyBatis中的一級緩存和二級緩存
一級緩存
一級緩存指Mybatis中sqlsession對象的緩存,當我們執行查詢之後,查詢得到的數據會同時存儲到sqlsession爲我們提供的一塊區域中,該區域的結構式一個Map,當我們再次查詢相同的數據,MyBatis會先去SQLsession中查詢是否擁有,有的話直接使用,當sqlsession消失,一級緩存隨之消失
一級緩存是 SqlSession 範圍的緩存,當調用 SqlSession 的修改,添加,刪除,commit(),close()等方法時,就會清空一級緩存
二級緩存
二級緩存產生的步驟
- 讓Mybatis框架支持二級緩存(在SqlMapConfig.xml中配置)
- 讓當前的映射文件支持二級緩存(在IUserDao.xml中配置)
- 讓當前的操作支持二級緩存(在select標籤中配置)
mybatis的註解開發
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>
- 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
- 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);
}
- 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. 緩存配置
二級緩存配置
- 在SqlMapConfig.xml中開啓
- 然後在UserDao.java上添加一個註解