前言

MyBatis的读音是:[mai'bətɪs],中文音译:麦-波蒂斯,MyBatis的前世是ibatis,这个词是由"internet"和"abatis"组合而成,创始人是Clinton Begin。

abatis的读音是:['æbətɪs],其含义是:篱笆墙。篱笆墙又叫栅栏、护栏,是用来保护院子的一种设施,一般都是由木头,棍子,竹子,芦苇、灌木或者石头构成,常见于我国北方农村以及欧美等地广人稀的国家,用于保护院子。

ibatis一词来源于"internet"和"abatis"的组合,其目的是想当做互联网的篱笆墙,是围绕着数据库提供持久化服务的一个框架。

ibatis是由Clinton Begin在2001年发起的Java开源项目,后迁移至Apache Software Foundation,其官网地址是:http://ibatis.apache.org/。其后,ibatis提供了两种语言实现的版本,包括:Java、.NET。Java语言版本的主要作者仍是Clinton Begin。

由于某种原因,ibatis在2010年6月16日从Apache Software Foundation退出,然后被谷歌托管,并更名于MyBatis,新官方网址为:http://www.mybatis.org/,后来,几经周转,MyBatis代码最后的落脚地是托管在GitHub。

1、MyBatis是什么?

MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装。这个封装的路线是这样的:

java.sql.Statement -> MyBatis的Executor -> MyBatis的SqlSession

推荐阅读1:MyBatis核心对象SqlSession介绍

推荐阅读2:MyBatis的工作原理以及核心流程介绍

MyBatis使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建Connection、创建Statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。

MyBatis通过xml或注解的方式将要执行的各种Statement(Statement、PreparedStatement、CallableStatement)配置起来,并通过Java对象和Statement中的SQL进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射成Java对象并返回。

2、分析原生态JDBC程序中存在的问题

2.1、原生态JDBC程序代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test
{
    public static void main(String[] args)
    {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try
        {
            //1、加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2、通过驱动管理类获取数据库链接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");

            //3、定义sql语句,?表示占位符
            String sql = "select * from user where username = ?";

            //4、获取预处理statement
            preparedStatement = connection.prepareStatement(sql);

            //5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "admin");

            //6、向数据库发出sql执行查询,查询出结果集
            resultSet = preparedStatement.executeQuery();

            //7、遍历查询结果集
            while (resultSet.next())
            {
                System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            //8、释放资源
            if (resultSet != null)
            {
                try
                {
                    resultSet.close();
                }
                catch (SQLException e)
                {

                    e.printStackTrace();
                }
            }
            if (preparedStatement != null)
            {
                try
                {
                    preparedStatement.close();
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
            if (connection != null)
            {
                try
                {
                    connection.close();
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }

        }

    }

}

2.2、JDBC问题总结

(1)数据库连接频繁开启和关闭,会严重影响数据库的性能。

(2)代码中存在硬编码,分别是数据库部分的硬编码和SQL执行部分的硬编码。

3、MyBatis框架设计与核心对象

3.1、MyBatis框架图

mybatis3.5.png

3.2、MyBatis核心对象

3.2.1 SqlSessionFactory 与 SqlSessionFactoryBuilder

SqlSessionFactory是MyBatis的核心对象,它是创建SqlSession的工厂类。

SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

每一个MyBatis的应用程序都是以一个SqlSessionFactory实例为核心。同时,SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。

3.2.2 SqlSession

SqlSession是MyBatis的关键对象,类似于JDBC中的Connection,它是应用程序与持久层之间执行交互操作的一个单线程对象。

SqlSession的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。

SqlSession是线程不安全的,每个线程都应该有它自己的SqlSession实例,SqlSession的实例不能被共享。不能将SqlSeesion实例的引用当做一个类的静态属性。

4、MyBatis执行过程

第一步:MyBatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。

MyBatis配置文件,包括MyBatis全局配置文件和MyBatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。

第二步:通过SqlSessionFactory,MyBatis可以创建SqlSession(即会话),MyBatis是通过SqlSession来操作数据库的。

第三步:MyBatis操作数据库。SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括Java的简单类型、HashMap集合对象、POJO对象类型。

代码如下所示:

public class App
{
    public static void main(String[] args) throws Exception
    {
        // 读取mybatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

        // 初始化mybatis,创建SqlSessionFactory类的实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 创建Session实例
        SqlSession session = sqlSessionFactory.openSession();

        // 操作数据库方法一:获得xml映射文件中定义的操作语句
        Person p = session.selectOne("cn.mybatis.mydemo.mapper.PersonMapper.selectPersonById", 1);
        // 打印Peson对象
        System.out.println(p);

        // 操作数据库方法二:获得mapper接口的代理对象
        PersonMapper pm = session.getMapper(PersonMapper.class);
        // 直接调用接口的方法,查询id为1的Peson数据
        Person p2 = pm.selectPersonById(1);
        // 打印Peson对象
        System.out.println(p2);

        // 提交事务
        session.commit();
        // 关闭Session
        session.close();
    }
}

5、MyBatis最新版本介绍

MyBatis最新版本是:3.5.2,发布时间是:2019年7月15日,更多介绍请移步:http://www.mybatis.cn/archives/673.html

下载地址为:https://github.com/mybatis/mybatis-3/releases

当前大多数人主要使用MyBatis 3.4版本,建议大家及时升级。

6、MyBatis技术支持

欢迎关注MyBatis中文官网,我们愿意与您一同领略MyBatis的伟大和神奇。

最后请认准官方域名:http://www.mybatis.cn/,欢迎加入网站微信技术交流群。

7、MyBatis更多介绍

横看成岭侧成峰,远近高低各不同。从不同的角度,能看到mybatis的不同侧面,更多入门介绍请移步:MyBatis更多介绍...

标签: none

添加新评论