有没有面试的小伙伴问道你对Mybatis的理解不知道怎么回答的或者明明知道就是不知道怎么回答的?
看见这个问题咱们首先回想他是什么的,干什么的,如何实现,接下来是小编总结的几点:
简介
mybatis是一款优秀的半自动持久化的框架。
半自动意思是程序员需要自己手动编写SQL语句,所有要求程序员对于不同的SQL服务器的脚本非常熟悉,但是相对而言自定义SQL会更加灵活高效。
持久层框架的意思是将对象从瞬时态经过持久化操作后变成持久态的过程。对象有三种状态,分别是瞬时态、持久态和游离态。瞬时态的对象被存储在内存中,可能随时会丢失,比如断电。持久态是对象被存储在持久化介质中,比如磁盘,数据库或者云介质。游离态是对象可能已经不与任何的session会话关联。mybatis就能够将内存中瞬时态的对象持久化到数据库中
orm:object relational mapping,对象关系映射,一张表对应一个类,一个字段对应一个属性,一条记录对应一个对象,一个外键对应一个关联对象。将数据库中的表和类进行一一关联
底层原理
底层使用的是JDBC,而且默认使用的是PrepareStament方式实现,可以更加高效并且预防SQL注入。借助reslttype可以实现将表的字段和类的属性关联,动态的自动设置对应的值。resultMap可以解决字段名和属性名不一致的的映射结果。
表间关系:
一对一,多对一,在resultmap中都可以使用association实现关联效果。里面有对应的property属性和column字段的设置,还有select设置对应的查询结果
一对多和多对多,在resultmap中可以设置collection来实现集合的效果。里面有对应的property属性和column字段的设置,还有select设置对应的查询结果,里面还多了一个ofType属性,用来描述集合中的元素类型
resulttype和resultmap对比,resulttype指定的直接是pojo或者dto对象本身。而resultmap用来再次设置表中自己的信息以及表间关系。
实现方式
实现方式的话有三种,其中xml+接口的方式比较常见
纯xml:在映射文件中设置xml节点,在mybatis3之后,映射文件推荐使用namespace,在整个项目中namespace+id必须唯一。通过该statement整体语句在项目中找到唯一的一个SQL语句进行执行,以完成crud的功能。使用SqlSession对象的selectList, selectOne,insert, update, delete即可完成所有功能
xml+接口:映射xml文件中namespace必须是接口的全路径,idi必须是接口中的方法名。所以这种方式,接口中不允许出现重载的方法。该方式使用SqlSession对象的getMapper将接口的类对象作为参数传入,得到接口对象,有了接口对象即可完成所有的crud功能
纯注解:在前两种方式下,都是通过namespace+id找到唯一的 SQL语句进行执行,所以纯注解就是直接在接口方法之上写入SQL语句的注入,以完成所有的crud功能。这种方式在mybatis的配置文件的mapper中国有两种配置方式,使用mapper标签的class属性执行该接口。或者在mappers节点下加入package子标签,动态扫描指定包下的所有类
动态sql
根据用户不同的输入条件,可以动态地执行不同的SQL语句
if,where, case when,foreach, trim
缓存
mybatis中默认是一级缓存开启,执行相同的操作,SQL语句只执行一次,后面的操作直接从缓存中获取,可以提高程序的执行效率
一级缓存是Sqlsession级别,二级缓存是SqlSesionFactory级别,需要对于mybatis的核心文件做额外的配置
日志
mybatis默认是没有日志的,可以通过settting节点中设置logImpl来设置日志,STDOUT_LOGGING好处是不用添加任何第三方依赖而直接使用日志
log4j的配置
添加log4j的依赖
在resources下添加log4j.properties文件
里面设置日志的输出源和日志的级别
日志级别有error,warn,info,debug,级别设置越高,信息会越精简,设置级别越低,内容会更详细,而且会显示比该日志级别更高的日志
输出源有控制台输出ConsoleAppender和文件输出源DailyRollingFileAppender
可以指定日志追踪的具体代码,可以到包级别,接口级别甚至是方法级别
如果有什么补充或者不足小伙伴们可以在下面评论出来