哪里可能一天!好好复习啊!

MyBatis简介

1.1 传统的JDBC编程

Java程序都是通过JDBC(Java Database Connectivity)连接数据库的。JDBC是一种规范,用来适配各种类型的数据库。不过JDBC只定义了接口规范,具体的实现是交给数据库厂商去实现的,JDBC是一种典型的桥接模式。

下面是一个传统的使用JDBC进行数据库连接并查询数据的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package cn.vidorra.todo;

import cn.vidorra.todo.pojo.TodoListEntity;

import java.sql.*;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author ROYIANS
* @date 2020/2/7 20:10
*/
public class JDBCExample {
private Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/vidorra?serverTimezone=PRC&useUnicode=true&characterEncoding=utf8&useSSL=false";
String user = "root";
String password = "123456";
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException | SQLException e) {
Logger.getLogger(JDBCExample.class.getName()).log(Level.SEVERE, null, e);
return null;
}
return connection;
}

public TodoListEntity getTodo(Long id) {
Connection connection = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "select * from todo_list where id = ?";
ps = Objects.requireNonNull(connection).prepareStatement(sql);
ps.setLong(1, id);
rs = ps.executeQuery();
if (rs.next()) {
long todoID = rs.getLong("id");
long todoUID = rs.getLong("uid");
String todoContents = rs.getString("contents");
byte todoStatus = rs.getByte("status");
int todoCreateTime = rs.getInt("create_time");
int todoUpdateTime = rs.getInt("update_time");

return new TodoListEntity(
todoID,
todoUID,
todoContents,
todoStatus,
todoCreateTime,
todoUpdateTime
);
}
} catch (SQLException e) {
Logger.getLogger(JDBCExample.class.getName()).log(Level.SEVERE, null, e);
} finally {
this.close(rs, ps, connection);
}
return null;
}

private void close(ResultSet rs, Statement stmt, Connection connection) {
try {
if (rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
Logger.getLogger(JDBCExample.class.getName()).log(Level.SEVERE, null, e);
}

try {
if (stmt != null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
Logger.getLogger(JDBCExample.class.getName()).log(Level.SEVERE, null, e);
}

try {
if (connection != null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
Logger.getLogger(JDBCExample.class.getName()).log(Level.SEVERE, null, e);
}
}

public static void main(String[] args) {
JDBCExample example = new JDBCExample();
TodoListEntity entity = example.getTodo(1L);
System.err.println("todo => " + entity.toString());
}
}

使用JDBC操作数据库大致分为以下几步:

  • 使用JDBC编程需要连接数据库,注册驱动和数据库信息。
  • 操作Connection,打开Statement对象
  • 通过Statement执行SQL,返回结果岛ResultSet对象。
  • 使用ResultSet读取数据,然后通过代码转化为具体的POJO对象。
  • 关闭数据库相关资源。

使用传统的JDBC方式存在的弊端:

  • 工作量相对较大。
  • 对JDBC编程中可能产生的异常,我们需要进行捕捉处理并正确关闭资源。

对于一个简单的SQL在JDBC中都如此复杂,很快这种模式就被ORM模型取代了,所有的ORM模型都是基于JDBC进行封装的,不同的ORM模型对JDBC封装的强度是不一样的。

1.2 ORM模型

ORM(Object Relational Mapping),对象关系映射。ORM模型就是数据库的表和POJO的映射关系模型,主要解决了数据库数据和POJO对象的相互映射。我们通过

MyBatis入门

配置

映射器

动态SQL

MyBatis的解析和运行原理

插件

MyBatis-Spring

实用的场景