JDBC(Java DataBase Connectivity)
1、JDBC入门
客户端操作 MySQL 数据库的方式:
- 使用第三方客户端来访问 MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL
-
使用 MySQL 自带的命令行方式
-
通过 Java 来访问 MySQL 数据库,今天要学习的内容
1.1、什么是JDBC
JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。
JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个
数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即
可,数据库驱动由数据库厂商提供。
1.2、JDBC的优点
- 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
- .使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库
1.3、JDBC开发用到的包
java.sql | 所有与 JDBC 访问数据库相关的接口和类 | |
---|---|---|
javax.sql | 数据库扩展包,提供数据库额外的功能。如:连接池 | |
数据库的驱动 | 由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类 |
1.4、 JDBC 的核心 API
接口or类 | 作用 |
---|---|
DriverManager 类 | 1.管理和注册数据库驱动 2.得到数据库连接对象 |
Connection 接口 | 连接对象,可用于创建 Statement 和 PreparedStatement 对象 |
Statement 接口 | SQL 语句对象,用于将 SQL 语句发送给数据库服务器 |
PreparedStatemen 接口 | SQL 语句对象,是 Statement 的子接口 |
ResultSet 接口 | 代表查询结果对象,结果集 |
1.5、 导入驱动 Jar 包
2、第一个JDBC程序
2.1、JdbcFirstDemo代码
public class JdbcFirstDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1、连接数据库 注册 JDBC 驱动
Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动
// 2、打开链接 用户信息URL
// useUnicode=true&characterEncoding=utf8&useSSL=true
String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String userName = "root";
String pwd = "123456";
// 3、连接成功,获得connection 数据库对象
Connection connection = DriverManager.getConnection(url, userName, pwd);
// 4、获得SQL的对象 statement
Statement statement = connection.createStatement();
// 5、执行sql对象 去 执行sql, 可能存在的结果,查看返回结果
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql); // 执行sql,返回结果集
while (resultSet.next()) {
System.out.println("id:" + resultSet.getObject("id"));
System.out.println("name:" + resultSet.getObject("NAME"));
System.out.println("pwd:" + resultSet.getObject("PASSWORD"));
System.out.println("email:" + resultSet.getObject("email"));
System.out.println("birth:" + resultSet.getObject("birthday"));
System.out.println("==================================");
}
// 6、释放连接
resultSet.close();
statement.close();
connection.close();
}
}
2.2、步骤总结:
- 加载驱动
- 链接数据库DriverManager
- 获得执行sql的对象 statement
- 获得返回的结果集
- 释放连接
3、JDBC中对象解释
3.1、DriverManager 驱动程序管理器
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// Class.forName(数据库驱动实现类)
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, userName, pwd);
// connection 代表数据库
// 数据库设置自动提交
// 事务提交
// 事务回滚
connection.setAutoCommit();
connection.commit();
connection.rollback();
3.2、URL
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useSSL=false&useUnicode=true&characterEncoding=utf8";
// 如果数据库出现乱码,可以指定参数: characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据
// mysql--3306
// 协议:子协议://主机地址:端口号/数据库名?参数1&参数2...
// oracle--1521
// jdbc:oracle:thin:@localhost:1521:sid
3.3、Statement 执行SQL的对象
String sql = "SELECT * FROM users"; // 编写sql
statement.executeQuery();//查询操作 返回结果集ResultSet
statement.execute();//可以执行任何sql
statement.executeUpdate();//更新 插入 删除都是用这个,返回受影响的行数
connection.prepareStatement() // 执行SQL的对象
3.4、ResultSet 查询返回的结果集
- 获得指定的数据类型
//不知道类型就用Object
resultSet.getObject();
//知道类型可以直接使用对应类型获取
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDouble();
- 遍历 指针
resultSet.next();//移动到下一行数据
resultSet.beforeFirst();//移动到最前
resultSet.afterLast();//移动到最后
resultSet.previous();//移动到前一行
resultSet.absolute(i);//移动到第i行
3.5、释放资源
resultSet.close();
statement.close();
connection.close(); // 耗资源,用完关掉
4、Statement对象详解
4.1、提取工具类
package utils;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
try {
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
// 1、驱动只用加载一次
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
// 释放资源
public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (conn != null) {
conn.close();
}
}
}
4.2、编写增删改查的方法
package Test;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestInsert {
public static void main(String[] args) throws Exception {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection(); // 获取数据库对象
st = conn.createStatement(); // 获得SQL对象
String sql = "INSERT INTO `users` " +
"VALUES ('4','xiaoming','23456','xiaoming@qq.com','2020-02-02')";
int line = st.executeUpdate(sql);
if (line > 0) {
System.out.println("插入成功~");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
}
}
package Test;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestDelete {
public static void main(String[] args) throws Exception {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection(); // 获取数据库对象
st = conn.createStatement(); // 获得SQL对象
String sql = "DELETE FROM `users` WHERE id = 4";
int line = st.executeUpdate(sql);
if (line > 0) {
System.out.println("删除成功~");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
}
}
package Test;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestUpdate {
public static void main(String[] args) throws Exception{
Connection coon = null;
Statement st = null;
ResultSet rs = null;
try {
coon = JdbcUtils.getConnection(); // 获取数据库对象
st = coon.createStatement(); // 获取SQL对象
String sql = "UPDATE `users` SET `email` = 'ming@gmail.com' WHERE id = 4";
int line = st.executeUpdate(sql); // 返回受影响的行数
if (line > 0) {
System.out.println("修改成功!!!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(coon, st, rs);
}
}
}
package Test;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestSelect {
public static void main(String[] args) throws Exception {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection(); // 获得数据库对象
st = conn.createStatement(); // 由数据库对象得到SQL对象
String sql = "SELECT * FROM `users` WHERE `id` = 4;";
rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println("id = " + rs.getInt("id"));
System.out.println("name = " + rs.getString("NAME"));
System.out.println("pwd = " + rs.getString("PASSWORD"));
System.out.println("email = " + rs.getString("email"));
System.out.println("birth = " + rs.getDate("birthday"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.release(conn, st, rs);
}
}
}
5、事务
- 关闭自动提交
conn.setAutoCommit(false)
- 业务完毕,开启提交
conn.commit()
- 未提交,事务回滚
comm.rollback()
package Test;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestTransaction1 {
public static void main(String[] args) throws Exception{
Connection conn = null;
PreparedStatement st = null;
try {
conn = JdbcUtils.getConnection();
// 关闭 数据库 自动提交机制 即 开启事务
conn.setAutoCommit(false);
String sql1 = "update account set money = money - 500 where name = ?";
st = conn.prepareStatement(sql1);
st.setString(1,"A");
st.executeUpdate();
// int x = 1 / 0; 报错回滚
String sql2 = "update account set money = money + 500 where name = ?";
st = conn.prepareStatement(sql2);
st.setString(1, "B");
st.executeUpdate();
// 业务完毕,手动提交事务
conn.commit();
} catch (Exception e) {
// 如果失败,回滚
conn.rollback();
e.printStackTrace();
} finally {
System.out.println("转账成功!!");
JdbcUtils.release(conn, st, null);
}
}
}
参考博客:学JDBC,这一篇就够了
参考视频:【狂神说】JavaMySQL最新教程通俗易懂