Mybatis知识点
1、什么是Mybatis?
Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建Statement等繁杂的过程。
2、什么是 ORM?
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
3、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
4、ORM的优缺点?
「优点」
1.提高了开发效率。由于 ORM 可以自动对 Entity 对象与数据库中的 Table 进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
2.ORM 提供了对数据库的映射,不用 sql 直接编码,能够像操作对象一样从数据库获取数据。
「缺点」牺牲程序的执行效率和会固定思维模式,降低了开发的灵活性。
5、Mybaits 的优缺点?
「优点」
1.基于SQL 语句编程,灵活,不会对应用程序或者数据库的现有设计造成任何影响;
2.与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
「缺点」
1.对开发人员编写 SQL 语句的功底有一定要求。
2. SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
6、Mybatis 动态 sql 有什么用?
Mybatis 提供了 9 种动态 sql 标签:
if
满足条件再执行标签内容
where
where标签可以避免出现多个and的情况。会自动把第一个查询条件的and改成where。多用于查询条件当中
choose/when/otherwise
组合使用,选择多个条件中的一个
foreach
类似于一次java集合的遍历
bind
将一个传递进来的值绑定到新的值上面。比如模糊查询
set
set标签多用于修改操作 在表名后加上set 并且去掉多余的, 比如age = #{age}, 这里的,
trim
mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
7、Mybatis的Xml 映射文件中有哪些标签?有什么用?
除了常见的 select
|insert
|updae
|delete
标签之外,代表查增改删,还有:
<resultMap>
、<parameterMap>
、<sql>
、<include>
、<selectKey>
,加上动态 sql 的 9 个标签,其中为 sql 片段标签,通过标签引入 sql 片段,为不支持自增的主键生成策略标签。
id 唯一的名称,对应dao中mapper的接口名称
paramterType 定义传入的参数类型
resultType 返回数据类型对应实体类
resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用
flushCache 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false
useCache 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:true
8、MyBatis编程步骤是什么样的?
1、 创建SqlSessionFactory
2、 通过SqlSessionFactory创建SqlSession
3、 通过sqlsession执行数据库操作
4、 调用session.commit()提交事务
5、 调用session.close()关闭会话
9、Mybatis 是否支持延迟加载?
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
10、mapper.xml 文件对应的 Dao 接口原理是?
简单说:使用了 JDK 动态代理和反射,把接口和 xml 绑定在一起而搞定的。
11、Mybatis 全局配置文件中有哪些标签?
configuration 配置
properties 属性:可以加载
properties 配置文件的信息
settings 设置:可以设置 mybatis 的全局属性
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
12、@Mapper注解
@Mapper注解是mybatis的注解,是用来说明这个是一个Mapper
作用:
1.使用@Mapper将NewsDAO接口交给Spring进行管理
2.不用写Mapper映射文件(XML)
13、#{}和${}的区别?
Mybatis在处理#{}
时,会将sql中的#{}
替换为?
号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}
时,就是把${}
替换成变量的值。
使用#{}
可以有效的防止SQL注入,提高系统安全性。
14、Mybatis的一级、二级缓存?
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。
二级缓存与一级缓存机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(namespace),并且可自定义存储源,如Ehcache。默认打不开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。
对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespace)进行了增/删/改操作后,默认该作用域下所有select中的缓存将被clear。