Mybatis相关面试题

Mybatis中的两种传参方式

#{}:编译后再取值,可以防止sql注入

${}:取值后再编译,一般用于传入数据库对象,如传入表名

Mybatis缓存

  • mybatis缓存流程都一样:都是先去缓存中找,如果找不到再执行sql语句并把结果存放到缓存中,若执行了增删改并commit,就会清空缓存
  • 底层都是hashmap
  • 一级缓存是基于sqlSession的,而二级缓存是基于mapper文件的namespace的
  • 一级缓存默认开启,二级缓存需要手动开启
  • 先查二级缓存,未命中再查一级缓存,未命中再查数据库
  • 开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中,如果我们要再取这个缓存的话,就需要反序列化了。所以mybatis中的pojo都去实现Serializable接口

Mybatis插件

原理:JDK动态代理

MyBatis在启动时可以加载插件,并保存插件实例到相关对象(InterceptorChain,拦截器链) 中。

待准备工作做完后,MyBatis处于就绪状态。

我们在执行SQL时,需要先通过DefaultSqlSessionFactory 创建 SqlSession。

Executor 实例会在创建 SqlSession 的过程中被创建, Executor实例创建完毕后,MyBatis会通过JDK动态代理为实例生成代理类。

这样,插件逻辑即可在 Executor相关方法被调用前执行。

Mybatis工作流程

1、加载配置信息,解析并封装到Configuration对象中

2、每条SQL标签被解析并封装到MappedStatement对象中,存放到Configuration中

3、Configuration对象有一个map,key为全路径名称+方法名,value为mappedStatement对象,Configuration对象会被封装到SqlSession对象中

4、后续执行查询的时候就通过“全路径名称+方法名”取出这个mappedstatement

关联查询

一对一关联使用association标签,一对多关联使用collection标签

Mybatis事务

1、事务的配置

<?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">
            <!-- mybatis使用jdbc事务管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使用连接池方式来获取连接 -->
            <dataSource type="pooled">
                <!-- 配置与数据库交互的4个必要属性 -->
                <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/mybatis/EmployeeMapper.xml"/>
    </mappers>   
</configuration>

2、mybatis在初始化解析<environment节点时,会根据Type="JDBC"创建一个JdbcTransactionFactory工厂

MyBatis事务管理策略

MyBatis的事务管理分为两种形式:

(1)使用JDBC的事务管理机制。

这种机制就是利用java.sql.Connection对象完成对事务的提交

(2)使用MANAGED的事务管理机制。

这种机制mybatis自身不会去实现事务管理,而是让程序的Web容器或者Spring容器来实现对事务的管理。

Transaction的接口实现类

(1)JdbcTransaction
JdbcTransaction直接使用JDBC的提交和回滚事务管理机制。它依赖于从dataSource中取得的连接connection来管理transaction的作用域,connection对象的获取被延迟到调用getConnection()方法。如果autoCommit设置为on,开启状态的话,它会忽略commit和rollback。

(2)ManagedTransaction

查看这个类,可知其中的commit方法和rollback方法没有具体实现。ManagedTransaction是让容器来管理事务Transaction的整个生命周期,使用ManagedTransaction的commit和rollback功能不会对事务有任何影响,它没有具体实现,它将事务管理权交给容器来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值