JDBC
1、JDBC的概念
2、掌握使用JDBC操作数据库的步骤
3、Statement和PreparedStatement的区别
4、了解SQL注入
JDBC全称是Java DataBase Connectivity,是java连接数据库的一套API。
驱动包
JDBC是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成。
通过这些类和接口,JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。
JDBC规范可以让开发者,无论连接什么数据库都是一套API。
驱动包是数据库厂商针对JDBC规范所写的实现类。
连接不同数据库时,应该使用不同数据库厂商提供的驱动包。
https://mvnrepository.com/ 驱动包网址
JDBC开发流程
JDBC主要完成数据库的磁盘数据和内存中对象数据的交互,本质是流操作。
JDBC的开发流程 流的开发流程
建立连接 建立流
执行SQL语句 操作流
关闭连接 关闭流
JDBC常用API
DriverManager JDBC驱动程序管理器,它是JDBC体系结构的支柱,主要作用是把java应用程序连接到JDBC驱动程序上,然后退出
Connection 定义到数据库的连接,主要用于创建Statement 对象
Statement 执行SQL语句的接口,通过相关方法执行静态的SQL语句
PreparedStatement 预编译的sql 语句,结合参数可以大大提高JDBC的执行效率
CallableStatement 执行存储过程
ResultSet 接收查询SQL查询语句所返回的结果集对象
使用JDBC完成添加
使用Class.forName加载驱动程序
Class.forName(“com.mysql.cj.jdbc.Driver");
使用DriverManager创建一个连接对象。
try {
// 1、加载驱动
// mysql8 -- "com.mysql.cj.jdbc.Driver"
// mysql5 -- "com.mysql.jdbc.Driver"
// 在加载类时,有可能没有该类,所以该方法可能会抛出ClassNotFoundException类未找到异常
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、通过驱动管理器建立数据库与java程序的连接
Connection con = DriverManager.getConnection
// jdbc:mysql://ip地址:数据库端口/数据库名称?配置&配置&配置
("jdbc:mysql://localhost:3306/j194?characterEncoding=utf-8", "root", "ygz970518");
// 3、通过连接对象创建Statement(SQL)语句执行对象
Statement st = con.createStatement();
// Statement(SQL语句执行对象)需要掌握的方法
//st.executeUpdate("SQL语句"); 执行DML语句,数据操作语言(增、删、改)
//st.executeQuery("SQL语句"); 执行DQL查询操作
st.executeUpdate("insert into employees_table(e_name,e_money,e_inDate,e_depeId) values('张三三',6000,'2001-03-05',3)");
// 4、关闭连接
st.close();
con.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
// mysql8所有配置
// userSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT
使用JDBC完成添加
mysql8.0的URL有所不同
所有报错配置
jdbc:mysql://localhost/rs_report?
userSSL= true &useUnicode = true&
characterEncoding=UTF8&serverTimezone=GMT
使用JDBC查询数据
Connection conn = DriverManager.getConnection(url, user, password);
//3.创建SQL语句执行对象
Statement st = conn.createStatement();
//查询数据
String sql = "select * from t_employee";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
String f1 = rs.getString(1);
String f2 = rs.getString("title");
……
}//逆向关闭
rs.close();
st.close();
conn.close();
JDBC开发小结
1、加载驱动程序
Class.forName(driver)
2、创建一个连接对象
Connection conn = DriverManager.getConnection(
url, user, password);
3、 使用连接对象创建声明语句对象
Statement st = conn.createStatement();
4、操作数据或查询数据
st.executeUpdate(sql);
ResultSet rs = st.executeQuery(sql);
5、依次关闭各种对象
rs.close();
st.close();
conn.close();
数据库执行SQL语句的过程
第一步:编写SQL语句
String sql = “select * from t_dept”;
第二步:分析语法分析、语义分析、选择连接方式、选择搜索路径……将分析结果保存在数据库的SQL缓冲区
第三步:编译数据库内部编译
第四步:运行可能要锁定相应的资源或先访问缓冲区)运行并返回结果。
执行SQL语句的种类
静态SQL
String sql = “select * from dept=10” 只编译一次, 不可变化
动态SQL
String sql = “select * from dept=”+deptId(变量); 编译多次,可变化
在开发中,需要更新的数据或需要查询的数据,都是用户通过应用程序进行录入的。所以基本上都使用动态SQL的方式,执行SQL语句。
使用Statement对象的缺点
使用Statement对象时,只能以拼接字符串方式执行SQL语句。
String sql = “select * from dept=”+deptId(变量);
当变量值发生变化时,会导致SQL语句的变化,在执行时会发生多次编译。
使用Statement对象时,效率较低。
另外,使用Statement对象时,容易引起SQL注入。
SQL注入
String deptId = “;5’”;
String sql = “select * from dept=”+deptId;
通常情况下,deptId的值是由用户输入的。如果用户输入了非法字符,会导致SQL语句的错误。
拼接后的SQL语句如下:
String sql = “select * from dept=;5’”;
执行SQL语句时会导致语法错误。
如果用户再坏一点,输入SQL语句的关键字,后果更严重。
String deptId = “5;drop table dept;”;
String sql = “select * from dept=”+deptId;
执行后,表都没了。
以拼接字符串方式插入动态SQL语句值的时候,如果值中有非法字符,或
SQL语句关键字时,会导致SQL语句语法错误,或执行结果不正确的情况,
这称为SQL注入。
preparedStatement
javaAPI中,提供了Statement的子接口:PreparedStatement,可以解决以上问题。
使用PreparedStatement对象执行预编译语句,能提高JAVA程序执行SQL语句的效率。
Connection conn = DriverManager.getConnection(url, user, password);
//3.创建语句对象
String sql = "INSERT INTO t_employee(emName,birthday) VALUES(?,?)";
PreparedStatement st = conn.prepareStatement(sql);
//参数赋值
st.setString(1, "LV003"); SQL语句只编译一次
st.
//执行setDate(2,Date.valueOf("1991-06-03")); 无论是什么值,都做
st.
//关闭executeUpdate(); 为字符串处理,可以防止SQL注入攻击。
st.close();
conn.close();