其他分享
首页 > 其他分享> > Mybatis3详解(一)——Mybatis的介绍

Mybatis3详解(一)——Mybatis的介绍

作者:互联网

image

1、什么是Mybatis

       MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis,也就是从3.0版本开始 iBatis改名为MyBatis。并且于2013年11月迁移到Github,地址:https://github.com/mybatis/mybatis-3。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

       MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

       用一句话来形容什么Mybatis:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。

2、一些基本概念

       Mybatis是一个基于Java的持久层 / ORM框架,所以我们在学习之前,先来了解一下如下基本概念。

       ①、什么是“持久化”

       持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等,但是一般都会存放在关系型数据库中如:MySQL、Oracle等。


       ②、什么是“持久层”

       持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。比如我们的pojo层、Dao层和Service层的关联。


       ③、什么是“ORM”

       ORM即Object-Relationl Mapping,意思为对象关系映射。它用于实现面向对象编程语言的类型 和 关系型数据库类型之间的相互转换。简单的说,ORM是通过描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射,到时候我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。但是从前面的描述可知,我们的Mybatis是需要与SQL打交道的,所以我们认为Mybatis是一个半自动化的ORM框架。

       在Java中典型的ORM中有:

       之所以要做持久化和使用ORM设计,因为持久化解决了数据的存储问题,ORM解决的主要是对象关系的映射的问题。在目前的企业应用系统设计中,都是以MVC为主要的系统架构模式(MVC即 Model(模型)- View(视图)- Control(控制))。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制等(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。 而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。

       一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。可以用下面这样一张图来表示:

       下面我们将关系数据中的表记录映射成为对象,以对象的形式展现,这样程序员可以把对数据库的操作转化为对对象的操作。

image

       因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

       ORM的方法论基于三个核心原则:

3、为什么使用Mybatis

       我们以前在没有ORM框架的情况下,如果你要开发一个Web应用程序的话,你就必须要使用传统的JDBC代码来操作数据库,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet等,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,而这些代码写起来往往是重复的,写起来又繁琐又枯燥。

       我们下面来分析一下使用传统JDBC的缺陷,先看如下代码:

public class SqlConnection {

    public static void main(String[] args) {
        //定义数据库连接
        Connection con = null;
        //定义数据库语句
        PreparedStatement ps = null;
        //定义返回结果集
        ResultSet rs= null;

        try {
            //加载数据库驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //定义MySQL URL,因为这里有的长所以在这里定义了
            String url = "jdbc:mysql://localhost:3306/user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
            //获取连接
            con = DriverManager.getConnection(url,"root","root");
            //定义SQL语句,?表示占位符
            String sql = "select * from t_user where username = ?";
            //获取编译处理的statement
            ps = con.prepareStatement(sql);
            //设置SQL参数
            ps.setString(1,"唐浩荣");
            //执行SQL语句查询,并且返回结果集
            rs = ps.executeQuery();
            //遍历结果集
            while (rs.next()){
                System.out.println(rs.getInt("id")+
                        "--"+rs.getString("username")+
                        "--"+rs.getInt("age"));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭数据库连接(三个写一起方便0.0)
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

       通过上面的一段JDBC连接数据代码,我们看有哪些不好的地方:

       所以通过上面的分析,我们知道为什么要使用Mybatis了吧。在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。并且 MyBatis 支持使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,即普通的 Java对象)映射成数据库中的记录。

       简单的说一下Mybatis相对JDBC的优势:

4、Mybatis的特点及优缺点

       特点:

       优点

       缺点

       总体来说,MyBatis 是一个非常优秀和灵活的数据持久化框架,适用于需求多变的互联网项目,也是当前主流的 ORM 框架。

5、Mybatis和Hibernate的区别

       Mybatis和Hibernate都是一款非常受欢迎的持久化框架,那么Mybatis和Hibernate二组之间有哪些区别呢?

       下面我们来看一下,因为这个问题面试很可能会问到。

       ①、开发方面:

       ②、底层方面:

       ③、SQL优化方面:

       ④、学习成本方面:

       ⑤、对象管理方面

       ⑥日志系统方面:

       ⑦、缓存方面

       Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓    存方案,创建适配器来完全覆盖缓存行为。

       Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。如果使用二级缓存时如果出现脏数据,系统会报出错误并提示。

       MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

       ⑧、各一句话总结它们:

       最后,不管你使用哪个持久化框架,它们都有它们各自的特点。总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

       参考链接:MyBatis与Hibernate区别

6、MyBatis的重要组件

       Mybatis封装了JDBC的代码,我们来分析Mybatis给我们的一些重要组件。

image

       我们从上往下看,MyBatis 中的一些重要组件如下::

7、MyBatis 执行流程简单说明

  1. 首先是加载Mybatis的全局配置文件,随后会加载SQL 映射文件或者是注解的相关 SQL 内容。
  2. 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
  3. 创建会话,根据会话工厂,MyBatis 就可以通过它来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含了对数据库操作的增、删、改、查方法。
  4. 创建执行器,因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
  5. 封装 SQL 对象,在这一步,执行器将待处理的 SQL 信息封装到一个对象中(MappedStatement),该对象包括 SQL 语句、输入参数映射信息(Java 简单类型、HashMap 或 POJO)和输出结果映射信息(Java 简单类型、HashMap 或 POJO)。
  6. 操作数据库,拥有了执行器和 SQL 信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。

标签:Java,Mybatis3,映射,数据库,MyBatis,详解,SQL,Mybatis
来源: https://www.cnblogs.com/tanghaorong/p/13856465.html