后端开发详解:概念、职责与技术栈

发表时间: 2024-06-19 14:06

我们在数据库设计章节的最开始就提到过,如果要和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的生产力