您的位置:时时app平台注册网站 > 编程知识 > Mybaits-Java ORM来源于历史、Hibernate和MyBatis比较【时

Mybaits-Java ORM来源于历史、Hibernate和MyBatis比较【时

2019-10-11 01:10

Hibernate的缺点:

数据库驱动

上面提到,接口的实现由各个厂商提供,那么实现类的类名就会不统一,去创建Connection对象时,代码就会写死某个实现类,切换数据库时,就需要修改代码,这样不太好。为了解决这个问题,抽象了Driver驱动的概念。

Connection con=MySqlConnectionImpl("127.0.0.1",3306,"mi_user",userName,pwd);

每个数据库都需要实现Driver接口,通过Driver可获得数据库连接Connection,通过反射机制动态创建。

Class.forName("com.mysql.jdbc.Drier");

同一个程序可能访问不同的数据库,通过DriverManager来管理驱动,Driver在初始化的时候,需要注册到DriverManager中。

DriverManager提供了一个getConnection方法,用于建立数据库Connection:

Connection con=DriverManager.getConnection("127.0.0.1",3306,"mi_user",userName,pwd);

如果有多个数据库驱动,DriverManager如何区分呢,需要在数据库连接url中指定,比如mysql需要添加jdbc:mysql前缀:

String url= "jdbc:mysql://127.0.0.1:3306/mi_user";
Connection con=DriverManager.getConnection(url,userName,pwd)

主要介绍了Java ORM来源于历史,JDBC、Hibernate和MyBatis的优缺点,比较他们之间区别和应用场景

欢迎访问本人博客:http://wangnan.tech

这就是Hibernate的优势,在配置了映射文件和数据库连接文件后,Hibernate就可以通过Session操作,非常容易,消除了JDBC带来的大量代码,大大提高了编程的简易性和可读性。Hibernate还提供了级联,缓存,映射,一对多等功能。Hibernate是全表映射,通过HQL去操作POJO进而操作数据库的数据。

深入浅出MyBatis:JDBC和MyBatis介绍,mybatisjdbc

Hibernate

Hibername一问世就成为了Java世界首选的ORM框架,它是建立在POJO和数据库表模型的直接映射关系上的

时时app平台注册网站 1

Hibernate优势

  • 消除了代码的映射规则,它全部被分离到了XML或者注解里面去配置
  • 无需再管理数据库连接,它也可以配置在XML里面
  • 一个会话中,不要操作多个对象,只要操作Session对象即可
  • 关闭资源只需要关闭一个Session便可

Hibernate缺陷

  • 全表映射带来了不便,比如更新时需要发送所有的字段
  • 无法根据不同的条件组装不同的SQL
  • 对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为POJO
  • 不能有效支持存储过程
  • 虽然有HQL,但是性能较差, 大型互联网系统往往需要优化SQL,而hibernate做不到

JDBC的最大特点是它独立于具体的关系数据库。与ODBC类似,JDBC API 中定义了一些Java类分别用来表示与数据库的连接(Connections),SQL语句(SQL Statements),结果集(ResultSets)以及其它的数据库对象, 使得Java程序能方便地与数据库交互并处理所得的结果。使用JDBC, 所有Java程序(包括Java Applications, Applets和Servlet)都能通过SQL语句或存储在数据库中的过程(Stored Procedures)来存取数据库。

映射器

映射器是由Java接口和XML文件(或注解)共同组成的,作用如下:

  • 定义参数类型

  • 描述缓存

  • 描述SQL语句

  • 定义查询结果和POJO的映射关系

首先,定义Java接口:

public interface RoleMapper{    public Role getRole(Long id);
}

然后,定义映射XML文件,RoleMapper.xml

<? xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">

 <mapper namespace ="com.learn.chapter2.mapper.RoleMapper">
    <select id="getRole" paramterType="long" resultType="role" >
        select id,role_name as roleName , note from t_role where id=#{id}    </select>
 </mapper>

POJO对象Role的定义比较简单,就不列出了。#{id}为这条SQL的参数,SQL列的别名和POJO的属性名称保持一致,会把这条语句的查询结果自动映射到Role属性上,这就是自动映射。

执行查询

RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Role role=roleMapper.getRole(1L);
String roleName=role.getRoleName();

ORM模型

ORM取代了JDBC,所有的ORM模型都是基于JDBC进行封装的,不同ORM模型对JDBC封装的强度是不一样的

ORM
对象关系映射(Object Relational Mapping),简单的说ORM框架就是数据库的表和简单Java对象的映射关系模型,我们通过这层映射关系就可以简单迅速地把数据库表的数据转化为POJO

如图

时时app平台注册网站 2

二、我们对JDBC编程可能产生的异常进行捕捉处理并正确关闭资源。

核心组件

核心组件主要包括以下几个:

  • SqlSessionFactoryBuilder:会根据配置信息或代码来生成SqlSessionFactory;

  • SqlSessionFactory:依靠工厂来生成SqlSession;

  • SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口;

  • SQL Mapper:是MyBatis新设计的组件,由一个Java接口和XML文件构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

JDBC

Java程序是通过JDBC(Java Data Base Connectivity)连接数据库的,JDBC是由SUN公司提出的一系列规范,但是它只定义了接口的规范,而具体的实现是交给了各个数据库厂商去实现的,JDBC是一种典型的桥接模式

JDBC编程步骤

  1. 使用JDBC编程需要连接数据库,注册驱动和数据库信息
  2. 操作Connection,打开Statement对象
  3. 通过Statement执行SQL,返回结果到ResultSet对象
  4. 使用ResultSet读取数据,然后通过代码转换为具体的POJO对象
  5. 关闭数据库相关资源

JDBC弊端

  1. 工作量大
  2. 编程复杂

操作Connection,打开Statement对象。

JDBC相关概念

Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,JDBC是由SUN公司提出的一些列规范,只定义了接口规范,具体实现由各个数据库厂商去实现,它是一种典型的桥接模式。

桥接模式是一种结构型设计模式,它的主要特点是把抽象与行为实现分离开来,分别定义接口,可以保持各部分的独立性以及应对他们的功能扩展。

Mybatis

为了解决Hibernate的不足,一个半自动映射的框架MyBatis应运而生

mybatis是一个java持久层框架,它封装少、高性能·可优化、维护简单等优点成为了目前java移动互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程

之所以称它为半自动,是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系便可

历史
Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 并且改名为Mybatis,2013年11月迁移到Github,目前mybaits是由Github维护的

名称
iBatis一词来源于“internet”和“abatis”的组合

mybaits所需要提供的映射文件包含以下三个部分

  • SQL
  • 映射规则
  • POJO

时时app平台注册网站 3

什么时候用mybaits

  • hibernate只适用于场景不太复杂,要求性能不太苛刻的时候
  • mybatis拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存、日志、级联,但是它的缺陷是需要你提供映射规则和sql,所以它的开发工作量比Hibernate略大一些

(注:内容整理自《深入浅出MyBatis技术原理与实战》)

JDBC的缺点:

数据源

数据源DataSource包含连接池和连接池管理2个部分,习惯上称为连接池。在系统初始化的时候,将数据库连接作为对象存储在内存中,当需要访问数据库时,从连接池中取出一个已建立的空闲连接对象。

使用数据源,获取其DataSource对象,通过该对象动态的获取数据库连接。另外,DataSource对象可以注册到名字服务(JNDI)中,可以通过名字服务获得DataSource对象,无需硬性编码驱动。

DriverManager是JDBC1提供的,DataSource是JDBC2新增的功能,提供了更好的连接数据源的方法。

通过Statement对象执行SQL,返回结果到ResultSet对象。

实战应用

主要讲解MyBatis的一些实用的场景:

  • 介绍MyBatis-Spring,讲解如何在Spring项目中集成MyBatis应用

  • 介绍MyBatis的实用场景,精选一些典型场景,解析每个场景下,开发人员需要注意避免的一些错误和性能上的损失

下篇会介绍MyBatis的相关配置,更好的配置MyBatis以适用于不同的业务场景,以及提供给我们的扩展。时时app平台注册网站 4

JDBC相关概念 Java程序都是通过JDBC连接数据库的,通过SQL对数据库编程,JDBC是由SUN公司提出的一...

从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用SQL语句的话建议采用MyBatis框架。

对比Hibernate和MyBatis

通过上面的介绍,传统的JDBC编程给我们带来了连接数据库的功能,但其工作量相对较大,首先连接,然后处理JDBC底层事务,处理数据类型,还要对可能产生的异常进行捕捉处理并正确的关闭资源。

实际工作中,很少使用JDBC进行编程,提出了ORM模型,主要解决数据库数据和POJO对象的相互映射。

Hibernate和Mybatis都是ORM模型,Hibernate提供的是一种全表映射的模型,对JDBC的封装程度比较高。但Hibernate也有不少缺点,列举如下:

  • 全表映射带来的不便,比如更新时需要发送所有的字段;

  • 无法根据不同的条件组装不同的SQL;

  • 对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为POJO;

  • 不能有效支持存储过程;

  • 虽然有HQL,但性能较差,大型互联网系统往往需要优化SQL,而Hibernate做不到。

大型互联网环境中,灵活、SQL优化,减少数据的传递是最基本的优化方法,Hibernate无法满足要求,而MyBatis提哦给你了灵活、方便的方式,是一个半自动映射的框架。

MyBatis需要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系。

MyBatis可以配置动态SQL,可以解决Hibernate的表名根据时间变化,不同的条件下列明不一样的问题。可以优化SQL,通过配置决定SQL映射规则,也能支持存储过程,对于一些复杂和需要优化性能的SQL的查询它更加方便。

关闭资源只需要关闭一个Session便可。

MyBatis原理

深入源码理解MyBatis的内部运行原理以及插件的开发方法和技巧:

  • 介绍MyBatis的解析和运行原理,将了解到SqlSession的构建方法,以及四大对象是如何工作的

  • 介绍MyBatis的插件

关闭数据库相关的资源。

JDBC规范

所谓规范,就是自己定义了标准接口,做了如下抽象:用Connection代表和数据库的连接,用Statement执行SQL,用ResultSet表示SQL返回的结果,提供了对数据的便利。从Connection可以创建Statement,Statement执行查询得到ResultSet。

上面说的Connection、Statement、ResultSet都应该是接口,具体实现由各个数据库提供商提供。有了规范,可以通过统一的接口,访问多种类型的数据库,可随便切换数据库。

不能有效的支持存储过程。

创建SqlSession

SqlSession是一个接口类,扮演者门面的作用,真正干活的是Executor接口。需要保证每次用完正常关闭它。

SqlSession sqlSession=null;try{
    sqlSession=sqlSessionFactory.openSession();    //some code
    sqlSession.commit();
} catch(Exception ex){
    sqlSession.roolback();
} finally{    if(sqlSession!=null){
        sqlSession.close();
    }
}

使用ResultSet读取数据,然后通过代码转化为具体的POJO对象。

构建SqlSessionFactory

每个MyBatis应用都是以SqlSessionFactory的实例为中心的,它的任务是创建SqlSession。SqlSesion类似于一个JDBC的Connection对象。

提供了2种方式创建SqlSessionFactory:一种是XML配置的方式,一种是代码的方式,推荐使用XML配置的方式。

定义mybatis-config.xml文件如下:

<? xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>
 <properties resource="application.properties">
 </properties>

 <!-- 定义别名 -->
 <typeAliases>
 <typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
 </typeAliases>

 <!-- 定义数据库信息.默认使用development数据库构建环境 -->
 <environments default="development">
    <environment id="development">
    <!-- 采用jdbc事务管理 -->
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
 </environments>

 <!-- 定义映射器 -->
 <mappers>
 <mapper resource="comlearnchapter2mapperroleMapper.xml"/>
 </mappers></configuration>

创建SqlSessionFactory

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

Mybatis需要提供的映射文件包含了一下三个部分:SQL,映射规则,POJO。在Mybatis里面你需要自己编写SQL,虽然比Hibernate配置多,但是Mybatis可以配置动态SQL,解决了Hibernate表名根据时间变化,不同条件下列不一样的问题,同时你也可以对SQL进行优化,通过配置决定你的SQL映射规则,也能支持存储过程,所以对于一些复杂和需要优化性能的sql查询它就更加方便。Mybatis几乎可以做到JDBC所有能做到的事情。

基础应用

主要介绍如何高效地使用MyBatis:

  • MyBatis特性

  • 核心组件及其生命周期

  • MyBatis配置

  • 映射器

  • 动态SQL

如果你需要一个灵活的,可以动态生成映射关系的框架,那么Mybatis确实是一个最好的选择。它几乎可以替代JDBC,拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存,日志,级联。但是它的缺陷是需要你提供映射规则和SQL,所以开发工作量比Hibernate要大些。

组件生命周期

SqlSessionFactory在MyBatis应用的整个生命周期中,每个数据库只对应一个SqlSessionFactory,可以实现一个工具类,以单例模式获取该对象。

SqlSession的生命周期在请求数据库处理事务的过程中,它是一个线程不安全的对象,在涉及多线程的时候要特别当心。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。

Mapper的作用是发送SQL,然后返回需要的结果,或者执行SQL修改数据库的数据,所以它应该在一个SqlSession事务方法之内,如同JDBC中一条SQL语句的执行,它最大的范围和SqlSession是相同的。

我们平时使用JDBC进行编程,大致需要下面几个步骤:

书的整体结构

本书分为3个部分,依次介绍了MyBatis的基础应用、原理及插件开发、实战应用。

通常,Java程序首先使用JDBC API来与JDBC Driver Manager交互,由JDBC Driver Manager载入指定的JDBC Driver, 以后就可以通过JDBC API来存取数据库。

要通过JDBC来存取某一特定的数据库,必须有相应的JDBC Driver,它往往是由生产数据库的厂家提供,是连接JDBC API与具体数据库之间的桥梁。

消除了代码的映射规则,它全部分离到了XML或者注解里面去配置。

JDBC(Java DataBase Connectivity)它是一个面向对象的应用程序接口, 通过它可访问各类关系数据库。JDBC也是Java核心类库的一部分。

从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。

对多表关联和复杂的SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据封装为POJO。

Hibernate是建立在若干POJO通过XML映射文件提供的规则映射到数据库表上的。我们可以通过POJO直接操作数据库的数据,它提供的是一种全表映射的模型。相对而言,Hibernate对JDBC的封装程度还是比较高的,我们已经不需要写SQL,只要使用HQL语言就可以了。

Hibernate作为留下的Java ORM框架,它确实编程简易,需要我们提供映射的规则,完全可以通过IDE生成,同时无需编写SQL确实开发效率优于Mybatis。此外Hibernate还提供了缓存,日志,级联等强大的功能,但是Hibernate的缺陷也是十分明显,多表关联复杂sql,数据系统权限限制,根据条件变化的SQL,存储过程等场景使用Hibernate十分不方便,而性能又难以通过SQL优化,所以注定了Hibernate只适用于在场景不太复杂,要求性能不太苛刻的时候使用。

无需在管理数据库连接,它也配置到XML里面了。

全表映射带来的不便,比如更新时需要发送所有的字段。

使用JDBC编程需要连接数据库,注册驱动和数据库信息。

Mybatis:

ODBC(OpenDatabase Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。

JDBC:

一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。

从功能上看,JDBC就是简单的建立数据库连接,然后创建Statement,将SQL语句传给Statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,对SQL语句进行修改和优化比较困难;MyBatis是将SQL语句中的输入参数和输出参数映射为Java对象,SQL修改和优化比较方便.

Hibernate:

虽然有HQL,但是性能较差,大型互联网系统往往需要优化SQL,而Hibernate做不到。

无法根据不同的条件组装不同的SQL。

一、工作量比较大,需要连接,然后处理JDBC底层事务,处理数据类型,还需要操Connection,Statement对象和ResultSet对象去拿数据并关闭它们。

Hibernate的优点:

由于JDBC存在的缺陷,在实际工作中我们很少直接使用JDBC进行编程,用的更多的是ORM对象关系模型来操作数据库,Hibernate就是一个ORM模型。

为了解决Hibernate的不足,Mybatis出现了,Mybatis是半自动的框架。之所以称它为半自动,是因为它需要手工匹配提供POJO,SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系即可。

一个会话中不需要操作多个对象,只需要操作Session对象。

本文由时时app平台注册网站发布于编程知识,转载请注明出处:Mybaits-Java ORM来源于历史、Hibernate和MyBatis比较【时

关键词: