JDBC学习

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();

Statement和PreparedStatement的区别和联系

1、Statement是PreparedStatement的父接口,都能执行SQL语句

2.Statement在执行动态SQL时,只能以拼接字符串方式插入值,效率极低,也容易引起SQL注入

3. PreparedStatement提供占位符方式注入值,执行SQL语句时,只编译一次,而且无论是什么值都做为字符串处理,效率较高,也可以防止SQL注入。

总结

1、JDBC是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成。

2、JDBC开发步骤有:加载驱动、建立连接、执行SQL语句、更新数据库或操作结果集、关闭连接。

3、Statement是执行SQL语句的对象。可以通过预编译对象PreparedStatement提高执行效率。

4、以拼接字符串方式插入动态SQL语句值的时候,如果值中有非法字符,或SQL语句关键字时,会导致SQL语句语法错误,或执行结果不正确的情况,这称为SQL注入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值