在最开始的数据库设计章节 我们已经提到过,我们想要和 mysql 进行交互,首先重要的事情是 建立数据通路 ,如果你看过 《图解TCP/IP》的章节,应该知道,这个数据通路就是TCP连接。
建立了连接以后,如何进行通信呢?mysql 自定义了数据交互的格式也就是 帧格式
,并且定义了通信协议的交互过程,我们的程序需要按照 mysql 规定好的规章制度才能够正确的读写数据。
看到图中麻烦的交互过程我们不禁烦躁,不忘初心方能始终。我们的初心就是从数据库中读写数据,Mysql命令行客户端里面,我们只要运行一些 sql
语句就行了。但是这里还要处理这么麻烦的东西,完全偏离了我们的关注点。这样下去什么项目也做不成了。
万幸的是,我们拥有 JDBC
这个好东西,他可以把上图简化成下图的过程,即我们只要关注 sql 语句就行了。
也就是说 JDBC 帮我们完成通信过程的处理,通信协议的处理。所以我们要在 java 中直接使用 JDBC 来和数据库通信。典型的过程代码如下:
// 在 pom.xml中添加 mysql驱动依赖库
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
public static void main(String[] args) throws Exception {
// 将JDBC驱动加载到DriverManager
Class.forName("com.mysql.jdbc.Driver");
// 从DriverManager处获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://数据库ip/数据库名称",
"账号",
"密码" );
// The object used for executing a static SQL statement and returning the results it produces. 也就是创建出执行sql语句的对象
Statement st = conn.createStatement();
// 只查找一行数据
ResultSet rs = st.executeQuery("SELECT id, username, password FROM sys_user LIMIT 1");
SysUser user = new SysUser();
// 遍历每一行数据
while (rs.next()) {
user.setId(rs.getString("id"));
user.setName(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
System.out.println(user.toString());
rs.close();
st.close();
conn.close();
其中,SysUser类如下:
@Data
public class SysUser {
private String id;
private String name;
private String password;
}
程序的输出是:
SysUser(id=1140466515787780089, name=admin, password=9d947539b4374770df2a52f6e357829d3e625cd78bc05451218e7b5b3361000b)
可以看到,这就是把数据库的数据信息映射到了后端程序对象上。下面我们再稍微看下上述程序。
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口
– 引自维基百科
接口就是规范,我们说JDBC帮助我们做了那么多,实际上他并没有帮助我们处理连接数据库,协议转换之类的。这些功能都是数据库驱动帮助做的,也就是我们引入的 mysql-connector-java
包。JDBC在这中间的层次结构如图所示:
最下层是各种数据库,所以只要实现了JDBC规范的驱动接口,都可以被java集成进来直接使用。对于上述程序中的使用过程中涉及到的各种对象,这里不再详细赘述,网上有很多好的资料,比如这篇 博客 ,讲的蛮清晰的。
我们这里关注的核心是 后端如何理解数据库的信息
, 其实上述代码里面,最后的 ResultSet
里面保存的就是每行数据的信息,我们就如同上述程序一样,将其一一拷贝到相关对象里面就可以了。
但是,这样子也太麻烦了,而且上文还只是静态SQL,都没加 where
语句,也没有执行复杂查询,也没有执行插入操作。感兴趣的可以试试看,如何执行这些东西,网上很多说明的。
那我们该怎么办?
我们需要一个工具,它能够把 ResultSet 中的信息自动映射到对象上,也能够把对象中的信息映射到 SQL 语句中的参数上。
这种工具,我们叫做 ORM 框架
。ORM 也即:Object Relational Mapping ,对象关系映射。这样的框架在前文的java后端开发(三):开发框架解读 中已经提到了,就是:
- mybatis
- hibernate
我们使用 mybatis 框架来做。那么加入 mybatis 以后,结构就变成了:
所以呢,在我们的 maven 工程,也即 pom.xml 里面,不仅要引入上文的 mysql-connector-java
,还要引入 mybatis
依赖包。
至于图中的数据库连接池,我们先暂时忽略。加入 mybatis 以后呢,数据映射就变得简单多了。基本原理还是上述代码所示,所以这点大家心里要清楚。
接下来,我们后续会进行:
- mybatis的使用
- 整个 web 开发框架的总体结构,从一个全面的视角来考察
- 数据库连接池的说明
- mybatis-plus 的使用,完全解放基础CURD的生产力