Mybatis(day4)延迟加载、缓存、注解开发(不需要映射文件Mapper.xml)

本文详细介绍了MyBatis框架的高级特性,包括连接池、事务管理、动态SQL、关系映射、延迟加载、缓存机制及注解开发等。深入探讨了一对一、一对多的关系映射方式,以及一级缓存和二级缓存的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 连接池(数据源):
    type: POOLED,UNPOOLED ,JNDI
2. 事务问题
    1) 设置手动提交(开启事务)
    2) 提交(提交事务)
    3) 回滚事务
    4) 设置自动提交(还原状态)
     openSession()  -- 不可以自动提交事务的SqlSession对象
     openSession(true)  -- 可以自动提交事务的SqlSession对象
3. 动态sql语句
     if   多条件查询
    where   帮助程序员处理第一个and符号,结合if语句使用
    sql片段: 提取常用的代码
    foreach: 循环
        属性:collection="list | array", item="循环中每一个对象" open="前缀" close="后缀" seperator="分隔符"
    
4. 关系映射-- 一对一: 一个账户对应一个用户
    1) 声明一个pojo,包含账户和用户所有的属性
    2) 在account声明一个User的属性
        <result property="user.属性" column>
    3)在account声明一个User的属性
        <association property="属性名" javaType="类型">
            <result property="属性" column>    
        </association>
5. 关系映射-- 一对多: 一个用户对应多个账户
    1) 在user类中声明一个账户的集合属性
    2) <collection property="属性名" ofType="类型">
            <result property="属性" column>    
       </collection>
6. 关系映射-- 多对多:两个一对多

 

1、mybatis延迟加载

2、mybatis缓存

3、mybatis注解开发

===========================================================================

1、mybatis延迟加载

1. 也叫懒加载
2. 什么时候需要,什么时候去获取
    什么时候需要该数据,什么时候执行sql语句去查询

一对一延迟加载    (association)

一个count对应一个user,当然是先找acount中的一条数据(select * from account);再根据它的u_id(对应user主键),找到对应的user的主键,根据主键查出user的一条数据。

如果是懒加载,用不到user中的数据,那么后半部分就不执行。

延迟加载和立即加载的区别:

不管有没有相同的列名,都是单张表的映射,没有两张表的映射了。

以上的这种方法(一对一延迟加载)是比较常用的方法。

 

一对多延迟加载  (collection)

一个user对应多个account,先select * from user;如果用到了account数据,那么根据user的主键id查找account中u_id与之对应的数据,即select * from account where u_id = #{id}。

以上是一对一,和一对多的查询方法。

延迟加载和立即加载的日志过程

懒加载用到才执行sql语句查询

开启全局的延迟加载

mybatis缓存

 

a、一级缓存

/**
 * 一级缓存
 *  1,在同一sqlSession对象范围下,两次执行同一个sql语句,第二层没有执行sql语句,说明缓存的存在
 *  2.如果执行了增删改,提交操作,会清空缓存
 *  3. sqlSession.clearCache();清空缓存
 *  4. 一级缓存是SqlSession级别的, 必须是在一个sqlsession对象范围下才可以的得到一级缓存,不是同一个sqlSession
 *
 * 一级缓存运行流程
 *  第一次执行sql语句,查询到数据,在会在一级缓存中存储sql语句和数据,以 sql语句为key值, 以数据为value值
 *  在第二层执行sql语句时,会先从缓存中查询 ,以sql为key查询,得到数据,直接返回,如果没有相应的sql语句,则查询数据库
 *
 */

b、二级缓存

/**
 * 二级缓存
 *   1. 是sessionFactory级别的, 可以在多个SqlSession对象共享缓存数据,存储作用域为Mapper的namespace级别
 *   2. 默认的是开启的
 *      <setting name="cacheEnabled" value="true"/>
 *   3. 在需要使用二级缓存的配置映射文件中开启
 *      <cache/>
 *   4. 需要在二级缓存中保存的pojo对象必须实现序列化接口
 *       User  implements Serializable
 *   5. 在同一namespace范围下,执行提交操作,会清空该namespace的缓存
 *   
 * 二级缓存的工作流程
 *     1,在任意一个sqlSession对象中执行了sql查询语句,当关闭sqlSession对象时,在二级缓存中保存数据:以 namespace.sql语句为key值
 *      以对象为value存储
 *     2. 当其他sqlSession对象执行时, 需要根据namespace.sql 查询是否存在缓存
 */

核心配置文件       <setting name="cacheEnabled" value="true"/>

但是需要在配置文件中通知        在需要使用二级缓存的配置映射文件中开启<cache/>

需要在二级缓存中保存的pojo对象必须实现序列化接口

过程:

在不同的sqlSession中共享缓存,碰撞几率0.5,如果再写一个sqlSession3,那么碰撞几率为2/3。

mybatis注解开发和结果集映射

核心配置文件:

<?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 resource="jdbc.properties"></properties>
    <!--配置数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入配置文件-->
    <mappers>
        <package name="com.itheima.dao"></package>
    </mappers>
</configuration>

不需要再写映射文件

主键回显

注解实现一对一

注解实现一对多 (一个用户,多个账号)

注解开发动态sql语句

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值