JavaWeb 笔记 6 Servlet + JDBC
数据库操作
这里以 MySQL Workbench 为例
创建数据库
打开你的 MySQL 实例,在 Schemas 窗口中的空白位置右键,Create Schema
将其命名为自定义的数据库名。他的字符集设置为 utf8,utf8_general_ci
然后在 Schemas 窗口中,点击刚刚创建的数据库的 🔽 符号展开数据库。
创建数据表
右键 Tables,点击 Create Table,
在里面自定义表名,数据库字段。初学者先直接用鼠标操作。表名需要为小写
- Column Name 字段名
- 数据库里不区分大小写,但是好习惯是字段名为大驼峰
- Datatype 数据类型
- INT 整数型
- VARCHAR() 可伸缩长度类型,可回收多余
- CHAR 不会自动回收
- PK - Primary Key 主键
- NN - Not Null 非空
- UQ - Unique 独特(这个数据只能在整张表同一列中出现一次)
- B - Binary 二进制
- UN - Unsigned 无标号
- ZF - Zero Fill 填充零
- AI - Auto Increment 自增
- G - Generated
- Default / Expression 默认值
通常在 Column Name 中输入特定的字段,系统会智能的帮你设定成所需的约束:
- UserId
- Datatype = INT
- Primary Key
- Not Null
Auto Increment 可以通过 Default / Expression 设置初始值,而每次增长多少位则需要使用 SQL 语句。
设置完了之后,点击 Apply 保存
这时候点开 Tables 的 🔽 符号,可以看到我们刚刚创建的表。
打开表
右键点击 Select Rows,可以显示表的数据。
修改表
右键点击 Alter Table,可以对表的结构进行修改
修改数据库可以保存中文
首先打开 MySQL Command Line Client(就是 MySQL 的终端程序),输入数据库密码。
在第一行输入 show variables like '%char%';
,它会返回一张表。上面是数据库编码。
+--------------------------+--------------------------------------+ |
我们要做的是把所有不是 utf8 的字符集全部改成 utf8 除了 binary 和那行路径。
SET character_set_client = "utf8"; |
最后得出结果
+--------------------------+--------------------------------------+ |
最后,在 每次的 doGet 或者 doPost(反正你要操作数据库的时候) 在函数开始加上以下两行代码:
request.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 |
2. 建立连接
DriverManager.getConnection 方法需要 try catch 代码块
String url = "jdbc:mysql://localhost:3306/session1"; // 被起来吧,最后是数据库名 |
写 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"; // 被起来吧,最后是数据库名 |
4. 执行查询
这不是个固定写法,分为查询和增删改两个不同的操作
第四步也需要放在第二步的 try catch 代码块里执行
增删改
executeUpdate() 函数,返回值类型:返回数据库受影响行数,0 = 失败,非 0 = 成功。
String url = "jdbc:mysql://localhost:3306/session1"; // 被起来吧,最后是数据库名 |
查
executeQuery() 函数,返回值类型 ResultSet 结果集,需要导包。它是数据集对象,代表查询的结果。rs.next() true 代表成功,false 代表失败
String url = "jdbc:mysql://localhost:3306/session1"; |
5. 结果处理
因情况而异
增删改
String url = "jdbc:mysql://localhost:3306/session1"; |
查
rs.next() 表示指向下一个。指针的概念,将他的光标指向下一行数据。从查询结果的第 0 行开始。所以第一次调用 next,会指向第一行数据。
如果第一行有数据,则返回 true。通常用这个特性来判断是否查询成功。
String url = "jdbc:mysql://localhost:3306/session1"; |
6. 关闭链接释放资源
先开后关
Java 也有 Garbage Collection 垃圾回收机制,但是只有在内存不够的时候,虚拟机才会去回收
增删改
String url = "jdbc:mysql://localhost:3306/session1"; |
查
ResultSet 集合需要关闭以释放资源。
String url = "jdbc:mysql://localhost:3306/session1"; |