目录
客户端操作 MySQL 数据库的三种方式:
1)使用第三方客户端来访问,如 Navicat;
2)使用命令行操作;
3)通过 Java 来访问 (即下面介绍内容);
1. 什么是 JDBC
JDBC ( Java Database Connectivity )Java 语言连接数据库。
JDBC 是 SUN 公司制定的一套接口,是 Java 访问数据库的标准规范,真正操作数据库需要具体的实现类,也就是数据库驱动(许多个 .class 文件打成 jar 包形式)。数据库驱动由数据库厂商提供,不同数据库驱动不一样(使用时需到对应官网下载)但程序员只需会调用 JDBC 接口中的方法即可。
好处:面向接口编程,面向抽象编程,使用同一套 Java 代码,进行少量修改就可以访问其他数据库。
2. JDBC 编程步骤
2.1 装载相应数据库的 JDBC 驱动并进行初始化
- 导入所需的 jar 包(官网下载)
java 项目在导入 jar 包之前,外部库中只有 jdk
找到对应 jar 包并点击 OK 如果没有导包成功,将会发生 ClassNotFoundException 异常错误。
- 初始化驱动
Class.forName 是把这个类加载到 JVM 中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
try{
Class.forName("com.mysql.cj.jdbc.Driver");//初始化驱动
}
catch(Exception e){
e.printStackTrace();
}
2.2 建立 JDBC 和数据库之间的 Connection 连接
Connection con;
String url = "jdbc:mysql://127.0.0.1:3306/example?useUnicode=true&characterEncoding=utf8&useSSL=false&
serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&allowMultiQueries=true";
String user="root";
String password="root";
try{
con= DriverManager.getConnection(url,user,password);
//获取连接
}
catch (SQLException e){
e.printStackTrace();
}
这里需要提供 url,用户名和密码
- 连接数据库的 URL 地址格式
协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值
MySQL 中可以简写:jdbc:mysql: ///数据库名
前提:必须是本地服务器,端口号是 3306
localhost --> 127.0.0.0.1
2.3 用 Connection 获取 Statement 对象
Connection 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。
try{
Statement stmt = con.createStstement();//创建查询对象
}
catch( SQLException e ){
e.printStackTrace();
}
2.4 使用 Statement 对象执行 SQL 语句
Statement 代表一条语句对象,用于发送语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。
int executeUpdate(String sql) //executeQuery 用于发送 select 语句
用于发送 DML 语句,增删改的操作,insert、update delete
参数:SQL 语句
返回值:返回对数据库影响的行数
PreparedStatement
预处理语句,也就是 PreparedStatement(String sql ) ,对参数 sql 指定的 SQL 语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在 PreparedStatement 对象中,减轻了数据库的负担,而且也提高了访问数据库的速度。
2.5 返回结果
ResultSet executeQuery(String sql)
用于发送 DQL 语句,执行查询的操作 select
参数:SQL 语句
返回值:查询的结果集
2.6 释放资源
-
需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
-
释放原则:先开的后关,后开的先关。ResultSet - Statement - Connection
-
放在 finally 代码块中
rs.close();
stmt.close();
con.close();
//详见实例
3. 实例
import java.sql.*;
public class demo1 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:mysql://127.0.0.1:3306/example?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&allowMultiQueries=true";
String user = "root";
String password = "root";
try {
Class.forName("com.mysql.cj.jdbc.Driver");//初始化驱动
con = DriverManager.getConnection(url, user, password);
System.out.println(con);
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM t_class");
while(rs.next()){
int number = rs.getInt(1);
String name = rs.getString(2);
String room = rs.getString(3);
System.out.printf("%d\t",number);
System.out.printf("%s\t",name);
System.out.printf("%s\n",room);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try{
if( rs != null) {
rs.close();
}
}
catch(Exception e){
e.printStackTrace();
}
try{
if( stmt != null) {
stmt.close();
}
}
catch(Exception e){
e.printStackTrace();
}
try{
if( con != null) {
con.close();
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
useUnicode=true&characterEncoding=utf8 : 指定字符的编码、解码格式
useSSL=false : 和服务器身份验证有关,设置 useSSL=false来显式禁用 SSL ,或者设置 useSSL=true 并为服务器证书验证提供信任存储
serverTimezone=Asia/Shanghai :设置时区
rewriteBatchedStatements=true :减少程序提交 SQL 给 MySQL 的频率,不要每次提交一条
allowPublicKeyRetrieval=true:防止他人获取明文密码
allowMultiQueries=true :可以在 SQL 语句后携带分号,实现多语句执行,可以执行批处理,同时发出多个 SQL 语句