-
JDBC(Java DataBase Connectivity):Java连接数据库技术
-
JDBC是用于执行SQL语句的Java API,为多种关系型数据库提供统一访问,可以通过java代码操作数据库
-
好处:各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发 . 可随时替换底层数据库,访问数据库的Java代码基本不变,导入数据库驱动jar包即可
执行步骤
1.注册驱动
Class.forName
:动态加载类的方法,接受类名并返回class对象.
Class.forName("com.mysql.cj.jdbc.Driver");
- Driver类中有注册驱动的代码,而且是静态代码,所以只要Driver类被调用,就会执行静态代码块.
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
2.获取连接
- 获取普通执行者对象:
Statement createStatement()
; - 获取预编译执行者对象:
PreparedStatement prepareStatement(String sql)
,SQL 查询使用?
作为占位符,然后通过pstmt.setString(1, "Sales")
绑定参数,避免了 SQL 注入.
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database example", "root", "wjq");
3.定义sql
4.获取并执行sql
-
Statement
:执行sql语句的对象.
执行DML语句:int executeUpdate(String sql)
,返回int(影响的行数),可用来执行insert,update、delete语句。执行DQL语句:
ResultSet executeQuery(String sql)
, 返回值ResultSet(结果集),用于执行select语句。 -
ResultSet
:结果集对象
判断结果集中是否还有数据:boolean next()
,有数据返回true,并将索引向下移动一行,没有数据就返回false.
获取结果集中的数据:XXX getXxx(“列名”)
, XXX代表数据类型), 例如:String getString(“name”); int getInt(“age”); -
setString(int parameterIndex, String value)
用于设置 SQL 语句中的某个参数(占位符?
)的值,parameterIndex
表示要设置的参数在 SQL 中的位置(从 1 开始),value
:要设置的值.
Statement stat = conn.createStatement();
String sql = "SELECT * FROM works";
ResultSet rs = stat.executeQuery(sql);//执行查询语句
while(rs.next()) {
System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
}
//next():移动指针。如果存在下一行数据返回true,否则返回 false
5.关闭资源
finally {
// 关闭资源
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBCUtils工具类:
JDBCUtils:
package StudentManagementProject;
/*
* author: Warren */
//jdbc工具类,封装了加载驱动,获取连接,关闭连接的方法
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class jdbc{
private static final String URL = "jdbc:mysql://localhost:3306/database example"; //数据库地址
private static final String USERNAME = "root"; //数据库用户名
private static final String PASSWORD = "wjq"; // 数据库密码
private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; // 使用驱动类
static {
try {
// 加载数据库驱动
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Failed to load JDBC driver", e);
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
// 关闭数据库连接
public static void closeConnection(Connection connection, java.sql.Statement statement, java.sql.ResultSet resultSet) throws SQLException {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
}
使用jdbc工具类
package StudentManagementProject;
import StudentManagementProject.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* author: Warren */public class pro {
public static void main(String[] args) {
Connection conn=null;
Statement statement=null;
ResultSet resultSet=null;
try {
Connection connection = jdbc.getConnection();//使用工具类中方法获取连接
String sql = "update works set name='jimm' where id=4";//定义sql
statement = connection.createStatement();//获取执行sql对象
int i = statement.executeUpdate(sql);//执行sql
System.out.println("受影响的行数为" + i);
String sql1 = "select * from works where name='Jimm'";
resultSet = statement.executeQuery(sql1);//获取结果集
while (resultSet.next()) {
//打印结果
System.out.println(resultSet.getString("name"));
System.out.println(resultSet.getString(3));;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
try {
jdbc.closeConnection(conn,statement,resultSet);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
示例:
插入,修改,删除等:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class haha {
public static void main(String[] args)throws Exception {
Connection connection = null;
Statement statement = null;
try {
// 1. 加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接
String url = "jdbc:mysql://localhost:3306/database example";
String user = "root";
String password = "wjq";
connection = DriverManager.getConnection(url, user, password);
// 3. 创建Statement对象
statement = connection.createStatement();
// 4. 定义要执行的SQL插入语句
String sql = "INSERT INTO works VALUES(888, 'wjq', 'java工程师', 1111, 3532, 2754, 1, 355, 535, 6346);";
// 5. 执行插入操作,返回受影响的行数
int rowsInserted = statement.executeUpdate(sql);
System.out.println("插入的行数: " + rowsInserted);
// 6. 执行删除操作,返回受影响的行数
//String sql = "DELETE FROM works WHERE 员工姓名 = 'warren' or 员工姓名 = 'Ricci'";
//int rowsDeleted = statement.executeUpdate(sql);
//System.out.println("删除的行数: " + rowsDeleted);
// 7. 执行修改操作并返回受影响的行数
//String sql = "UPDATE works SET 实发工资 = 28888 WHERE 职位 = '数据分析师'";
//int rowsUpdated = statement.executeUpdate(sql);
//System.out.println("更新的行数: " + rowsUpdated);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6. 关闭资源
try {
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
查询:
package StudentManagementProject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class jdbc {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 1. 加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接
String url = "jdbc:mysql://localhost:3306/database example";
String user = "root";
String password = "wjq";
connection = DriverManager.getConnection(url, user, password);
// 3. 创建Statement(sql执行)对象
statement = connection.createStatement();
// 4. 定义要执行的SQL查询语句
String sql = "SELECT * FROM works";
// 5. 执行查询操作
resultSet = statement.executeQuery(sql);
// 6. 处理查询结果
while (resultSet.next()) {
// 根据列名或列索引获取列值
String id = resultSet.getString("员工编号");
String name = resultSet.getString("员工姓名");
int lose = resultSet.getInt("旷工");
String position = resultSet.getString("职位");
double salary = resultSet.getDouble("实发工资");
// 打印查询结果
System.out.println("员工编号: " + id + ", 员工姓名: " + name + ", 旷工: " + lose +
", 职位: " + position + ", 实发工资: " + salary);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7. 关闭资源
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}