Mybatis(一)、ORM框架个人理解

目录

1、Java对于数据库的SPI机制加载Driver

2、JDBC

3、Mybatis


    使用Mybatis等ORM框架多年后,再去看之前对ORM的理解和之前些的博客(有点惨不忍睹)。几年前基本面试都问的Hibernate、jpa等,现在基本都使用Mybatis,然而发现自己对其框架一点都不知道,所以打算好好的学习和梳理哈。对于ORM框架的诞生,需要知道的规范和现状:

1、Java对于数据库的SPI机制加载Driver

    数据库访问对于Java而言,首先就是JDBC规范,Java使用SPI机制对数据库进行加载(可以参考:Java spi)。即Java定了java.sql.Driver接口,每个数据库厂商进行实现。 比如我们在使用MySQL数据库时需要引入官方提供的Jar包(比如:mysql-connector-java-8.0.17.jar),结构大致如下:

该Jar包的META-INF/services下面有java.sql.Driver文件,其内容为(com.mysql.cj.jdbc.Driver),如下:

    则项目启动时,JVM则会的java.util.ServiceLoader就会把com.mysql.cj.jdbc.Driver进行加载,类信息如下。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

    /**
     * Construct a new driver and register it with DriverManager
     *
     * @throws SQLException
     *             if a database error occurs.
     */
    public Driver() throws SQLException {
        // Required for Class.forName().newInstance()
    }
}

 

2、JDBC

    所有优秀的ORM框架最底层都不能逃脱JDBC相关代码类,这是Java本身规范的与数据库的交互规则。这也是很多面试经常会要求手写JDBC的原因。

public class JDBC {

    public static final String URL = "jdbc:mysql://localhost:3306/kevin";
    public static final String USER = "kevin";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        // 加载驱动
        Class.forName("com.mysal.jdbc.Driver");
        // 获取链接
        Connection connection = DriverManager.getConnection(URL, URL, PASSWORD);
        // 操作数据库查询
        PreparedStatement preparedStatement = connection.prepareStatement("select * from user where id = ?", 1);
        // 获取结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            String id = resultSet.getString("id");
            String name = resultSet.getString("name");
            System.out.printf("id:" + id + ", name:" + name);
        }
    }

    @Data
    public class User {
        private Long id;
        private String name;
    }

}

    自己发现要去写整个JDBC流程也比较困难,呵呵。有了上面的SPI加载驱动类,则JDBC从加载驱动开始就不突兀了。并且JDBC规定了数据库交互的几个核心接口:ConnectionPreparedStatement(或者Statement )、ResultSet。这几个环节和接口类是不能逃避的,但是如果直接使用JDBC进行开发,则会有很多的弊端:

1)、重复代码

    如果要调用一次数据库,需要重复这些基本的不能逃过的类,那么最有效防止写重复代码的方式就是封装。

2)、代码与SQL硬编码耦合

    如上SQL直接写到代码中,完全的硬编码。修改SQL时需要去很多的类,或者几百(几千)行中去查找修改。

3)、释放资源

    之前的时候写JDBC都需要在finally中判断并关闭Connection、ResultSet(调用其close方法)。好在JDK1.7之后出了AutoCloseable、Closeable接口,可以不必再写这部分恶心的代码。

4)、资源管理

    JDBC中每次调用都会从驱动中获取一个新的Connection链接,调用之后就被释放,浪费宝贵资源。则java的DataSource就是为了解决该问题,并且数据库链接池框架层出不穷:前几年比较常用的:DBCP、C3P0;近几年国内基本都使用阿里的Druid;再到Spring Boot 2之后默认的日本人开发的Hikari

5)、结果转换

    其实很多时候我们关系的是根据条件,获取一张表的数据(部分数据)、或者链表查询获取多个表的特定字段,最好能返回到我们设置好的一个POJO对象(或者Map)中。

 

    由于以上的不能逃避的因素,那么我们很多时候想要的只是上面4)、结果转换中的方式获取数据。在ORM成型前有中间的轻量级框架(或者工具)出现,如:Spring JDBC、Apache的DBUtils等。但是都是Java开发,更适合的方式是面向对象,我们像操作一个POJO一样的操作一张表数据,进行一一映射,ORM思想逐渐成熟。

 

3、Mybatis特点

1)、使用连接池对链接进行管理

2)、SQL和代码分离,集中管理;重复SQL的提取

3)、参数映射和动态SQL

4)、结果集映射

5)、缓存管理(一级和二级缓存)

6)、插件机制

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值