一、什么是MyBatis或者理解
MyBatis是一款轻量级的半自动化对象关系映射(ORM)框架,它主要用于Java应用程序中的数据持久层,它提供了一种高效的方式来管理数据库操作,避免了手动编写大量重复的JDBC代码
简单点来讲,就是内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接等繁杂的过程
- 概念与作用:MyBatis主要用于Java应用程序中的数据持久层,它提供了一种高效的方式来管理数据库操作,避免了手动编写大量重复的JDBC代码。
- 自定义SQL:MyBatis允许开发者自行编写SQL语句,这样可以根据具体需求优化查询性能,提供灵活性和控制性。
- 支持存储过程:MyBatis不仅支持标准的SQL语句,还支持调用数据库的存储过程,使得复杂的数据库操作更加便捷。
- 高级映射功能:MyBatis能够将数据库中的记录映射到Java的POJOs(Plain Ordinary Java Objects,普通Java对象),同时也支持高级的映射策略,如关联映射、结果集的自动封装等。
- 配置方式:MyBatis的配置可以通过XML文件或注解来完成,这使得框架的使用更加灵活,可以根据项目需求选择最合适的配置方式。
- 优缺点:MyBatis的优点在于其轻量级、灵活且易于控制SQL细节,但相应的,它也需要开发者具备一定的SQL编写能力。由于是半自动化的ORM框架,相比于全自动ORM框架,MyBatis可能需要更多的手动配置和编码工作。
- 适用场合:MyBatis适用于那些需要灵活处理数据库操作、追求高性能以及愿意手写SQL语句的场合。
- 与其他ORM框架比较:相较于其他ORM框架,如Hibernate,MyBatis提供了更多的灵活性和对SQL的控制,但相对地,它也需要更多的手动干预。选择使用哪个框架取决于项目的具体需求和团队的技术偏好
二、Mybaits的优点
1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML里,解除 sql与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态SQL语句,并可重用
2、与 JDBC 相比,减少了 50%以上的代码量,消除了JDBC大量冗余的代码,不 需要手动开关连接
3、很好的与各种数据库兼容(因为MyBatis使用 JDBC来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)
4、能够与 Spring 很好的集成
5、提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射 标签,支持对象关系组件维护
三、MyBatis框架的缺点
1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求
2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
四、MyBatis框架适用场合
1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO层解决方案
2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是 不错的选择
五、MyBatis是如何进行分页的
数据进行分页是最基础的功能,一般可以把分页分成两类:
1、 逻辑分页,先查询出所有的数据缓存到内存,再根据业务相关需求,从内存数据中 筛选出合适的数据进行分页。
2、 物理分页 ,直接利用数据库支持的分页语法来实现,比如Mysql里面提供了分页关键词Limit
Mybatis 提供了四种分页方式:
1、在MybatisMapper配置文件里面直接写分页SQL,这种方式比较灵活,实现也简单。
2、 RowBounds实现逻辑分页,也就是一次性加载所有符合查询条件的目标数据,根 据分页参数值在内存中实现分页。 当然,在数据量比较大的情况下,JDBC驱动本身会做一些优化,也就是不会把所有结 果存储在ResultSet里面, 而是只加载一部分数据,再根据需求去数据库里面加载。 这种方式不适合数据量较大的场景,而且有可能会频繁访问数据库造成比较大的压力。
3、Interceptor拦截器实现,通过拦截需要分页的select语句,然后在这个sql语句 里面动态拼接分页关键字,从而实现分页查询。 (如图)Interceptor是Mybatis提供的一种针对不同生命周期的拦截器,比如: 拦截执行器方法 、拦截参数的处理、拦截结果集的处理 、拦截SQL语法构建的处理 我们可以拦截不同阶段的处理,来实现Mybatis相关功能的扩展。 这种方式的好处,就是可以提供统一的处理机制,不需要我们再单独去维护分页相关的 功能。
4、 插件(PageHelper)及(MyBaits-Plus、tkmybatis)框架实现 这些插件本质上也是使用Mybatis的拦截器来实现的。 只是他们帮我们实现了扩展和封装,节省了分页扩展封装的工作量,在实际开发中,只 需要拿来即用即可
用简单的话来说就是
有三种方式来实现分页:
第一种,直接在Select语句上增加数据库提供的分页关键字,然后在应用程序里面传递当前页,以及每页展示条数即可。
第二种,使用Mybatis提供的RowBounds对象,实现内存级别分页。
第三种,基于Mybatis里面的Interceptor拦截器,在select语句执行之前动态拼接分页关键字。
六、#{}和${}的区别是什么
1、#{}是预编译处理,${}是字符串替换。
2、Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
3、Mybatis 在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止 SQL注入,提高系统安全性