新建实体类User
package com.cncs.domain;
import java.util.Date;
import java.util.List;
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
新建接口IUserDao
package com.cncs.dao;
import com.cncs.domain.User;
import java.util.List;
public interface IUserDao {
/**
* 查询所有
* @return
*/
List<User> findAll();
/**
* 查询一个
* @param userId
* @return
*/
User findById(int userId);
}
新建MyBatis核心配置文件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>
<!--配置properties-->
<properties resource="jdbcConfig.properties"></properties>
<!-- <properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_learn"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>-->
<!--使用typeAliases配置别名,它只能配置domain中的别名-->
<typeAliases>
<!--type指定的是实体类的全限定类名,alias指定的是别名,别名一旦指定后,使用时不区分大小写。-->
<!--<typeAlias type="com.cncs.domain.User" alias="user"/>-->
<!--name属性指定要配置别名的包后,该包下的所有实体类都将注册别名,并且别名就是类名,使用时不区分大小写-->
<package name="com.cncs.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>
<!--指定每个映射配置文件的位置-->
<mappers>
<!--<mapper resource="com/cncs/dao/IUserDao.xml"/>-->
<!--package标签用于指定dao接口所在的包,当指定完后,mybatis就可以找到和接口对应的映射配置文件,也就替代了mapper标签-->
<package name="com.cncs.dao"></package>
</mappers>
</configuration>
新建映射配置文件IUserDao.xml
<?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.cncs.dao.IUserDao">
<!--配置查询结果映射关系-->
<resultMap id="userMap" type="user">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="sex" column="sex"/>
<result property="birthday" column="birthday"/>
<result property="address" column="address"/>
</resultMap>
<!-- 查询所有-->
<select id="findAll" resultMap="userMap">
select u.*,a.id as aid,a.uid,a.money from user u left join account a on u.id = a.uid
</select>
<select id="findById" parameterType="int" resultType="user">
select * from user where id=#{id}
</select>
</mapper>
新建测试类UserTest
package com.cncs.test;
import com.cncs.dao.IUserDao;
import com.cncs.domain.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.ArrayList;
import java.util.List;
public class UserTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before //在测试方法之前执行
public void init() throws IOException {
//1.读取mybatis核心配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建工厂对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(in);
//3.通过工厂对象构建SqlSession对象
sqlSession = sessionFactory.openSession(true);
//4.通过SqlSession对象创建代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After //在测试方法之后执行
public void destory() throws IOException {
//6.释放资源
sqlSession.close();
in.close();
}
@Test
public void testLevelOneCache() throws IOException {
User user1 = userDao.findById(41);
System.out.println(user1);
User user2 = userDao.findById(41);
System.out.println(user2);
System.out.println(user1==user2);
}
}
分析查询结果
观察查询结果可知两次查询结果都是同一对象
在两次查询之间清楚缓存,再重新获取SqlSession对象,再次执行查询
分析两次查询结果不再是同一对象
两种清除一级缓存的方式
方式一
sqlSession.close();
sqlSession = sessionFactory.openSession(true);
userDao = sqlSession.getMapper(IUserDao.class);
方式二
sqlSession.clearCache();
userDao = sqlSession.getMapper(IUserDao.class);
PS:一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,会清空一级缓存。