相信大部分程序员工作中都有接触过MyBatis,那么它到底重不重要呢?答案是肯定的呀!
互联网公司基本都是用Mybatis做为持久层框架的,所以,Mybatis是一定要学的!!!
不管是在工作中还是面试中都会牵扯到Mybatis。
但是,你对它了解吗?了解多少呢?有多了解?工作遇到能解决吗?面试问到能回答上来吗?
废话不多少,让我们一起来看看Mybatis的神秘之处吧~
MyBatis的前身是 iBatis,iBatis是Apache软件基金会下的一个开源项目。2010年该项目从Apache基金会迁出,并改名为MyBatis。同期,iBatis停止维护。MyBatis是一种半自动化的Java持久层框架(persistenceframework),其通过注解或XML的方式将对象和SQL关联起来。之所以说它是半自动的,是因为和Hibernate等一些可自动生成SQL的ORM(ObjectRelationalMapping)框架相比,使用MyBatis需要用户自行维护SQL。维护SQL的工作比较繁琐,但也有好处。比如我们可控制SQL逻辑,可对其进行优化,以提高效率。
基于sql语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,sql写在xml 里,解除sql与程序代码的耦合,便于统一管理;提供xml标签,支持编写动态sql语句,并可用。与jdbc相比,减少了50%以上的代码量,消除 jdbc大量冗余的代码,不需要手动开关连接;很好的与各种数据库兼容(因为 mybatis 使用jdbc来连接数据库,所以只要jdbc支持的数据库Mybatis都支持)。能够与spring很好的集成;提供映射标签,支持对象与数据库的orm字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
1.1我们在使用 Java 程序访问数据库时,有多种可选方案。
比如我们可通过编写最原始的JDBC 代码访问数据库,或是通过Spring提供的JdbcTemplate访问数据库。除此之外,我们还可以选择Hibernate,亦或是本书的主角MyBatis 等。在有多个可选项的情况下,我们为什么选择MyBatis呢?要回答这个问题,我们需要将MyBatis与这几种框架对比一下,高下立判。当然,技术之间一般没有高下之分。从应用场景的角度来说,符合应用场景需求的技术才是合适的选择。接下来我们通过写代码的方式,来对比这几种数据库访问技术的优缺点,并在最后说明MyBatis的适用场景。这里先把本节所用到的一些公共类和配置贴出来,后面但凡用到这些类和配置的地方,大家可以到这里进行查看。如下:
- public class Article {
- private Integer id;
- private String title;
- private String author;
- private String content;
- private Date createTime;
- // 省略 gettertter 和 toString
- }
数据库相关配置放在了jdbc.properties 文件中,详细内容如下:
- jdbc.driver=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/myblog?useUnicode=true ……
- jdbc.username=root
- jdbc.password=****
表记录如下:
1.2.使⽤MyBatis访问数据库
前面说过,MyBatis是一种半自动化的Java持久层框架,需要用户自行维护 SQL。这里,我们把SQL放在 XML 中,文件名称为ArticleMapper.xml。如下:
- <mapper namespace="xyz.coolblog.chapter1.dao.ArticleDao">
- <select id="findByAuthorAndCreateTime" resultType="Article">
- SELECT
- `id`, `title`, `author`, `content`, `create_time`
- FROM
- `article`
- WHERE
- `author` = #{author} AND `create_time` > #{createTime}
- <lect>
- </mapper>
上面的SQL用于从article表中查询出某个作者从某个时候到现在所写的文章记录。在MyBatis中 ,SQL映射文件需要与数据访问接口对应起来,比如上面的配置对应
xyz.coolblog.dao.ArticleDao接口,这个接口的定义如下:
- public interface ArticleDao {
- List
findByAuthorAndCreateTime(@Param("author") String author, - @Param("createTime") String createTime);
- }
要想让MyBatis跑起来,还需要进行一些配置。比如配置数据源、配置SQL映射文件的位置信息等。本节所使用到的配置如下:
- <configuration>
- <properties resource="jdbc.properties"/>
- <typeAliases>
- <typeAlias alias="Article"
- type="xyz.coolblog.chapter1.model.ArticleDO"/>
- <typeAlias alias="Author" type="xyz.coolblog.model.AuthorDO"/>
- <peAliases>
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED"> <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="chapter1/mapper/ArticleMapper.xml"/>
- </mappers>
- </configuration>
下面这个图是Mybatis的一个思维导图知识点总结,大家需要可以自取。
一些常见Mybatis面试题都整理成了PDF文档(含答案)
1.# {}和${}的区别?
2.Mybatis都有哪些Executor执行器?它们之间的区别是什么?
3.Mybatis中如何指定使用哪一种Executor执行器?
4.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
5.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
6.模糊查询like语句该怎么写?
7.分页方式?
8.pageHelper原理?
9.模糊查询like语句该怎么写?
10.通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
11.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
12.Mybatis 中一级缓存与二级缓存的区别?
13.MyBatis中所有标签?
14.简述Mybatis的插件运行原理,以及如何编写一个插件。
15.如何执行批量插入?
16.如何获取自动生成的(主)键值?
17.在mapper中如何传递多个参数?
18.缓存类介绍
19.植⼊插件逻辑
20.实现⼀个分页插件
.........
Mybatis面试知识点脑图展示
Mybatis面试知识点脑图展示
以上提到的面试题解析Mybatis文档,以及Mybatis知识点思维导图都可以分享给小伙伴们