数据库操作
这里以 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%';,它会返回一张表。上面是数据库编码。
+--------------------------+--------------------------------------+ | 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" ; 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) { }