一、什么是JDBC
1. JDBC概念
代码语言:javascript
复制① 官方
* JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API
可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
② 个人理解
* JDBC就是定义了一组操作关系型数据库的接口。
2. 一个示例
代码语言:javascript
复制import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Demo_JDBC {
public static void main(String[] args) throws Exception {
//加载com.mysql.jdbc.Driver进内存,Driver中在静态代码块中注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
//sql语句
String sql = "insert emp(empno,ename) values(8888,'皇家马德里')";
//获取执行对象
Statement statement = connection.createStatement();
//执行sql
int i = statement.executeUpdate(sql);
//处理数据
System.out.println(i);
//释放资源
statement.close();
connection.close();
}
}
3. 相关类功能
代码语言:javascript
复制① DriverManager
* 注册驱动
java.sql.DriverManager.registerDriver(new Driver()); //在静态代码块中
【一般使用】
Class.forName("com.mysql.jdbc.Driver"); // MySQL5 以后的jar包可以省略,不推荐省略
* 获取数据库连接
DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
② Connection
* 获取执行 sql 对象
connection.createStatement() // 有漏洞,一般使用PreparedStatement
* 事务管理
- 开启事务
setAutoCommit(false) // 默认自动提交所以要设置为 false
- 提交事务
commit()
- 回滚
rollback() // catch 中回滚
③ Statement
* 执行 sql
- int executeUpdate(String) // 执行 DML
- RelustSet executeQuray(String) // 执行 DQL
* ResultSet 结果集
- Boolean next() // 向下移动一个
- getString(int/String) // 获取表中数据(int 索引,string 字段名) ★ 禁止传 int 参数
④ PreparedStatement extends Statement
* sql 改变
//防止 sql 注入问题
String sql = "select * from user where username = ? and password = password(?)"
* 获取 SQL 执行对象改变
//需要传递 SQL 预编译
connection.prepareStatement(sql)
* 增加赋值
/**
* 1 ---> 是第几个 ?
* 2 ---> ? 代表的值
*/
setXxx(1,2)
* 执行 SQL 改变
//无需传参
preparedStatement.execute()
二、JDBC工具类
代码语言:javascript
复制//配置文件 jdbc.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/db1
user = work
password = gaohu
//utils
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class jdbc_utils {
static String driver;
static String url;
static String user;
static String password;
static {
//加载字节码文件获取配置文件流
InputStream is = jdbc_utils.class.getClassLoader().getResourceAsStream("jdbc.properties");
/**【需要获取配置文件路径是使用这种方式】
* //加载本类字节码文件进内存,获取统一资源定位符(URL)
* URL url = jdbc_utils.class.getClassLoader().getResource("jdbc.properties");
* //获取URL路径
* String s = url.getParth();
* //使用 File
* pro.load(new File(s));
*/
try {
//创建properties集合,加载文件进内存
Properties pro = new Properties();
pro.load(is);
//获取属性并复制
driver = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
//加载驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
// DML 释放两个资源
public static void close(PreparedStatement preparedStatement, Connection connection) {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// DQL 释放三个资源
public static void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、修改密码案例
代码语言:javascript
复制import com.java.utils.jdbc_utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class jdbc_login {
public static void main(String[] args) {
//从键盘录入用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入旧密码");
String password = sc.nextLine();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//获取数据库连接
connection = jdbc_utils.getConnection();
//sql语句
String sql = "select * from user where username = ? and password = password(?)";
//获取执行sql对象,预编译SQL
preparedStatement = connection.prepareStatement(sql);
//给?赋值
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//执行sql
resultSet = preparedStatement.executeQuery();
//结果处理
if (resultSet.next()) {
//键入新密码
System.out.println("请输入新密码");
String newpassword = sc.nextLine();
//SQL
String sqlUpdate = "update user set password = password(?) where username = ?";
//预编译 SQL
preparedStatement = connection.prepareStatement(sqlUpdate);
//赋值
preparedStatement.setString(1,newpassword);
preparedStatement.setString(2,username);
//执行SQL
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
} else {
System.out.println("账号或密码错误!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
jdbc_utils.close(resultSet,preparedStatement,connection);
}
}
}
四、事务管理案例
代码语言:javascript
复制import com.java.utils.jdbc_utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBC_Transaction {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//获取连接
connection = jdbc_utils.getConnection();
//开启事务
connection.setAutoCommit(false);
//sql
String sql = "update account set balance = balance ? where name = ?";
//预编译sql
preparedStatement = connection.prepareStatement(sql);
//转出500
preparedStatement.setInt(1,-500);
preparedStatement.setString(2,"tom");
//执行sql
preparedStatement.executeUpdate();
//转入500
preparedStatement.setInt(1,500);
preparedStatement.setString(2,"jack");
//执行sql
preparedStatement.executeUpdate();
connection.commit();
} catch (Exception e) {
if (connection != null) {
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
jdbc_utils.close(preparedStatement,connection);
}
}
}