我们在数据库设计章节的最开始就提到过,如果要和MySQL进行交互,首先重要的就是建立一条数据通路,如果你看过《图解TCP/IP》那一章的话,应该知道这条数据通路就是TCP连接。
连接建立之后,如何进行通讯呢?MySQL定义了数据交换的格式也就是帧格式,定义了通讯协议的交互流程,我们的程序需要遵循MySQL规定的规章制度,才能正确的读写数据。
看到图中复杂的交互流程,我们不禁有些恼火,唯有牢记初心,才能坚持下去。我们的初衷是从数据库读写数据,在Mysql命令行客户端,我们只需要运行一些SQL语句就可以了。然而,我们在这里却要处理这么复杂的事情,这完全偏离了我们的重点。如果再这样下去,我们将无法完成任何项目。
幸好我们有JDBC,它可以把上图简化成下图的过程,也就是我们只需要关注SQL语句就可以了。
也就是说JDBC帮我们完成了通信过程以及通信协议的处理。所以我们需要在Java中直接使用JDBC来与数据库进行通信。典型的过程代码如下:
// 在 pom.xml中添加 mysql驱动依赖库 <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.47version> 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类如下:
@Datapublic class SysUser { private String id; private String name; private String password;}
该程序的输出是:
SysUser(id=1140466515787780089, name=admin, password=9d947539b4374770df2a52f6e357829d3e625cd78bc05451218e7b5b3361000b)
可以看到,这就是将数据库数据信息映射到后端程序对象上。我们来仔细看一下上面的程序。
Java 数据库连接 (JDBC) 是 Java 语言中的应用程序编程接口,用于指定客户端程序如何访问数据库。
– 引自维基百科
接口就是规范,我们说JDBC帮我们做了那么多,其实它并没有帮我们连接数据库,转换协议等等,这些功能都是由数据库驱动,也就是我们引入的mysql-connector-java包来完成的,这中间JDBC的层次结构如图所示:
最底层就是各种数据库了,所以只要实现了JDBC规范的驱动接口,就可以集成到Java中直接使用。对于上面程序使用过程中涉及到的各种对象,这里就不细说了,网上有很多不错的资料,比如这篇博客,讲的挺清楚的。
这里我们关心的核心是后端如何理解数据库的信息,其实上面代码中,最终的ResultSet中保存的是每行数据的信息,我们只要像上面程序一样,将它们一一复制到相关对象中就可以了。
但是这样太麻烦了,而且上面只是静态SQL,没有添加where语句,没有执行任何复杂查询,也没有执行任何插入操作。有兴趣的可以尝试一下,具体如何执行这些东西网上有很多说明。
那么我们该怎么办呢?
我们需要一个工具,可以自动将ResultSet中的信息映射到对象,也可以将对象中的信息映射到SQL语句中的参数。
我们把这种工具称为ORM框架,ORM的意思是Object Relational Mapping,在之前的文章《Java后端开发(三):开发框架解读》中提到过这种框架,具体为:
我们采用mybatis框架来实现,添加mybatis之后结构变成:
因此在我们的Maven项目也就是pom.xml中,除了需要导入上面提到的mysql-connector-java,还需要导入mybatis的依赖包。
至于图中的数据库连接池,我们暂时先忽略,加上mybatis之后,数据映射就简单多了,基本原理还是如上代码所示,这个大家应该都清楚了。
接下来我们将继续:
mybatis的使用整个web开发框架的整体结构,从全方位的角度审视数据库连接池的描述mybatis-plus的使用,彻底解放了基础CURD的生产力