Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?

前言

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

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

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

JDBC基本用法及问题分析

首先来看一下使用JDBC对数据库进行访问的一段代码:

1 import java.sql.*;

2

3 public class JDBCTest {

4

5 public static final String URL = "jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";

6 public static final String USER = "root";

7 public static final String PASSWORD = "root";

8

9 public static void main(String[] args) throws Exception {

10 Connection connection = null;

11 PreparedStatement preparedStatement = null;

12 ResultSet resultSet = null;

13 User user = new User();

14

15 try {

16 // 加载数据库驱动

17 /* 注意事项:

18 1、这里需要提前找好mysql驱动的jar包,复制到项目库中,或者直接通过maven导入。

19 2、注意jar包版本要与本机的mysql一致。

20 没有做到以上两点必然会报错。*/

21 Class.forName("com.mysql.cj.jdbc.Driver");

22 // 获取数据库连接

23 connection = DriverManager.getConnection(URL, USER, PASSWORD);

24 // 定义sql语句

25 String selectSql = "select * from user where username = ?";

26 // 获取预处理statement

27 preparedStatement = connection.prepareStatement(selectSql);

28 // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值

29 preparedStatement.setString(1, "hardy");

30 // 向数据库发出sql执行查询,查询出结果集

31 resultSet = preparedStatement.executeQuery();

32 // 遍历查询结果集

33 while (resultSet.next()) {

34 int id = resultSet.getInt("id");

35 String username = resultSet.getString("username");

36 // 封装User

37 user.setId(id);

38 user.setUsername(username);

39 }

40 System.out.println(user);

41

42 } catch (Exception e) {

43 e.printStackTrace();

44 } finally {

45 // 释放资源

46 if (resultSet != null) {

47 try {

48 resultSet.close();

49 } catch (SQLException e) {

50 e.printStackTrace();

51 }

52 }

53

54 if (preparedStatement != null) {

55 try {

56 preparedStatement.close();

57 } catch (SQLException e) {

58 e.printStackTrace();

59 }

60 }

61

62 if (connection != null) {

63 try {

64 connection.close();

65 } catch (SQLException e) {

66 e.printStackTrace();

67 }

68 }

69 }

70 }

71 }

代码运行结果:

观察上述代码,不难发现以下问题:

数据库配置信息存在硬编码问题。(当我们从mysql数据库切换到oracle数据库时,代码中的数据驱动信息和数据库连接信息都需要修改。)

需要频繁创建和释放数据库连接。

sql语句、设置参数及获取结果集参数均存在硬编码问题。(不同数据库的sql语法,参数及结果集参数均有所不同)

需要手动封装返回结果集。

为什么要用Mybatis?

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

Mybatis使用配置文件加载数据库配置信息,很好地解决了硬编码问题。

对于创建和释放数据库连接等步骤,Mybatis直接使用连接池进行解决。

针对“sql语句、设置参数及获取结果集参数均存在硬编码”的问题,Mybatis也使用配置文件解决了该问题。(这里一般不和数据库配置信息在同一个配置文件中进行配置,因为数据库配置信息在一个项目中只配置一次,但sql语句等经常会发生变化)。

对于结果集的封装操作,Mybatis使用反射和内省进行解决。

以上几点说明了用Mybatis的好处,不过Mybatis其实也只是对JDBC进行了封装,说到底原理还是和JDBC一样,只是Mybatis用起来更加高效率。