1.什么是MyBatis??
MyBatis 是持久层框架,它支持自定义 SQL、存储过程以及高级映射。说白了就是一个简化SQL的工具(我认为。。)它是对JDBC的操作数据库的过程进行封装。
2.Mybatis的执行过程?
(1)读取Mybatis的配置文件mybatis-config.xml,用于配置数据库连接信息,以及要扫描的mapper文件
(2)加载映射文件。mybatis-config.xml 文件可以加载多个映射文件(UserMapper.xml、OrderMapper.xml...),每个文件对应数据库中的一张表。
(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
(5)采用个Executor的接口来操作数据库,根据SqlSession传递的动态参数进行执行语句
(6)在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
3.Mybatis的原理?
Mybatis的基本原理:先封装好SQL,再就是调用JDBC去连接数据库,最后将表执行后的结果封装为Java类。
而MyBatis的四大核心对象:
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法。类似于JDBC里面的Connection。
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。
4.Mybatis的一级缓存、二级缓存?
一级缓存:
基于PerpetualCache的HashMap本地缓存,它的声明周期是和SQLSession⼀致的,有多个
SQLSession或者分布式的环境中数据库操作,可能会出现脏数据。
当Session flush或close之后,该Session中的所有Cache就将清空,默认⼀级缓存是开启的。
二级缓存:
二级缓存也是基于PerpetualCache的HashMap本地缓存,不同在于其存储作⽤域为Mapper级别的,如果多个SQLSession之间需要共享缓存,则需要使⽤到⼆级缓存,并且⼆级缓存可⾃定义存储源, 如Ehcache。
默认不打开⼆级缓存。要开启⼆级缓存,使⽤⼆级缓存属性类需要实现Serializable序列化接⼝(可⽤来保存对象的状态),可在它的映射⽂件中配置,⼆级缓存会将sql语句作为key,将结果作为value缓存到应⽤程序的⼀个全局变量中,如果下⼀次另⼀个线程请求相同的sql语句,会先到缓存中去看看有没有结果,有的话直接返回,没有再去mysql查询。线程间共享。
开启⼆级缓存数据查询流程:⼆级缓存 -> ⼀级缓存 -> 数据库。
5..mybatis驼峰命名属性怎么配置?
(1) 在MyBatis的全局配置文件(通常是`mybatis-config.xml`)中添加以下配置:在setting中设置mapUnderscoreToCamelCase为true,就可以实现驼峰转换了
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
(2) 在SpringBoot 项目中没有mybatis.xml文件,可以在application.properties中,加入下面的配置项:
mybatis.configuration.mapUnderscoreToCamelCase=true
或
mybatis.configuration.map-underscore-to-camel-case=true
(3) 使用注解:在Mapper接口的方法或者参数上,可以添加`@Param`注解,并使用`@Param`注解的`value`属性来指定数据库字段名和Java对象属性名之间的映射关系
6.MyBatis 中的#{}和${}有什么区别?
7.Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
(1) <resultMap>、<parameterMap>、<sql>、<include>、<selectKey>