JavaWeb笔记(1)-JavaWeb概述与JDBC

JavaWeb 概述

JavaWeb,就是使用Java技术栈来解决Web互联网领域相关问题的技术栈,简单来说就是利用Java来搭建网站。而搭建网站大体的框架可以分成三部分,前端页面,后端程序以及数据库,而JavaWeb部分也就主要由这三部分组成。前端页面的知识主要包括前端三大件,相关框架等;数据库的知识主要指的是利用Java程序来连接数据库,相关知识点有JDBC等;后端程序即JavaWeb程序,为内容核心,包括Tomcat、Servlet、JSP等,后续会展开详细说明。

JDBC

简介

JDBC,全称为Java DataBase Connectivity,Java数据库连接。它是Java语言用来操作关系型数据库的一套API,是由sun公司定义的一套标准接口,而它的实现类,这里也称作驱动,则由各个数据库公司来提供,这样达到的效果就是利用同一套Java代码,就可以操作不同的关系型数据库,只需要变更底层的数据库驱动即可。

  • JDBC是由sun公司定义的一套操作关系型数据库的规则,也即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 程序员利用JDBC进行编程,而真正指定的底层代码是驱动jar包中的相关类

快速入门

利用JDBC访问数据库的操作基本上可以分成下面的步骤,我们通过一个快速入门程序来进行说明。当然在书写程序之前,我们需要准备好相关的数据库驱动jar包,并将其引入到项目中

数据库驱动jar包可以利用Maven Repository: Search/Browse/Explore (mvnrepository.com)下载。之后将其引入项目,在项目目录下新建lib目录,将驱动jar包加入该目录下方便管理,然后将其添加为library,对应Add as Library,之后需要选定作用范围,视情况而选择

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
// 1. 反射注册驱动(新版本无需此步)
// Class.forName("com.mysql.jdbc.Driver");

// 2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/web_test";
String username = "root";
String password = "******";
Connection connection = DriverManager.getConnection(url, username, password);

// 3. 定义SQL
String sql = "select * from paints";

// 4. 获取执行SQL的对象 Statement
Statement statement = connection.createStatement();

// 5. 执行SQL
ResultSet resultSet = statement.executeQuery(sql);

// 6. 结果处理
while (resultSet.next()) {
String book = resultSet.getString("书名");
String author = resultSet.getString("作者");
long isbn = resultSet.getLong("ISBN");
System.out.println(book + "\t" + author + "\t" + isbn);
}

// 7. 资源释放
resultSet.close();
statement.close();
connection.close();

通过这个快速入门代码,我们也可以看出JDBC的一些缺点,例如硬编码,包括注册驱动、获取连接、用户名、密码、SQL语句等都需要写在代码中,不够灵活;例如操作繁琐,它需要我们手动设置参数,手动封装结果集等等,比较麻烦。后面我们会学习一些优秀的框架,它们可以用来简化JDBC的开发。

API详解

DriverManager

DriverManager即驱动管理类,这是一个工具类,提供了许多静态方法。我们主要利用其中的getConnection来获取数据库连接,完整的方法包括了三个必要的参数:

1
public static Connection getConnection(String url, String user, String password) throws SQLException
  • url:连接路径
    • 路径语法如下:jdbc:mysql://域名:端口号/数据库名称?参数键值对1&参数键值对2...
  • user:用户名
  • password:密码

Connection

Connection即数据库连接对象,它主要的作用包括获取执行SQL的对象Statement,以及进行事务的管理。

通过Connection对象的createStatement()方法可以获取执行SQL的对象(后面会提到又分为普通的Statement对象以及防止SQL注入的PreparedStatement等),相关的SQL语句都需要通过Statement对象来进行执行。

Connection对象同样还负责事务管理,主要通过下面的三个方法来完成:

  • setAutoCommit():设置事务提交模式,如果是希望手动管理事务,则需要将自动提交事务设置为false
  • commit():事务提交
  • rollback():事务回滚

在JDBC程序中,事务管理一般都与异常处理机制配合使用,如果在事务执行的过程中有异常出现,就执行事务回滚操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 已经获得Connection对象,conn
try {
// 开启事务
conn.setAutoCommit(false);

// 事务相关操作...

// 事务提交
conn.commit();
} catch (Exception e){
// 事务回滚
conn.rollback();
e.printStackTrace();
}

Statement

Statement对象,它的作用就是用来执行SQL语句。对象可以调用的方法有很多,分别对应了不同类型的SQL语句:

  • 执行DDL、DML语句:返回结果表示影响的行数
  • 执行DQL语句:返回ResultSet对象,是对查询结果的封装

PreparedStatement

PreparedStatement相比Statement,它完成的是预编译SQL语句并执行,可以防止SQL注入问题。每一个PreparedStatement对象都对应一个事先写好的SQL,这个SQL描述了后续执行的一系列SQL语句的模式,其中利用?进行占位,并利用程序说明对应位置的对应参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SQL模式
String sql = "select * from user where username = ? and password = ?";

// 获取PreparedStatement对象
PreparedStatement preparedStatement = conn.prepareStatement(sql);

// 设置对应位置的对应值,按照顺序index从1开始
String name = "test";
String pwd = "123123";
preparedStatement.setString(1, name);
preparedStatement.setString(2, pwd);

// sql执行
preparedStatement.executeQuery();
  • PreparedStatement防止SQL注入的原理主要是将特殊字符进行转移,防止字符串拼接时导致的逻辑错误
  • 另一方面,由于每一个PreparedStatement对象后续执行的都是相同模式的SQL语句,因此它可以完成SQL的预编译,提高性能。当然这个功能需要在连接的时候设置键值对参数来开启预编译功能useServerPrepStmts=true

ResultSet

ResultSet对象,它是Java对SQL查询语句返回结果的封装,它有如下两类重要方法:

  • boolean next()
    • 判断当前行是否为有效行,并进行行光标的移动
  • xxx getXxx(arg)
    • 表示从当前行获取相应的列数据
    • xxx表示当前列的类型
    • arg表示传入参数,可以是列的整型index编号(从1开始),也可以是列的String名称

可以将ResultSet看作是一个对行的迭代器,它的相关遍历操作有下面的模板:

1
2
3
4
5
6
7
// 已经获得ResultSet对象,名称为res
while(res.next()){
// 获取数据
int id = res.getInt("id");
String name = res.getString("name");
// 其他相关操作
}

数据库连接池

如果我们每次进行相关查询都创建一个新的Connection对象,使用完毕之后就将其销毁,那么性能就会因为连接对象的重复创建和销毁而大大消耗。池化则是一种很好的资源管理方式,数据库连接池就是用来实现Connection对象复用的池化技术。

Java官方提供了数据库连接池的标准接口DataSource,其他第三方组织实现这个接口,来提供数据库连接池的相关功能。接口中定义的获取连接的方法如下,前面我们是通过DriverManager来获取Connection对象,而更好的方法则是通过数据库连接池来获取Connection对象。

1
Connection getConnection();

常见的数据库连接池有DBCP、C3P0、Druid等,其中Druid连接池是阿里巴巴开源的数据库连接池项目,它的功能强大,性能优秀,是比较好的数据库连接池之一。


JavaWeb笔记(1)-JavaWeb概述与JDBC
http://example.com/2022/10/04/JavaWeb笔记-1-JavaWeb概述与JDBC/
作者
EverNorif
发布于
2022年10月4日
许可协议