文章目录
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上添加一个注解