1.MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CollableStatement)配置起来,并通过Java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成Java对象并返回。
2.使用jdbc编程问题总结
jdbc 编程步骤:
- 加载数据库驱动
- 创建并获取数据库链接
- 创建 jdbc statement 对象
- 设置 sql 语句
- 设置 sql 语句中的参数(使用 preparedStatement)
- 通过 statement 执行 sql 并获取结果
- 对 sql 执行结果进行解析处理
- 释放资源(resultSet、preparedstatement、connection)
出现的问题:
1、 数据库连接参数硬编码到 Java 代码中,如果数据库环境需要改变,需要重新编译,不好!
a) 解决:把数据库连接参数写到外部配置文件,通过配置文件加载参数信息
2、 SQL 语句硬编码到 Java 代码中,业务变更、SQL 优化都需要修改 SQL 语句,又需要重新编译,不好!
a) 解决:把 SQL 放到外部配置文件,通过加载配置文件,解析 SQL 语句
3、 SQL 参数问题因为把 SQL 放到外部配置中,用代码加载解析,那么就引发以下新问题:。
a) 需要自动判断参数类型
b) 需要自动判断参数位置对应关系
c) 解决方案:如何自动判断参数类型和位置呢,待定?
4、 遍历结果集非常麻烦,问题:
a) 需要自己判断结果字段类型
b) 需要自己明确结果字段的名称
c) 需要手动封装结果字段到 JavaBean 中
d) 如果有集合还得自己封装对象到集合中
e) 解决:希望可以字段把结果集封装到 JavaBean,如果有多行,可以字段封装到集合
5、 频繁打开和创建数据库连接,比较浪费资源,效率低
a) 解决:采用数据库连接池
上面的这些问题,我们自己实现起来比较繁琐,现有的持久层框架中,Hibernate
也无法解决所有问题,而且 Hibernate 的学习成本比较高,在面对复杂查询时,
查询效率略低。
我们需要新的技术来解决这些问题:Mybatis
3Mybatis特点:
- 支持自定义 SQL、存储过程、及高级映射
- 实现自动对 SQL 的参数设置
- 实现自动对结果集进行解析和封装
- 通过 XML 或者注解进行配置和映射
- 实现 Java 对象与数据库表的映射转换
可以发现,MyBatis 是对 JDBC 进行了简单的封装,帮助用户进行 SQL 参数的自动
化映射,以及结果集与 Java 对象的映射。与 Hibernate 相比,更加配置简单、灵
活、执行效率高。但是正因为此,所以没有实现完全自动化,需要手写 SQL,这
是优点也是缺点。
因此,对性能要求较高的电商类项目,一般会使用 MyBatis,而对与业务逻辑复
杂,不太在乎执行效率的传统行业,一般会使用 Hibernate
4.Mybatis的功能架构:三层
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
- 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
5.Mybatis优缺点
优点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
- 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
缺点:
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
- 二级缓存机制不佳