Java web——Mybatis

一、Mybatis入门

  • Mybatis是一个持久层框架,用于数据的持久化
  • 主要表现为将SQL与POJO进行一个映射,将SQL从代码中解耦

1.MyBatis特点

  • Mybatis通过参数映射方式,可以将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参数(JDBC)

  • Mybatis通过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索(JDBC)

  • Mybatis可以通过Xml配置文件对数据库连接进行管理

2.功能架构:我们把Mybatis的功能架构分为三层

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理

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

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

47d34e6f12fd48b5bd73c29cc81dea75.png

  • 框架结构:
    • 加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中

    • SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数

    • SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果

    • 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回

3.MyBatis的主要成员

  • Configuration: MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中
  • SqlSessionaFactoryBuilder :该类主要用于创建 SqlSessionFactory, 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例 的 最佳作用域 是 方法作用域(也就是局部方法变量)
  • SqlSessionFactory :该类的作用了创建 SqlSession, 从名字上我们也能看出, 该类使用了工厂模式, 每次应用程序访问数据库, 我们就要通过 SqlSessionFactory 创建 SqlSession, 所以 SqlSessionFactory 和整个 Mybatis 的生命周期是相同的这也告诉我们不能创建多个同一个数据的 SqlSessionFactory, 如果创建多个, 会消耗尽数据库的连接资源, 导致服务器夯机. 应当使用单例模式. 避免过多的连接被消耗, 也方便管理。
  • SqlSession :SqlSession 相当于一个会话, 每次访问数据库都需要这样一个会话, 大家可能会想起了 JDBC 中的 Connection, 很类似, 但还是有区别的, 何况现在几乎所有的连接都是使用的连接池技术, 用完后直接归还而不会像 Session 一样销毁. 注意: 他是一个线程不安全的对象, 在设计多线程的时候我们需要特别的当心, 操作数据库需要注意其隔离级别, 数据库锁等高级特性, 此外, 每次创建的 SqlSession 都必须及时关闭它, 它长期存在就会使数据库连接池的活动资源减少, 对系统性能的影响很大, 我们一般在 finally 块中将其关闭.。还有, SqlSession 存活于一个应用的请求和操作, 可以执行多条 Sql, 保证事务的一致性。SqlSession在执行过程中,包含了几大对象:
    • Executor :执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护,由它调度 StatementHandler、ParameterHandler、ResultSetHandler 等来执行对应的 SQL。
    • StatementHandler :封装了JDBC Statement操作,负责对JDBC statement(每请求连接一次数据库,就产生一个statement对象) 的操作,如设置参数等,它是四大对象的核心,起到承上启下的作用,许多重要的插件都是通过拦截它来实现的
    • ParamentHandler :负责 将 用户传递的参数 转换成 JDBC Statement 所对应的数据类型
    • ResultSetHandler :负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
    • TypeHandler:负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
    • MappedStatement: MappedStatement维护一条<select|update|delete|insert>节点的封装
    • SqlSource: 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
    • BoundSql:表示动态生成的SQL语句以及相应的参数信息
  • Mapper :映射器是一些由你创建的、绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的, 他的作用是发送 SQL, 然后返回我们需要的结果. 或者执行 SQL 从而更改数据库的数据, 因此它应该在 SqlSession 的事务方法之内, 在 Spring 管理的 Bean 中, Mapper 是单例的

4.运行流程

  • 加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项
  • SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession
  • SqlSession对象完成和数据库的交互:
    • 用户程序调用mybatis接口层api(即Mapper接口中的方法)
    • SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
    • 通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
    • JDBC执行sql
    • 借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回

运行流程总结:

  • mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的)
  • SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession
  • SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接

4.与Hibernate的异同

  • 映射模式:从上面的简单概念可以知道Mybatis实际上着力点在POJO与SQL的映射。而Hibernate则主要是POJO与数据库表的对象关系映射。前者掌控力度更细,代码量会相对多一点,后者灵活性则差一点,更为自动化一些,与PHP里的Eloquent属于同类型
  • 性能 Mybatis基于原生JDBC,相比于对JDBC进行二次封装的Hibernate性能会更好一点
  • 开发与维护 Hibernate配置好实体类后,使用起来是比较简洁,舒服的,但是前期学习曲线比较陡,后期调优比较麻烦。Mybatis对SQL掌控的颗粒更细一点,相比较而言看上去简陋些。由于直接映射SQL,迁移性是个问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值