1、什么是Mybatis?
首先:它是一个框架。
是什么框架呢?是一个半自动的对象关系映射持久层框架。
最简单话的回答:Mybatis是一个半自动的对象关系映射持久层框架。
对象关系映射:Object Relation Mapping,缩写:ORM
那什么是叫半自动?什么叫对象关系映射?什么是持久层?
- 半自动:需要手动写SQL语句 。Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
- 对象关系映射:这个要拆开来看,对象指的是Java对象,关系指得是数据库中的关系模型,对象关系映射指的是Java对象和数据库关系模型之间建立一种对应关系。再用例子来解释一下:用一个Java的Car类,对应数据库中的一张Car表,并且类中的属性和表中的列一一对应(顺序一致)。那Car类就对应Car表,一个Car的实例就对应Car表的一行数据。
- 持久层:可以理解成将数据保存在 数据库或者硬盘一类可以保存很长时间的设备里面。
2、Mybatis有什么特点?
- 具有较高的SQL灵活性
- 支持高级映射(一对一,一对多)
- 动态SQL
- 延迟加载和缓存
SQL灵活性:Mybatis内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建链接、创建statement等繁杂的过程,可以让程序员直接编写原生态sql语句,可以严格控制sql执行性能。
映射:Mybatis可以使用 XML 或 注解 来配置映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过XML或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射为java对象并返回。
3、MyBatis 的缓存有哪些?
Mybatis缓存分为一级缓存和二级缓存
- 一级缓存:信息缓存在 session 里面,默认就有,
- 二级缓存:信息缓存在它的命名空间,默认没有,需要自己设置。
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空。
二级缓存:与一级缓存其机制相同 ,默认也是采用 PerpetualCache,HashMap存储 ,不同在于其存储作用域为Mapper(Namespace), 并且可自定义存储源,如 Ehcache。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:
使用二级缓存属性类需要实现 Serializable 序列化 接口(可用来保存对象的状态),可在它的映射文件中配置
对于缓存数据更新机制, 当某一个作用域 ( 一级缓存Session/二级缓存 Namespaces)的进行了 C/U/D 操作后, 默认该作用域下所有 select 中的缓存将被clear。
4、#{}和${}的区别是什么?
5、resultType与resultMap的用法与区别有哪些?
首相,MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。
那什么时候用resultType,什么时候用resultMap?
通常,如果类里的属性名 和 表里的 字段名 一致时,可以自动的ORM
如果,表里字段的名字 和 类里属性的名字不一样时,resultType无法完成ORM,需要使用resultMapresultType与resultMap都是用来设置返回类型。
- resultType是直接表示返回类型的
- resultMap则是对外部ResultMap的引用,
ResultType
基本使用---- 类属性名 与 数据库字段 一一对应。
<!-- resultType的例子--通过id查找车的数据-->
<select id="getById" resultType="cn.lyh.pojo.Car">
select * from car where id = #{id}
</select>
ResultMap
基本使用---- 类属性名 和 数据库字段 不一样时
属性 | 描述 |
---|---|
id | resultMap的唯一标识 |
column | 库表的字段名 |
property | 实体类里的属性名 |
<!--当字段名和属性名不一致时用resultMap
属性id: 每个resultMap的唯一标识
属性type: 要把结果ORM给哪个类的全路径
-->
<resultMap id="UserERM" type="cn.lyh.pojo.UserExtra">
<!-- 描述特殊的字段,column描述表里的字段名 property描述类里的属性名 -->
<result column="user_id" property="userId"></result>
</resultMap>
<select id="selectList" resultMap="UserERM">
select * from user_extra
</select>
注意:
- MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis会自动的给把对应的值赋给resultType所指定对象的属性,其中字段名与对象属性名要相同,且顺序也要相同。
- resultType跟resultMap不能同时存在。
- 其实在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。map<数据库字段名,值>
总结:
- resultType:返回类型简单,如:String、int、Map,当然也可以是对象,但询出的字段在相应的pojo中必须有和它相同的字段一一对应。
- resultMap: 适合使用返回值是自定义实体类的情况,使返回的内容更加多样化。