`

mybaits简述及原理概述

阅读更多
Mybatis是一个基于Java的持久层框架。

MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的JDBC代码和手工设置参数以及抽取结果集。MyBatis用简单的XML或注解来配置和映射基本体,将接口和Java的POJOs映射成数据库中的记录。

从JDBC到Mybatis
jdbc示例
原始的JDBC操作数据库频繁开启和关闭数据库连接造成资源浪费以及大量的样板代码等,Mybatis是对JDBC进行封装的一个持久层框架,可以为应用开发简化持久层开发。

一、对于JDBC哪些步骤可以进一步封装

1、连接获取和释放
问题:数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
解决:数据库连接的获取和关闭可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间。
一般常用的有JDBC连接池或JNDI数据库连接池。

2、SQL统一存取
问题:使用JDBC进行操作数据库时,SQL语句基本都散落在各个JAVA类中,这样有三个不足之处:
(1)、可读性差,不利于维护以及做性能调优
(2)、改动JAVA代码需要重新编译、打包部署
(3)、不利于取出SQL在数据库客户端执行
解决:可以将这些SQL语句统一集中放到配置文件或者数据库中(以key-value的格式存放)。然后通过SQL语句的key值去获取对应的SQL语句。

3、更灵活的传入参数映射和动态SQL
问题:通常通过在SQL语句中设置点位符来达到使用传入参数的目的,这种方式本身就有一定局限性,它是按照一定顺序传入参数的,要与占位符一一匹配。但是,如果我们传入的参数是不确定的(比如列表查询,根据用户填写的查询条件不同,传入查询的参数也不同的),那么我们就得在后台代码中自己根据请求的传入参数去拼凑相应的SQL语句,这样的话避免不了在Java代码里写SQL语句的命运。
解决:通过引入<if>这样的标签,需要专门的sql解析器解析这样的判断结果是否为true来输出标签里面的sql片断。并通过不标识符区分开点位符变量和非点位符变量。使用#变量名,#表示点位符变量,使用$变量名$表示非点位符变量。

4、结果映射和结果缓存
问题:执行sql语句获取执行结果,返回ResultSet结果集后,需要将结果集数据取出来,释放资源后便取不到结果信息。
解决:对于结果可能需要做的处理有,将结果转换成一个javabean对象返回、一个map返回、一个list返回等,需要告诉sql处理器两点(1)、需要返回什么类型的对象(2)、需要返回的对象的数据结构怎么跟执行的结果映射。再考虑对sql执行结果的缓存来提升性能。缓存以key-value格式保存,sql语句和传入参数部分合起来可以作为数据缓存的key值。

5、解决重复SQL语句问题
问题:由于所有sql语句都放到配置文件中,这个时候遇到一个sql重复的问题,几个功能的sql语句其实都差不多,有些可能是select后面那段不同、有些可能是where语句不同。有时候结构改了,那么我们需要改多个地方,不利于维护。
解决:将重复的代码抽离出来成为独立的一个类,然后在各个需要使用的地方进行引用。对于sql重复问题,可以采用,通过将sql片段模块化,将重复的sql片段独立成一个sql块,然后在各个sql语句中引用重复的sql块。

优化总结:
我们总结一下上面对JDBC的优化和封装:
(1) 使用数据库连接池对连接进行管理
(2) SQL语句统一存放到配置文件
(3) SQL语句变量和传入参数的映射以及动态SQL
(4) 动态SQL语句的处理
(5) 对数据库操作结果的映射和结果缓存
(6) SQL语句的重复

mybaits的部体流程
1、加载配置并初始化
触发条件:加载配置文件
配置文件来源于两个地方,一处是配置文件,一处是java代码的注解,将sql的配置信息加载成为一个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

2、接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。

3、处理操作请求
触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:(A)根据SQL的ID查找对应的MappedStatement对象
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。

4、返回处理结果
将最终的处理结果返回。


mybatis功能架构设计




功能架构分为三层:
(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

mybatis具体执行流程图






SqlSessionFactoryBuilder
每一个mybatis的应用程序的入口是SqlSessionFactoryBuilder,它的作用是通过XML配置文件创建Configuration对象,然后通过build方法创建SqlSessionFactory对象。一般使用全局。
private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;  
private static SqlSessionFactory sqlSessionFactory;  
private static void init() throws IOException {  
    String resource = "mybatis-config.xml";  
    Reader reader = Resources.getResourceAsReader(resource);  
    sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();  
    sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);  
}  


SqlSessionFactory
它的主要功能是创建SqlSession对象,一般使用全局。SqlSessionFactory对象一个必要的属性是Configuration对象,它是保存Mybatis全局配置的一个配置对象,通常由SqlSessionBuilder从XML配置文件创建。


SqlSession
SqlSession对象的主要功能是完成一次数据库的访问和结果的映射,它类似于数据的session概念,由于不是线程安全,所以SqlSession对象的作用域需要限制方法内。SqlSession的默认实现类是DefaultSqlSession,它有两个必须配置属性:Configuration和Executor。SqlSession对数据库的操作都是通过Executor来完成的。
SqlSession有一个重要的方法getMapper,顾名思义,这个方式是用来获取Mapper对象的。什么是Mapper对象?根据Mybatis的官方手册,应用程序除了要初始并启动Mybatis之外,还需要定义一些接口,接口里定义访问数据库的方法,存放接口的包路径下需要放置同名的XML配置文件。SqlSession的getMapper方法是联系应用程序和Mybatis纽带,应用程序访问getMapper时,Mybatis会根据传入的接口类型和对应的XML配置文件生成一个代理对象,这个代理对象就叫Mapper对象。应用程序获得Mapper对象后,就应该通过这个Mapper对象来访问Mybatis的SqlSession对象,这样就达到里插入到Mybatis流程的目的。示例代码如下:
SqlSession session= sqlSessionFactory.openSession();  
UserDao userDao = session.getMapper(UserDao.class);  
UserDto user = new UserDto();  
user.setUsername("iMybatis");  
List<UserDto> users = userDao.queryUsers(user);  


Executor
Executor对象在创建Configuration对象的时候创建,并且缓存在Configuration对象里。Executor对象的主要功能是调用StatementHandler访问数据库,并将查询结果存入缓存中。

StatementHandler

StatementHandler是真正访问数据库的地方,并调用ResultSetHandler处理查询结果。


ResultSetHandler

处理查询结果。


MyBatis的优缺点
 
优点:
1、简单易学
       mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
 
2、灵活
       mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
 
3、解除sql与程序代码的耦合
       通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

4、提供映射标签,支持对象与数据库的orm字段关系映射
 
5、提供对象关系映射标签,支持对象关系组建维护

6、提供xml标签,支持编写动态sql。

缺点:

1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
 
2、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
 
3、框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
 
4、二级缓存机制不佳

总结

       mybatis的优点同样是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。
      mybatis没有hibernate那么强大,但是mybatis最大的优点就是简单小巧易于上手,方便浏览修改sql语句。

Mybaits有待改进之处
问题描述:
Mybaits所有的数据库操作都是基于SQL语句,导致什么样的数据库操作都要写SQL语句。一个应用系统要写的SQL语句实在太多了
  • 大小: 17.3 KB
  • 大小: 35.2 KB
  • 大小: 98.8 KB
分享到:
评论

相关推荐

    mybatis-plus 实践及架构原理

    Mybatis-Plus的实践及架构原理主要包含以下几个方面的知识点: 1. Mybatis-Plus的定义: Mybatis-Plus是一个Mybatis的增强工具,在保留Mybatis原有特性的同时,提供了很多便捷的功能,如代码生成器、分页插件等,...

    搭建spring、springMVC、myBaits框架

    搭建Spring、SpringMVC和MyBatis这三大框架是Java Web开发中的常见任务,它们各自在应用程序的不同层次上提供服务,构建出一个完整的MVC(Model-View-Controller)架构。下面将详细介绍这三个框架以及如何将它们整合...

    手写mybaits框架代码

    手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写...

    mybaits最新jar包

    mybaits通过maven构建的最新jar包文件

    mybaits demo

    【标题】"mybaits demo" 是一个关于MyBatis框架的示例项目,它旨在帮助开发者更好地理解和学习如何在实际开发中应用MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。通过简化DAO...

    Mybaits-one2many

    在本案例 "Mybaits-one2many" 中,我们将探讨如何实现一对多的关系查询,并且通过实践来理解这种映射关系。 首先,我们需要了解一对多关系的基本概念。在数据库设计中,如果一个表(如用户表)的某一行可以与另一个...

    mybaits demo程序

    MyBatis 是一款深受开发者喜爱的轻量...对于初学者来说,这是一个很好的实践平台,能帮助理解MyBatis的核心概念和工作原理。在实际开发中,结合具体业务需求,灵活运用这些知识点,可以构建高效、稳定的数据库访问层。

    mybaits-spring配置

    这个主题,"mybaits-spring配置",主要涵盖了如何将MyBatis 3.1.1版本与Spring 3.0.5版本集成,并通过使用mybatis-spring-1.1.1.jar库来实现数据访问层(DAO)的无缝配合。下面将详细解释这一整合过程中的关键知识点...

    Mybaits 文档

    它可以通过简单的XML或注解进行配置和原始映射,将基本类型、接口映射及Java POJO(Plain Old Java Objects)映射到数据库记录。 ##### 1.2 如何改进文档? 如果你发现文档有任何不足之处,或者某些功能缺少文档,...

    mybaits实例项目

    在这个"mybaits实例项目"中,初学者可以学习到MyBatis的核心概念和基本操作。下面,我们将详细讨论MyBatis的关键知识点: 1. **配置文件**: MyBatis的配置文件(通常命名为`mybatis-config.xml`)是整个框架的中心...

    struts + spring + mybaits整合

    struts + spring + mybaits整合

    MyBaits2.zip

    1. 首先会读取在property标签中定义的属性。 2. 然后会读取在properties标签中通过resource或url加载时的属性,它会覆盖已读取得同名属性。 3. 最后会读取sql中parameterType传递过来的属性,它会覆盖已读取的同名...

    springboot+mybaits+pagehelper

    在 "springboot+mybaits+pagehelper" 的项目中,我们可以看到以下几个关键知识点: 1. **SpringBoot 整合 MyBatis**: - 创建 `mybatis-config.xml` 配置文件,定义数据源和事务管理器。 - 在 `pom.xml` 添加 ...

    spring+mybaits+maven

    spring + mybatis + maven 项目dome 实现

    mybaits自动生成代码

    MyBatis是一个强大的Java持久层框架,它与Hibernate和iBatis有所不同,主要在于MyBatis更加灵活,允许开发者自由地编写SQL语句。MyBatis的“自动生成代码”功能是其一大亮点,极大地提高了开发效率,尤其在处理大量...

    mybaits逆向工程

    MyBatis逆向工程是数据库表到Java实体类和Mapper接口的一种自动化工具,极大地提高了开发效率。通过MyBatis的逆向工程,开发者可以快速生成基于数据库表的实体类、Mapper接口以及对应的XML配置文件,减少了手动编写...

    springmvc+mybaits实现分页 查询功能 带数据库

    **步骤概述** 1. **配置环境**:设置SpringMVC和MyBatis的环境,包括Spring的上下文配置、MyBatis的配置文件、数据源和SqlSessionFactory等。 2. **创建实体类**:根据数据库表结构,创建对应的Java实体类,用于表示...

    MyBaits Plus

    MyBaits Plus

    mybaits反向工程

    MyBatis 反向工程(Reverse Engineering)是 MyBatis 框架提供的一种便捷工具,用于快速生成基于数据库表的 Java 模型类、Mapper 映射接口和 XML 映射文件。通过反向工程,开发者可以节省大量手动编写这些基础代码的...

    SpringMvC+Mybaits

    但正如描述中提到的,“SpringMVC+Mybaits 有点乱”,这可能意味着项目中的代码组织、配置管理或者模块划分不够清晰,需要进一步优化和整理,以提高代码的可读性和可维护性。在实际开发中,遵循良好的编码规范、合理...

Global site tag (gtag.js) - Google Analytics