Mybatis学习之自定义持久层框架(一)

前言

说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口。

我们都知道,JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这也就是Mybatis所具备的功能,那既然已经有了JDBC了,为什么还要用Mybatis呢?

原因很简单,因为单纯使用JDBC进行开发会出现效率低下、耗费资源及影响程序拓展性等问题。

JDBC基本用法及问题分析

package com.lwl.test;

import com.lwl.pojo.User;
import com.mysql.jdbc.PreparedStatement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCTest {


        public static final String URL = "jdbc:mysql://192.168.2.134:3306/lagou";
        public static final String USER = "root";
        public static final String PASSWORD = "root";

        public static void main(String[] args) throws Exception {
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
            User user = new User();

            try {
                // 加载数据库驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 获取数据库连接
                connection = DriverManager.getConnection(URL, USER, PASSWORD);
                // 定义sql语句
                String selectSql = "select * from user where username = ?";
                // 获取预处理statement
                preparedStatement = (PreparedStatement) connection.prepareStatement(selectSql);
                // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
                preparedStatement.setString(1, "王麻子");
                // 向数据库发出sql执行查询,查询出结果集
                resultSet = preparedStatement.executeQuery();
                // 遍历查询结果集
                while (resultSet.next()) {
                    int id = resultSet.getInt("id");
                    String username = resultSet.getString("username");
                    // 封装User
                    user.setId(id);
                    user.setUsername(username);
                }
                System.out.println(user);

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 释放资源
                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();
                    }
                }
            }
        }
}

运行结果

"C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:64450,suspend=y,server=n -javaagent:C:\Users\lwl\.IntelliJIdea2019.3\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Users\lwl\IdeaProjects\Ipersistence_test\target\test-classes;C:\Users\lwl\IdeaProjects\Ipersistence_test\target\classes;D:\repository\com\lwl\Ipersistence\1.0-SNAPSHOT\Ipersistence-1.0-SNAPSHOT.jar;D:\repository\mysql\mysql-connector-java\5.1.17\mysql-connector-java-5.1.17.jar;D:\repository\c3p0\c3p0\0.9.1.2\c3p0-0.9.1.2.jar;D:\repository\log4j\log4j\1.2.12\log4j-1.2.12.jar;D:\repository\junit\junit\4.10\junit-4.10.jar;D:\repository\org\hamcrest\hamcrest-core\1.1\hamcrest-core-1.1.jar;D:\repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\repository\xml-apis\xml-apis\1.0.b2\xml-apis-1.0.b2.jar;D:\repository\jaxen\jaxen\1.1.6\jaxen-1.1.6.jar;C:\Users\lwl\IdeaProjects\Ipersistence\target\classes;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar" com.lwl.test.JDBCTest
Connected to the target VM, address: '127.0.0.1:64450', transport: 'socket'
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
User{id=1, username='王麻子'}
Disconnected from the target VM, address: '127.0.0.1:64450', transport: 'socket'

Process finished with exit code 0

问题分析

在这里插入图片描述

为什么要用Mybatis?

针对JDBC存在的问题,来解释一下为什么要使用Mybatis:

Mybatis使用配置文件加载数据库配置信息,很好地解决了硬编码问题。
对于创建和释放数据库连接等步骤,Mybatis直接使用连接池进行解决。
针对“sql语句、设置参数及获取结果集参数均存在硬编码”的问题,Mybatis也使用配置文件解决了该问题。(这里一般不和数据库配置信息在同一个配置文件中进行配置,因为数据库配置信息在一个项目中只配置一次,但sql语句等经常会发生变化)。
对于结果集的封装操作,Mybatis使用反射和内省进行解决。
以上几点说明了用Mybatis的好处,不过Mybatis其实也只是对JDBC进行了封装,说到底原理还是和JDBC一样,只是Mybatis用起来更加高效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章