数据库操作

这里以 MySQL Workbench 为例

创建数据库

打开你的 MySQL 实例,在 Schemas 窗口中的空白位置右键,Create Schema

将其命名为自定义的数据库名。他的字符集设置为 utf8,utf8_general_ci

然后在 Schemas 窗口中,点击刚刚创建的数据库的 🔽 符号展开数据库。

创建数据表

右键 Tables,点击 Create Table,

在里面自定义表名,数据库字段。初学者先直接用鼠标操作。表名需要为小写

  1. Column Name 字段名
    1. 数据库里不区分大小写,但是好习惯是字段名为大驼峰
  2. Datatype 数据类型
    1. INT 整数型
    2. VARCHAR() 可伸缩长度类型,可回收多余
    3. CHAR 不会自动回收
  3. PK - Primary Key 主键
  4. NN - Not Null 非空
  5. UQ - Unique 独特(这个数据只能在整张表同一列中出现一次)
  6. B - Binary 二进制
  7. UN - Unsigned 无标号
  8. ZF - Zero Fill 填充零
  9. AI - Auto Increment 自增
  10. G - Generated
  11. Default / Expression 默认值

通常在 Column Name 中输入特定的字段,系统会智能的帮你设定成所需的约束:

  1. UserId
    1. Datatype = INT
    2. Primary Key
    3. Not Null

Auto Increment 可以通过 Default / Expression 设置初始值,而每次增长多少位则需要使用 SQL 语句。

设置完了之后,点击 Apply 保存

这时候点开 Tables 的 🔽 符号,可以看到我们刚刚创建的表。

打开表

右键点击 Select Rows,可以显示表的数据。

修改表

右键点击 Alter Table,可以对表的结构进行修改

修改数据库可以保存中文

首先打开 MySQL Command Line Client(就是 MySQL 的终端程序),输入数据库密码。

在第一行输入 show variables like '%char%';,它会返回一张表。上面是数据库编码。

+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server |
8.0\share\charsets\ |
+--------------------------+--------------------------------------+

我们要做的是把所有不是 utf8 的字符集全部改成 utf8 除了 binary 和那行路径。

SET character_set_client = "utf8";
SET character_set_connection = "utf8";
SET character_set_database = "utf8";
SET character_set_results = "utf8";
SET character_set_server = "utf8";
SET character_set_system = "utf8";
show variables like '%char%';

最后得出结果

+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | utf8mb3 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | utf8mb3 |
| character_set_system | utf8mb3 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server |
8.0\share\charsets\ |
+--------------------------+--------------------------------------+

最后,在 每次的 doGet 或者 doPost(反正你要操作数据库的时候) 在函数开始加上以下两行代码:

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

JAVA JDBC 编程

JDBC 数据库操作的步骤,在 doGet 或 doPost 方法写上以下代码

1. 注册驱动程序

加载待连接数据库的驱动到 JVM 里

先下载驱动 https://dev.mysql.com/downloads/connector/j/ ,在这个链接中,下拉框选择 Platform Independent,然后选择 Platform Independent (Architecture Independent), ZIP Archive 下载

解压之后,找到 mysql-connector-java-8.0.26.jar 包,把这个包拖到我们的项目中 src/main/webapp/WEB-INF/lib 文件夹里

写上注册驱动程序的代码,Class.forName 方法需要 try catch 代码块

String driver = "com.mysql.cj.jdbc.Driver"; // MySQL 8.0 要加上 cj
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// 异常处理
}

2. 建立连接

DriverManager.getConnection 方法需要 try catch 代码块

String url = "jdbc:mysql://localhost:3306/session1"; // 被起来吧,最后是数据库名
try {
Connection conn = DriverManager.getConnection(url, "root", "123456"); // 数据库链接,数据库用户名,密码
} catch (SQLException e) {
// 异常处理
}

写 Connection 的时候,使用代码提示导入 java.sql.Connection 包,DriverManager 要导入 java.sql.DriverManager 包。

3. 创建 PreparedStatement 对象(预处理 SQL 语句)

PreparedStatement 一样需要导入 java.sql.PreparedStatement

因为 conn 变量的作用域在 try catch 代码块里,所以我们将第三步放在第二步的 try catch 代码块里执行
然后我们要在 doGet 或者 doPost 函数的最外层给它声明一个 String sql = “”; 用来存放我们的 SQL 语句。这个语句的作用域在整个函数中。

String url = "jdbc:mysql://localhost:3306/session1"; // 被起来吧,最后是数据库名
try {
Connection conn = DriverManager.getConnection(url, "root", "123456"); // 数据库链接,数据库用户名,密码

PreparedStatement pstmt = conn.prepareStatement(sql);
} catch (SQLException e) {
// 异常处理
}

4. 执行查询

这不是个固定写法,分为查询和增删改两个不同的操作
第四步也需要放在第二步的 try catch 代码块里执行

增删改

executeUpdate() 函数,返回值类型:返回数据库受影响行数,0 = 失败,非 0 = 成功。

String url = "jdbc:mysql://localhost:3306/session1"; // 被起来吧,最后是数据库名
try {
Connection conn = DriverManager.getConnection(url, "root", "123456"); // 数据库链接,数据库用户名,密码

PreparedStatement pstmt = conn.prepareStatement(sql);

int result = pstmt.executeUpdate();
} catch (SQLException e) {
// 异常处理
}

executeQuery() 函数,返回值类型 ResultSet 结果集,需要导包。它是数据集对象,代表查询的结果。rs.next() true 代表成功,false 代表失败

String url = "jdbc:mysql://localhost:3306/session1";
try {
Connection conn = DriverManager.getConnection(url, "root", "123456");

PreparedStatement pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();
} catch (SQLException e) {
// 异常处理
}

5. 结果处理

因情况而异

增删改

String url = "jdbc:mysql://localhost:3306/session1";
try {
Connection conn = DriverManager.getConnection(url, "root", "123456");

PreparedStatement pstmt = conn.prepareStatement(sql);

int result = pstmt.executeUpdate();

if (result >= 1) {
// 操作成功
response.getWriter.append("亲,注册成功");
} else {
// 操作失败
response.getWriter.append("亲,注册失败");
}
} catch (SQLException e) {
// 异常处理
}

rs.next() 表示指向下一个。指针的概念,将他的光标指向下一行数据。从查询结果的第 0 行开始。所以第一次调用 next,会指向第一行数据。

如果第一行有数据,则返回 true。通常用这个特性来判断是否查询成功。

String url = "jdbc:mysql://localhost:3306/session1";
try {
Connection conn = DriverManager.getConnection(url, "root", "123456");

PreparedStatement pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

if (rs.next()) {
response.getWriter.append("亲,登录成功");
} else {
response.getWriter.append("亲,登录失败");
}
} catch (SQLException e) {
// 异常处理
}

6. 关闭链接释放资源

先开后关
Java 也有 Garbage Collection 垃圾回收机制,但是只有在内存不够的时候,虚拟机才会去回收

增删改

String url = "jdbc:mysql://localhost:3306/session1";
try {
Connection conn = DriverManager.getConnection(url, "root", "123456");

PreparedStatement pstmt = conn.prepareStatement(sql);

int result = pstmt.executeUpdate();

if (result >= 1) {
// 操作成功
response.getWriter.append("亲,注册成功");
} else {
// 操作失败
response.getWriter.append("亲,注册失败");
}

pstmt.close();
conn.close();
} catch (SQLException e) {
// 异常处理
}

ResultSet 集合需要关闭以释放资源。

String url = "jdbc:mysql://localhost:3306/session1";
try {
Connection conn = DriverManager.getConnection(url, "root", "123456");

PreparedStatement pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

if (rs.next()) {
response.getWriter.append("亲,登录成功");
} else {
response.getWriter.append("亲,登录失败");
}

rs.close
pstmt.close();
conn.close();
} catch (SQLException e) {
// 异常处理
}