MyBatis分享
MyBatis简介
- MyBatis是Java开发中非常流行的ORM(对象关系映射)框架,封装了JDBC并解决了Java对象输入参数和结果集的映射,同时又能够让用户方便地手写SQL语句.
ORM简介
- ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。
JDBC简介
- 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
JDBC操作数据库的步骤
- 注册数据库驱动类 ,明确指定数据库 URL 地址、数据库用户名、密码等连接信息
- 通过 DriverManager 打开数据库连接
- 通过数据库连接创建 Statement 对象
- 通过 Statement 对象执行SQL 语句,得到 ResultSet 对象
- 通过 ResultSet 读取数据,并将数据转换成 JavaBean 对象
- 关闭 ResultSet Statement 对象以及数据库连接,释放相关资源。
Hibernate的缺点
- 全表映射,在进行更新时需要发送所有字段
- 无法根据不同条件组装不同的SQL
- 对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回的数据需要自己组装为POJO
- 不能有效支持存储过程
- HQL性能较差,Hibernate无法优化SQL
MyBatis基础功能介绍
- 简化开发步骤
- 在JDBC操作数据库时,除了数据转化出来的JavaBean不同其余步骤均为重复性操作,而MyBatis和其他持久化框架一样可以帮我们屏蔽这些重复的底层原生JDBC代码,从而降低我们的开发周期
- 通过MyBatis的映射配置文件或相应的注解,可以讲ResultSet映射为Java对象,且映射规则可以嵌套其他映射规则一级子查询,从而实现复杂的映射逻辑,也可以实现一对一、一对多、多对多、及双向映射
- 可控性高
- 使用MyBatis时我们可以直接在映射配置文件中编写待执行的原生SQL语句,我们可以通过选择合适的索引来提升系统性能
- 也可以自定义需要查询的某一部分字段而不是全部字段
- 支持动态SQL可以确保自动的在需要的地方添加 “where ”、“ and ”、“ in ”等 SQL 语句的关键字以及空格、 逗号、等号等分隔符 从而节约大量的开发时间
MyBatis的结果集映射
ResultSetHandler
-
MyBatis 会将结果集按照映射配置文件中定义的映射规则,
例如<resultMap>节点、 resultType 属性等,映射成相应的结果对象。这种映射机制是 MyBatis的核心功能之一,可以避免重复的 JDBC 代码。 -
StatementHandler 接口在执行完指定的 select 语句之后, 会将查询得到的结果集交给ResultSetHandler 完成映射处理。 ResultSetHandler 负责映射 select 语句查询得到的结果集。
-
ResultSetHandler是一 个接口,其定义如下:
public interface ResultSetHandler { //处理结采集,生成相应的结果对象集合 <E> List<E> handleResultSets(Statement stmt) throws SQLException ; //处理结采集,返回相应的游标对象 <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException; //处理存储过程的输出参数 void handleOutputParameters(CallableStatement cs) throws SQLException ; }
-
DefaultResultSetHandler 是 MyBatis 提供的 ResultSetHandler 接口的唯一实现 用来关联配置文件处理结果集ResultHandler对象以及处理结果集时的对象工厂反射工厂等
-
handleResultSets ()方法 是通过select语句查询数据库得到的结果集由 DefaultResultSetHandler handleResultSets ()方法进行处理,
- 首先将查询到的结果对象存入集合得到一个 List
- 获取第一个ResultSet对象,再获取由标签解析后的多个resultMap对象
- 如果结果集不为空,那么遍历resultMaps,找到与结果集相同的resultMap
- 根据resultMap中定义的映射规则对ResultSet(select从数据库查出来的数据)进行映射,并将映射的结果对象添加到一个新的multpleResults集合中进行保存
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcD7XAe2-1597217111900)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1577345391008.png)]