Mybatis学习(四)
# Mybatis学习(四)
Mybatis中的延迟加载
什么是延迟加载:
在真正使用数据的时候才发起查询,不用的时候不查询,按需查询
什么是立即加载:
不管用不用只要一调用方法,马上发起查询
一对一表中实现延迟查询
修改AccountDao.xml映射文件
<!-- 定义封装account和user的resultMap -->
<resultMap id="accountUserMap" type="account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--select属性指定的内容:查询用户的唯一标准-->
<association property="user" column="uid" javaType="user" select="com.itcast.dao.UserDao.findById"></association>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="accountUserMap">
select * from account
</select>
修改SqlMapConfig.xml映射文件
<!--设置采用延迟加载-->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
一对多表中实现延迟查询
修改UserDao.xml映射文件
<resultMap id="UserAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<collection property="accounts" ofType="account" select="com.itcast.dao.AccountDao.finAccountByUid" column="id"></collection>
</resultMap>
<!--查询用户-->
<select id="findAll" resultMap="UserAccountMap">
select * from user
</select>
<!--根据id查询用户信息-->
<select id="findById" parameterType="Integer" resultType="com.itcast.domain.User">
select * from user where id = #{uid};
</select>
在AccountDao中添加finAccountByUid方法
/**
* 根据用户id查询账户信息
* @param uid
* @return
*/
List<Account> finAccountByUid(Integer uid);
在AccountDao.xml映射文件中添加finAccountByUid方法
<select id="finAccountByUid" resultType="account">
select * from account where uid = #{uid}
</select>
Mybatis中的缓存
什么是缓存
存在于内存中的临时数据
为什么使用缓存
减少和数据库的交互次数,提高执行效率
什么样的数据能使用缓存:
适用于缓存:
经常查询并且不经常改变的
数据的正确与否对最终的结果影响不大
不适用于缓存:
经常改变的数据
数据正确与否对最终结果影响很大
一级缓存:
一级缓存是存在于SqlSession范围内的缓存
当调用SqlSession的修改,添加,删除,commit,close等方法时就会清空一级缓存
验证一级缓存的存在
关闭SqlSession
@Test
public void testFindById(){
User user = userDao.findById(41);
sqlSession.close();
sqlSession = factory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
User user2 = userDao.findById(41);
System.out.println(user==user2);
}
com.itcast.domain.User@462d5aee
2020-05-19 15:20:52,887 431 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,887 431 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,887 431 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1121453612 to pool.
2020-05-19 15:20:52,887 431 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2020-05-19 15:20:52,887 431 [ main] DEBUG source.pooled.PooledDataSource - Checked out connection 1121453612 from pool.
2020-05-19 15:20:52,887 431 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,890 434 [ main] DEBUG om.itcast.dao.UserDao.findById - ==> Preparing: select * from user where id = ?;
2020-05-19 15:20:52,891 435 [ main] DEBUG om.itcast.dao.UserDao.findById - ==> Parameters: 41(Integer)
2020-05-19 15:20:52,892 436 [ main] DEBUG om.itcast.dao.UserDao.findById - <== Total: 1
com.itcast.domain.User@757942a1
false
2020-05-19 15:20:52,892 436 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,893 437 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:20:52,893 437 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1121453612 to pool.
不关闭SqlSession
@Test
public void testFindById(){
User user = userDao.findById(41);
User user2 = userDao.findById(41);
System.out.println(user==user2);
}
2020-05-19 15:33:29,508 221 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2020-05-19 15:33:29,681 394 [ main] DEBUG source.pooled.PooledDataSource - Created connection 1121453612.
2020-05-19 15:33:29,681 394 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:33:29,682 395 [ main] DEBUG om.itcast.dao.UserDao.findById - ==> Preparing: select * from user where id = ?;
2020-05-19 15:33:29,699 412 [ main] DEBUG om.itcast.dao.UserDao.findById - ==> Parameters: 41(Integer)
2020-05-19 15:33:29,717 430 [ main] DEBUG om.itcast.dao.UserDao.findById - <== Total: 1
true
2020-05-19 15:33:29,718 431 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:33:29,718 431 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@42d8062c]
2020-05-19 15:33:29,718 431 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1121453612 to pool.
清理缓存
sqlSession.clearCache();
二级缓存
它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存
二级缓存使用步骤
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml配置):默认是支持的
第二步:让当前的映射文件支持二级缓存(在UserDao.xml配置)
<!--开启user支持二级缓存-->
<cache/>
第三步:让当前操作支持二级缓存(在select标签中配置)
<!--根据id查询用户信息-->
<select id="findById" parameterType="Integer" resultType="com.itcast.domain.User" useCache="true">
select * from user where id = #{uid};
</select>
Mybatis中的注解开发
注解CRUD开发
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
List<User> findAll();
/**
* 保存用户
* @param user
*/
@Insert("insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday})")
void saveUser(User user);
/**
* 更新用户
* @param user
*/
@Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id = #{id}")
void updateUser(User user);
/**
* 删除用户
* @param userId
*/
@Delete("delete from user where id = #{id}")
void deleteUser(Integer userId);
/**
* 根据id查询用户
* @param userId
* @return
*/
@Select("select * from user where id =#{id}")
User findById(Integer userId);
/**
* 根据用户名模糊查询
* @param username
* @return
*/
@Select("select * from user where username like '%${value}%'")
List<User> findByName(String username);
/**
* 查询用户总数
* @return
*/
@Select("select count(*) from user")
int findTotalUser();
注解开发结果集封装
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
@Results(id = "userMap",value = {
@Result(id=true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "address",property = "userAddress"),
@Result(column = "sex",property = "userSex"),
@Result(column = "birthday",property = "userBirthday"),
})
List<User> findAll();
注解一对多开发
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
@Results(id = "userMap",value = {
@Result(id=true,column = "id",property = "userId"),
@Result(column = "username",property = "userName"),
@Result(column = "address",property = "userAddress"),
@Result(column = "sex",property = "userSex"),
@Result(column = "birthday",property = "userBirthday"),
@Result(property = "accounts",column = "id",
many = @Many(select = "com.mybatis.dao.AccountDao.findAccountByUid",fetchType = FetchType.LAZY))
})
List<User> findAll();
注解开发开启二级缓存
//开启二级缓存
@CacheNamespace(blocking = true)