作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
什么是Mybatis?
MyBatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态SQL,可以严格控制SQL执行性能,灵活度高。
MyBatis 提供了与数据库交互的API,让程序员可以通过简单的XML或注解来配置和映射原生信息,将接口和Java的实体类映射到数据库中的记录,免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
Mybaits的优缺点?
优点
MyBatis 的核心优势在于其简单性和灵活性。其优点如下:
- 精细的SQL控制:MyBatis 允许我们手写SQL,因此可以进行精细的查询优化,充分利用数据库本身的特性和优化。
- 灵活性高:支持动态SQL,便于构建复杂查询。我们可以根据不同的条件动态地改变SQL语句,而无需改变Java代码结构。
- 易于理解和学习:MyBatis 的配置和使用相对简单直观,对于熟悉SQL的初学者来说是非常容易上手的。
- 消耗资源小:没有完整ORM框架那样的数据持久层自动化管理的开销,MyBatis 的资源消耗相对较小。
- 良好的集成性:可以很容易地与其他框架(如Spring)集成,同时社区和第三方工具支持良好。
缺点
- SQL管理:随着项目的扩展,SQL语句可能会变得难以管理,尤其是当这些SQL语句分散在大量的XML文件中时。
- 数据库移植性:因为需要手写SQL,所以在不同的数据库之间迁移可能需要重新编写特定的SQL语句,降低了代码的移植性。
- 部分自动化缺失:与完整的ORM工具相比,缺乏自动的CRUD操作、对象关系维护。
- 复杂性管理:对于有很多关联关系和继承映射的复杂领域模型,MyBatis的处理不如完整的ORM框架方便。
- 二次开发需求:为了满足特定需求,如分页、性能优化等,需要进行二次开发和额外配置。
- 维护性挑战:由于SQL和Java代码的分离,大型项目中的跨团队开发和维护可能会带来沟通和协作的挑战。
- 缓存支持有限:MyBatis 自身的缓存机制比较简单,对于复杂的缓存需求,开发者需要自行实现或集成第三方缓存解决方案。
所以,MyBatis 的适用场景通常是那些需要与数据库交互且对SQL优化要求较高的项目,而对于那些需要快速开发和避免直接处理SQL的场景,可能更倾向于使用完整的ORM框架。
Hibernate 和 MyBatis 有什么区别?
基本哲学:
- Hibernate 是一个全功能的对象关系映射(ORM)框架,它封装了很多数据库操作的细节,提供了一个更高层次的对象数据管理接口。
- MyBatis 是一个半ORM框架,它允许你直接编写SQL,同时提供了一些ORM特性,比如对象映射。
SQL处理:
- Hibernate 自动生成SQL,用户几乎不需要编写任何SQL语句,这样可以减少开发时间,但有时可能牺牲了一些性能。
- MyBatis 需要用户自己编写SQL语句,这为性能优化提供了可能,但增加了开发工作量。
对象映射:
- Hibernate 通过HQL(Hibernate Query Language)或Criteria API来执行数据库操作,并将结果映射到Java对象,通常不需要用户了解底层的SQL。
- MyBatis 通过XML或注解方式将指定的SQL语句映射到Java方法和对象上。
缓存机制:
- Hibernate 提供了更为强大的内置一级和二级缓存机制,可以显著提高应用性能。
- MyBatis 提供一级缓存和二级缓存的支持,但相比Hibernate,它的缓存机制较为简单。
数据操作层次:
- Hibernate 作为一个完整的ORM解决方案,操作的是对象和对象的关系,它隐藏了很多JDBC和数据库相关的细节。
- MyBatis 更接近于JDBC,它操作的更多是数据而不是对象,因此开发者需要有更多的数据库和SQL知识。
#{} 和${}的区别是什么?
#{}
是占位符,预编译处理;${}
是拼接符,字符串替换,没有预编译处理。- MyBatis 在处理
#{}
时,会根据Java类型推断出JDBC类型,并根据类型对数据进行处理,而${}
传入的数据会被当作字符串拼接到SQL语句中。 #{}
会被MyBatis解析为一个占位符参数(?
),然后调用PreparedStatement的set方法来赋值,这意味着MyBatis会自动为SQL参数提供引号,防止SQL注入,而${}
会将参数直接嵌入到SQL语句中,这可能会导致SQL注入的风险,因为参数的内容会直接解释为SQL语句的一部分。
总结:尽管 ${}
在某些情况下有用,但是必须非常小心地使用,需要程序做严格的控制与校验,以避免SQL注入攻击。在大多数情况下,推荐使用 #{}
来传递参数,因为它更安全且易于维护。
模糊查询like语句该怎么写?
一共有四种写法:
一、使用**
#{}
**传递完整的模糊匹配字符