-
JDBC基本概念
1.Java DataBase Connextivity java语言操作数据库
本质:java官方定义的一套操作关系型数据库的规则(接口)。各数据库厂商实现这套接口,提供数据库驱动jar包,真正执行的代码是jar包中的实现类。 -
快速入门
1.导入驱动jar包(maven)
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
2.注册驱动
3.获取数据库连接对象 connection
4.定义sql
5.获取执行sql语句的对象 statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 2.注册驱动
// mysql5之后的驱动jar包可以省略注册驱动的步骤
Class.forName("com.mysql.jdbc.Driver");
// 3.获取数据库连接对象 connection
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456");
// 4.定义sql
String sql = "select 1";
// 5.获取执行sql语句的对象 statement
Statement stmt = connection.createStatement();
// 6.执行sql,接受返回结果
int count = stmt.executeUpdate(sql);
// 7.处理结果
System.out.println(count);
// 8.释放资源
stmt.close();
connection.close();
}
详解各个对象:
- DriverManager:驱动管理对象
// 获取数据库连接
方法:static Connection getConnection(String url,String user,String password)
参数
url:指定连接的路径
语法:jdbc:mysql://ip:端口号/库
- Connection:数据库连接对象
功能:
1.获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理实务:
开启事务:setAutoCommit()
提交事务: commit()
回滚事务: rollback()
- Statement:执行sql的对象(静态sql)
1.execute(String sql):可以执行任意的sql
2.executeUpdate(String sql) :可以执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句
*返回值:影响的行数
3.ResultSet executeQuery(String sql):执行DQL(select)语句
- ResultSet: 结果集对象 封装查询的结果
//ResultSet遍历结果集
String sql = "select * from t_user";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()){
String user_name = rs.getString("user_name");
System.out.println(user_name);
}
- PreparedStatement: Statement的子类 执行sql的对象(预编译sql)
//1.sql注入问题:
// 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
//例如:
select * from user where username = "随便" and password = 'a' or 'a' = 'a'
//其中'a' = 'a' 是一个恒等式
//2.解决sql注入问题:使用PreparedStatement对象解决
//3.预编译的sql:参数使用?作为占位符
//定义sql时:
select * from user where username = ? and password = ?;
//获取prepareStatemenet 的sql对象:
Connection.prepareStatement(String sql)
//给?赋值
setXxx(参数1,参数2)
// 执行sql 时不再需要传递sql
demo:
import java.sql.*;
/**
* @author :yangzhipeng
* @date : 2023/3/9 11:48
* Description : prepareStatement解决sql注入问题
*/
public class prepareStatementDemo {
Connection conn= null;
PreparedStatement pstmt = null;
ResultSet rs = null;
public static void main(String[] args) {
String username = "小明";
String password = "'a' or 'a' = 'a'";
new prepareStatementDemo().test(username,password);
}
public void test(String username,String password){
try {
conn = JDBCUtils.getConnection();
//预编译的sql
String sql = "select * from t_user where username =? and password =?";
pstmt = conn.prepareStatement(sql);
//给?赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
rs = pstmt.executeQuery();
while (rs.next()){
String user_name = rs.getString("user_name");
System.out.println(user_name);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JDBCUtils.close(rs,pstmt,conn);
}
}
}