【八股】MyBatis 基础知识点

一、JDBC 的工作原理是什么 ?

首先JDBC是MyBatis的底层基础,所以在学习MyBatis之前了解JDBC是必要的。

JDBC是Java语言访问数据库的标准API,以统一的方式与各种关系数据库交互(连接、查询、更新等)操作;

JDBC的工作原理

1、加载数据库驱动:每个数据库都提供自己的JDBC驱动,这些驱动必须在应用程序中被加载,用于实现Java程序与具体的数据库通信;

2、建立连接:加载数据库驱动成功后,通过DriverManager.getConnection(url, username, password)方法建立连接,得到一个Connection对象;

3、创建和执行SQL语句:使用JDBC的Statement对象或者PreparedStatement对象创建SQL语句,然后将其发送到数据库中执行;

  • Statement用于静态 SQL 语句(即不带参数的 SQL 语句);

  • PreparedStatement用于动态 SQL 语句,即可带有参数,可以预编译 SQL 语句,提高执行效率,还能避免 SQL 注入问题。

4、处理结果集:使用JDBC的ResultSet对象来处理数据库返回的结果集,ResultSet允许逐行迭代结果集,并从每一行中提取数据。

5、关闭连接:调用Connection对象的close()方法关闭数据库连接以释放资源;

二、MyBatis 工作原理?

1、读取并解析MyBatis的全局配置文件

在解析过程中使用XMLConfigBuilder类来读取这个文件中的信息,并构建一个Configration对象,该对象中包含了MyBatis的核心配置信息,数据连接池、事务管理器、映射关系等

其中 Map<String, MappedStatement> mappedStatements 非常关键,mapper.xml SQL映射文件中的 namespace + id 是这个 map 的 key,通过这个 map 可以将 mapper.xml SQL映射文件和 Mapper 接口关联起来

2、加载mapper.xml SQL映射文件

该文件中配置了操作数据库的SQL语句,每个文件对应数据库中的一张表。

3、构造会话工厂

通过 MyBatis 的环境等配置信息构建会话工厂 SQLSessionFactory,这个工厂的目的就是创建 SQLSession 对象。

4、通过工厂创建会话对象

由会话工厂创建 SQLSession 接口对象,该接口中包含了执行 SQL 语句的所有方法。

5、Executor执行器

MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SQLSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

6、MapperStatement对象

在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息(输入参数 or 输出结果)的封装,用于存储要映射的 SQL 语句的 id、参数等信息。映射信息类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。

三、MyBatis相比于JDBC的优点

MyBatis在JDBC的基础上再进行抽象封装,提供更加方便的操作过程,并提供更好的可维护性和可读性;

抽象程度、SQL编写、参数绑定、结果集处理

四、MyBatis 相对于 MyBatis-Plus 的优缺点

MyBatis-Plus的优点:

  • 减少了XML配置文件的编写:MyBatis是通过XML配置SQL语句的映射关系,对于复杂大型的项目,我们的配置文件会变得冗长;MyBatis-Plus则是通过使用注解和约定来减少了XML文件的配置,提高了效率。
  • 提供了便捷的API开发:
  • 丰富的扩展功能:提供丰富的插件和扩展功能,简化开发。

MyBatis-Plus的缺点就是SQL语句和业务代码耦合,导致代码的可读性和可维护性降低,并且出现问题不容易调试排错。

五、MyBatis都有哪些Executor执行器

首先Executor是顶层的一个接口,它的实现类有BaseExecutor和CachingExecutor两个;

1、BaseExecutor实现了Executor的全部方法:缓存、事务、连接,另外还提供了一些模版方法,等待子类去实现;

  • BaseExecutor类有三个直接子类:SimpleExecutor、ResueExecutor、BatchExecutor

2、CachingExecutor主要和MyBatix的二级缓存有关;

六、MyBatis的SqlSession的工作原理

首先,SqlSession会话对象是由会话工厂创建的,SqlSession是一个接口,其中包含了执行SQL语句的所有方方法;

SqlSession中的四大组件:Executor执行器、StatementHandler、ParmmeterHandler、ResultHandler

Executor执行器的作用是来调度其它三大组件执行SQL语句;

StatementHandler处理数据库会话,核心工作的预编译SQL,填充SQL参数;

ParmmentHandler用来向预编译SQL语句中传递SQL参数;

ResultHandler封装处理结果集并返回给调用者;

七、Mapper 接口的工作原理是什么?为什么 Mapper 接口不需要实现类?

Mapper接口的工作原理是JDK动态代理,MyBatis执行时会为Mapper接口生成代理对象,代理对象会拦截接口中的方法,然后去执行MappedStatement中相应的SQL语句,然后将结果返回;(MappedStatement由Mapper接口全限名+方法名拼接字符串作为 key 值唯一确定的,其中包含相应的SQL语句)。

八、Mapper 接口可以方法重载吗 ?

答案是肯定的;Mybatis 的 Mapper 接口可以有多个重载方法,但是多个方法对应的 Map<String, MappedStatement> mappedStatements 的 key(也就是namespace + id)必须只有一个,否则会编译报错

九、Mapper 中传递多个参数的方式有几种 ?

这个问题其实就是说Mapper接口中方法中的参数怎么传递到Mapper.xml文件中与SQL语句中的占位符怎么对应起来。

1、顺序传参:#{}里面的数字代表传入参数的顺序;这种方式已经不推荐使用了,因为如果参数太多,一旦顺序出现问题就会报错,但是在初学的时候还是很好的。

2、@Param注解传参:#{}里面的名称对应的是注解 @Param 括号里面修饰的名称;这种方式还是比较推荐的。

3、Map传参:#{}里面的名称对应的是 Map 里面的 key 名称。

4、JavaBean传参:#{} 里面的名称对应的是 User 类里面的成员属性。

十、MyBatis 分页有几种实现方式 ?

逻辑分页and物理分页

1、逻辑分页:一次性从数据库取出我们需要的所有数据放在内存中,然后分批次从内存中取,MyBatis 逻辑分页只有一种方式:MyBatis的RowBounds对象。

2、物理分页:分批次从数据库中取我们需要的数据,MyBatis 物理分页包括三种方式:

  • SQL 语句 limit 分页;
  • 通过 MyBatis 拦截器Interceptor)自定义分页逻辑;(在拦截器中重写SQL)。
  • 使用 MyBatis 分页插件Plugin,其实底层也是通过 Inteceptor 来实现的),比如分页插件 PageHelper;

十一、MyBatis 插件的运行原理,如何编写一个插件?

MyBatis 允许在映射语句的执行过程中拦截对某些点的调用。默认情况下,MyBatis 允许插件拦截以下方法调用:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

实现一个插件只需要实现拦截器 Interceptor 接口重写 intercept 方法,然后指定要拦截的方法签名就行了。MyBatis 使用【JDK 动态代理】,为需要拦截的接口生成代理对象以实现接口方法拦截功能,所以插件的本质上其实就是【动态代理 + 反射】的应用

十二、MyBatis 是否支持延迟加载?实现原理是什么?

MyBatis 仅支持关联表( association 关联对象和 collection 关联集合对象)的延迟加载

延迟加载:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据,延迟加载也称懒加载。

在 MyBatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false

  • 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快
  • 坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降

延迟加载的原理:延迟加载中查询出来的是一个代理对象,不是真正的结果对象。举个例子:User 对象中包含一个 Order 集合,也就是 collection 一对多查询,对 Order 启用懒加载;

在执行完 SQLSession.selectOne 语句之后,返回的是结果对象的代理对象,此时由于 orderList 开启了懒加载,所以 user.orderList 其实是为 null 的;

当 真正调用 代理对象的延迟加载属性(orderList)的 get 方法时(getOrderList),进入代理对象的拦截器方法,那么就会单独发送事先保存好的查询语句,将 orderList 查询上来,然后通过反射将 orderList 设置进去,然后完成 getOrderList 的调用

所以简单来说,MyBatis 的延迟加载其实就是:用动态代理(默认是 Javaassit,可选 CGLIB)拦截开启了延迟加载属性的 get 方法,当真正执行 get 方法的时候,才进行查询然后通过【反射】将数据设置进去

十三、MyBatis 如何防止 SQL 注入(# 和 $ 的区别是什么)

# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

$ 将传入的数据直接显示生成在 SQL 中。

# 方式能够很大程度防止SQL注入,$ 方式无法防止 SQL 注入。

$ 方式一般用于传入数据库对象,例如传入表名、列名。

一般能用 # 的就别用 $ ,若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面试八股文是指在Java面试中常被问到的一些基础知识点和常见问题。而MyBatis是一种持久层框架,用于简化Java应用程序与数据库之间的交互。下面是关于Java面试八股文和MyBatis的介绍: Java面试八股文包括但不限于以下几个方面的内容: 1. Java基础知识:包括Java的特性、面向对象的概念、封装、继承、多态、异常处理、集合框架等。 2. 数据库相关:包括SQL语句的基本语法、数据库事务、索引、连接池等。 3. 多线程:包括线程的生命周期、线程同步与互斥、线程池、线程安全等。 4. JVM相关:包括JVM的内存模型、垃圾回收机制、类加载机制等。 5. 设计模式:包括单例模式、工厂模式、代理模式、观察者模式等常见的设计模式。 关于MyBatis,它是一种轻量级的持久层框架,主要用于将Java对象与数据库之间进行映射。MyBatis提供了一种将SQL语句与Java代码解耦的方式,通过XML或注解的方式来配置SQL语句,使得开发人员可以更加灵活地操作数据库MyBatis的核心特点包括: 1. 简化数据库操作:MyBatis提供了简洁的API,可以方便地进行增删改查操作。 2. 动态SQL:MyBatis支持动态SQL,可以根据不同的条件生成不同的SQL语句,提高了SQL的灵活性。 3. 缓存机制:MyBatis提供了一级缓存和二级缓存的支持,可以提高查询性能。 4. 映射关系配置:MyBatis通过XML或注解的方式来配置Java对象与数据库表之间的映射关系,使得开发人员可以更加灵活地进行数据库操作。 5. 插件机制:MyBatis提供了插件机制,可以对SQL语句进行拦截和修改,扩展了MyBatis的功能。 以上是关于Java面试八股文和MyBatis的简要介绍,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值