开发3年入职阿里P6,全靠这份“MyBatis学习笔记了”

本文深入探讨MyBatis框架,涵盖其历史、特点及优势,并通过实例演示如何利用XML配置SQL语句,实现数据库访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

相信大部分程序员工作中都有接触过MyBatis,那么它到底重不重要呢?答案是肯定的呀!

互联网公司基本都是用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逻辑,可对其进行优化,以提高效率。

二、Mybatis的优点

基于sql语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,sql写在xml 里,解除sql与程序代码的耦合,便于统一管理;提供xml标签,支持编写动态sql语句,并可用。与jdbc相比,减少了50%以上的代码量,消除 jdbc大量冗余的代码,不需要手动开关连接;很好的与各种数据库兼容(因为 mybatis 使用jdbc来连接数据库,所以只要jdbc支持的数据库Mybatis都支持)。能够与spring很好的集成;提供映射标签,支持对象与数据库的orm字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

 

三、为什么要使⽤ MyBatis

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<Article> 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源码笔记

这份MyBatis源码总共分为一下五个篇26个章节,共计667页源码笔记,由于内容过多,小编没办法为大家进行详尽的展示,只能为大家展示部分内容

  1. 基础功能包源码阅读
  2. 配置解析包源码阅读
  3. 核心操作包源码阅读
  4. 总结与展望

第1篇:背景介绍

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

第2篇:基础功能包源码阅读

第5章exceptions包

 

第6章reflection包

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

第7章annotations包与lang包

第8章type包

 

第9章io包

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

第10章logging包

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

第11章parsing包

阿里首发667页MyBatis源码手册,看后发现差距不止一点

 

第3篇:配置解析包源码阅读

第12章配置解析概述

第13章binding包

阿里首发667页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知识点思维导图都可以分享给小伙伴们

 

我这边还整理了一份:关于Java的系统化资料,包括Java核心知识点、面试专题和20年最新的互联网真题、电子书等都有,有需要的朋友可以私信【666】免费领取!
资料获取方式:关注+转发后扫描小编的二维码即可获取。
最后,祝你们面试都能过,年薪百万!嘻嘻!

### JavaArrayListLinkedListVector的区别及适用场景 #### 1. 数据结构 `ArrayList` 是基于动态数组实现的数据结构,它允许随机访问元素。由于底层是一个连续的内存块,因此 `ArrayList` 提供了快速的随机访问能力[^1]。 `LinkedList` 则是一种双向链表结构,每个节点存储指向前后两个相邻节点的指针。这种设计使得在列表中间插入或删除元素非常高效,但由于需要遍历找到目标位置,所以它的随机访问速度较慢[^4]。 `Vector` 同样是基于动态数组构建的集合类,在功能上类似于 `ArrayList`,但它提供了额外的线程安全性支持[^2]。 #### 2. 线程安全 `ArrayList` 并不提供内置的同步机制,这意味着它是非线程安全的。如果多个线程同时操作同一个实例,则可能引发数据一致性问题[^3]。 相比之下,`Vector` 中的方法默认被声明为 synchronized ,从而保证了多线程环境下的安全性;然而这也带来了性能开销上的代价——尤其是在高并发读写的情况下会显得尤为明显。 对于 `LinkedList` 而言,同样缺乏天然的线程保护措施,故而在共享资源环境中使用时需自行管理锁或其他形式的协调手段来保障正确性。 #### 3. 性能比较 - **增删效率**: 链表类型的容器 (`LinkedList`) 在频繁执行插入/移除动作的应用场合下表现更优,因为它们只需调整局部几个结点间的关系即可完成相应变更而无需移动大量其他项的位置。 - **查找效率**: 数组风格的集合(`ArrayList`, `Vector`) 支持通过索引直接定位特定成员,时间复杂度接近 O(1),远胜过依赖逐一遍历方式工作的 `LinkedList` (O(n)). - **扩容处理**: 当内部容量不足以容纳新增加的内容时,三者都会自动增长其尺寸。不过具体做法有所差异:`ArrayList` 默认将现有长度翻倍; whereas both 'Vector' doubles its size as well but unlike former which does so lazily upon necessity ,the latter eagerly preallocates extra space immediately after every expansion operation. #### 4. 内存占用情况分析 鉴于上述提到的不同特性,“懒加载”的特点让 `ArrayList` 往往能够维持较小的实际分配空间直到真正需要用到更多储存为止;此同时尽管初始设定相同大小限制条件下创建出来的对象里头所含有的实际物理地址数量可能会少于那些总是提前预留好充足余量准备迎接未来扩张需求到来之前就已经存在的实体们比如某些版本中的 vector 实现方案那样做的话自然就会消耗更多的系统级硬件层面可供支配使用的 RAM 容积单位咯~ #### 5. 迭代器行为特征描述说明文档链接如下所示: 三种主要类型均具备各自专属版本类型的 Enumeration 或 Iterator 接口实现体用于枚举其中包含的所有条目记录项目等等之类的东西啦!值得注意的一点就是说啊~那个叫做 fail-fast 特性的东东只存在于后者两者之间哦也就是 arraylistlinkedlists 上面才有哟~一旦检测到外部修改未经过当前正在运行着的那个特定迭代过程本身同意认可授权许可范围之外擅自改动原始资料库状态改变情形发生之时便会立刻抛出异常信号告知调用方存在非法干扰破坏正常逻辑流程的风险隐患警告提示信息内容哈~ ```java // 示例代码展示如何初始化这几种不同的 List 类型变量并简单测试一下基本方法调用效果演示用途而已~ import java.util.*; public class Main { public static void main(String[] args){ // 创建 ArrayList 对象 List<String> arrayList = new ArrayList<>(); // 创建 LinkedList 对象 List<String> linkedList = new LinkedList<>(); // 创建 Vector 对象 Vector<String> vector = new Vector<>(); System.out.println("Adding elements..."); addElements(arrayList); addElements(linkedList); addElements(vector); System.out.println("\nIterating through lists..."); iterateAndPrint(arrayList.iterator(), "ArrayList"); iterateAndPrint(((LinkedList<String>)linkedList).descendingIterator(),"Descending LinkedList"); enumerateAndPrint(vector.elements()); } private static void addElements(List<String> list){ for(int i=0;i<5;i++) list.add("Element "+i); } private static void iterateAndPrint(java.util.Iterator<?> it,String name){ while(it.hasNext()) System.out.print(name+" -> "+it.next()+" "); System.out.println(); } private static void enumerateAndPrint(Enumeration<?> enm){ while(enm.hasMoreElements()) System.out.print("Vector -> "+enm.nextElement()+" "); System.out.println(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值