数据库操作

这里以 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) {
// 异常处理
}