有关 Mybatis 的知识总结【1】

一、传统JDBC的劣势

JDBC 原理
数据库连接过程:
数据库连接过程
insert
select
从以上代码可以看出,传统的JDBC编程存在一定的局限性,具体如下:
(1)代码繁琐
使用JDBC编程时,代码量较大,尤其是当数据表字段较多时,代码显得烦琐、累赘并且使开发人员的工作量增加。
(2)表关系维护复杂
数据表之间存在各种关系,包括一对一、一对多、多对一、多对多、级联等。如果采用JDBC编程的方式维护数据表之间的关系,过程较为复杂并且容易出错。
(3)硬编码
当使用JDBC编程时,SQL语句都是硬编码到Java程序中,如果改变SQL语句,那么需要重新编译Java代码,不利于系统后期的维护。
(4)性能问题
在批量处理数据时,JDBC编程存在效率低下的问题,此时,程序将向数据库发送大批量的同类SQL语句请求,浪费数据库资源,影响运行效率。由于JDBC存在的缺陷,企业中通常使用ORM框架来完成数据库的操作。

二、ORM

ORM的全称是Object-Relation Mapping,即对象-关系映射。ORM是一种规范,它是将简单Java对象(Plain Ordinary Java Object,POJO)和数据库表进行映射,使数据库表中的记录和POJO对象一一对应,如图所示。
ORM框架
下面是一个有关学生类的例子:

StudentPOJO
关联映射

三、ORM框架

1、Hibernate

Hibernate是较为优秀的ORM框架之一,已被选为服务器Jboss的持久层解决方案。Hibernate建立在POJO和数据库表记录的直接映射关系之上,它通过XML映射文件(或注解)提供的规则实现关系映射,提供一种全表映射的模型,程序可以通过POJO直接操作数据库中的数据。
优点:
Hibernate封装性较高,开发人员通过XML映射文件(或注解)定义好映射规则后,Hibernate会根据映射规则自动生成SQL语句并调用JDBC的API执行,这减少了开发人员编写SQL语句的烦琐,大大提升开发效率。
缺点:
由于全表映射的特性,Hibernate也存在一些局限,例如,无法根据不同的条件组装不同的SQL,对多表关联和复杂SQL查询支持较差,不能有效支持存储过程和SQL语句优化等

2、JPA

JPA是Java Persistence API的简称,即Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUPBY、HAVING等通常只有SQL才能够提供的高级查询特性,甚至还能够支持子查询。

3、MyBatis

MyBatis是一种“半自动化”的ORM框架,MyBatis需要手动提供POJO、SQL语句并匹配映射关系,正因为此,它可以更加灵活的生成映射关系。MyBatis充分允许开发人员利用数据库的各项功能,例如存储过程、视图、复杂查询等,具有高度灵活、可优化、易维护等优点。

以下是mybatis的功能框架:
功能框架
API接口层:提供给外部使用的接口API,开发人员通过这些API来操纵数据库。API接口层接收到调用请求时,它会调用数据处理层来完成具体的数据处理。

数据处理层:负责具体的参数映射、SQL解析、SQL执行和执行结果映射处理等。它主要的功能是根据调用的请求完成一次数据库操作。

基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载、缓存处理等,MyBatis将这些共用的功能抽取出来作为最基础的组件,为上层的数据处理层提供支持。

mybatis工作流程:

(1) 、MyBatis读取配置文件和映射文件。其中,配置文件设置了数据源、事务等信息;映射文件设置了SQL执行相关的信息。映射文件要引入到配置文件中才能被执行。
(2) 、MyBatis根据配置信息和映射信息生成SqlSessionFactory对象,SqlSessionFactory对象的重要功能是创建MyBatis的核心类对象SqlSession。
(3) 、SqlSession中封装了操作数据库的所有方法,开发者一般通过调用SqlSession完成数据库操作,但实际上,SqlSession并没有直接操作数据库,它通过更底层的Executor执行器接口操作数据库。Executor接口有两个实现类,简单执行器BaseExecutor和缓存执行器CachingExecutor。简单执行器有SimpleExecutor、ReuseExecutor和BatchExecutor。
(4) 、Executor执行器将要处理的SQL信息封装到一个MappedStatement对象中。在执行SQL语句前,Executor执行器通过MappedStatement对象将输入的Java数据映射到SQL语句,在执行SQL语句后,Executor执行器通过MappedStatement对象将SQL语句的执行结果映射为Java数据,其中,作为输入参数和输出结果的映射类型可以为Java基本数据类型,也可为List类型、Map类型或POJO类型。

四、Mybatis重要的API

1、SqlSessionFactory
SqlSessionFactory的首要功能是创建SqlSession对象,因此,每一个MyBatis应用程序都以SqlSessionFactory为基础。SqlSessionFactory存在于MyBatis应用的整个生命周期,重复创建SqlSessionFactory对象会造成数据库资源的过度消耗,因此,一般使用单例模式创建SqlSessionFactory对象,即每一个数据库对应一个SqlSessionFactory对象。
SqlSessionFactory对象由SqlSessionFactoryBuilder对象创建
SqlSessionFactoryBuilder对象通过它的 build()方法创建SqlSessionFactory对象。
调用SqlSessionFactory对象的openSession()方法创建SqlSession对象

2、SqlSession
SqlSession对象是MyBatis中的核心类对象,提供了执行SQL语句、提交或回滚事务、清理SqlSession级的缓存以及使用映射器等功能的方法。
SqlSession对象的生命周期贯穿数据库处理事务的过程,一定时间内没有使用的SqlSession对象要及时关闭,以免影响系统性能。SqlSession对象是线程不安全的,也不能被共享,因此,开发者应重点关注多线程状态下的SqlSession对象,同时,操作时应注意隔离级别、数据库锁等高级特性。
在这里插入图片描述
在这里插入图片描述

  • 36
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值