JDBC的概述

1.JDBC的概述

1.1.JDBC的概述

​ * Java DataBase Connectivity Java数据库的连接。

​ * 目的使用Java的代码来操作数据库

​ * 需要使用JDBC(Java数据库的连接)规范来操作数据。

1.2.JDBC的规范

​ * JDBC是一套接口规范

​ * JDBC的实现类都是由各个数据库的生产商来提供的。

​ * 只要学会了JDBC的接口和方法,就可以了。

1.3.驱动

​ * 数据传输的桥梁

​ * 驱动指的是各个数据库生产商提供的实现类

​ * 需要来使用实现类,需要导入MySQL提交的驱动的jar包(千万不能忘记)

​ * 需要导入mysql‐connector‐java‐5.1.13‐bin.jar

2.JDBC的快速入门

2.1.MySQL的快速入门的开发的步骤

​ * 了解记忆开发的步骤

2.2.先创建day07的数据库和表结构。

create database jdbcdemo;
use jdbcdemo;
create table t_user(
id int primary key auto_increment,
username varchar(30),
password varchar(30),
email varchar(30)
);
insert into t_user values (null,'aaa','123','aaa@163.com');
insert into t_user values (null,'bbb','456','bb@163.com');
insert into t_user values (null,'ccc','789','ccc@163.com');

2.3.需求

​ * 查询的功能,把t_user表中的所有的数据全部都查询出来,显示到控制台上!!

2.4.开发的步骤

​ * 加载驱动使用DriverManager类

​ * 获取连接,返回Connection接口,说明连接上数据库的服务器

​ * 执行SQL语句

​ * 编写SQL语句

​ * 获取能执行SQL语句的对象(Statement接口)

​ * 如果执行的查询的语句,返回的结果,封装ResultSet接口中,遍历该接口

​ * 释放资源(调用close()方法)

3.JDBC相关的接口和API

3.1.DriverManager类(驱动)

3.1.1.DriverManager

​ * 使用DriverManager来管理JDBC的驱动的实现类

### 3.1.2.作用

​ * 加载驱动

​ * static void registerDriver(Driver driver)

​ * 参数:传入的真正的参数其实是MySQL提供Driver的类

​ * 传入的参数new Driver() 这种方式不是特别好

​ * 过于依赖某一个实现类

​ * 驱动的jar包会加载两次(通过看源代码)

​ * 解决上述的两个问题

​ * Class.forName(“com.mysql.jdbc.Driver”);

​ * 获取连接

​ * static Connection getConnection(String url, String user, String password)

​ * 参数有3个

​ * 第一个参数:jdbc:mysql://localhost:3306/day07

​ * jdbc ‐‐ 代表的主协议

​ * mysql ‐‐ 子协议(有可能变化的)

​ * localhost ‐‐ 主机

​ * 3306 ‐‐ 默认的端口号

​ * day07 ‐‐ 数据库

​ * 如果访问的是本地的自己的数据库,那么localhost:3306就可以省略不写

​ * mysql的命令 ‐uroot ‐proot

​ * JDBC简写:jdbc:mysql:///day07

​ * 第二个参数:root(用户名)

​ * 第三个参数:root(密码)

3.1.3.总结

​ * 管理驱动的

​ * 作用

​ * 加载驱动

​ * Class.forName(“com.mysql.jdbc.Driver”);

​ * 获取连接

​ * getConnection(“jdbc:mysql:///day07”,“root”,“密码”);

3.2.Connectione接口

3.2.1.Connection

​ * 代表的数据库的连接,非常重要,并且连接比较稀有,用完一定要释放它

3.2.2.作用

​ * 能获取到执行SQL语句的对象(获取Statement接口)

​ * Statement createStatement() ‐‐ 获取到Statement接口

​ * PreparedStatement prepareStatement(String sql) ‐‐ 获取到

接口,对象非常重要的,防止SQL注入的漏洞。

​ * 管理事务

​ * void setAutoCommit(boolean autoCommit) ‐‐ 开启事务

​ * void commit() ‐‐ 提交事务

​ * void rollback() ‐‐ 回滚事务

3.2.3.总结

​ * 获取能执行SQL语句对象的方法

​ * Statement createStatement()

​ * PreparedStatement prepareStatement(String sql)

​ * 只需要知道Connection接口可以管理事务就可以了!!

3.3.Statement接口

3.3.1.Statement接口

​ * 能执行SQL语句的对象

3.3.2.作用

​ * 能执行SQL语句

​ * ResultSet executeQuery(String sql) ‐‐ 执行查询SQL语句的方法

​ * int executeUpdate(String sql) ‐‐ 能执行增删改的SQL语句

​ * 能执行批处理

​ * void addBatch(String sql) ‐‐ 把SQL语句添加到批处理中

​ * void clearBatch() ‐‐ 清除批处理

​ * int[] executeBatch() ‐‐ 执行批处理

3.3.3.总结

​ * 就是能执行SQL语句

​ * 作用

​ * 执行SQL语句

​ * 执行批处理ResultSet接口(代表结果集)

3.4.ResultSet接口

3.4.1.ResultSet接口

​ * 代表的是结果集,执行的是查询的SQL语句,把查询的数据的表格封装到ResultSet接口中,通过遍历该接口,

获取到查询的结果!!

3.4.2.总结

​ * 封装数据

​ * ResultSet接口使用表格的方式来封装数据

​ * 内部维护一个游标,默认指向的是第一行数据之前

​ * 调用next()方法来向下移动游标,移动到某一行,获取该行的数据

​ * 注意:游标默认只能向下移动

​ * 获取值

​ * 根据字段的类型,调用不同的方法

​ * 例如

​ * 如果字段是int或者bigint

​ * getInt()或者getLong()

​ * 如果字段是varchar char类

​ * getString()

​ * 使用getObject()获取任何类型的数据,自己强转

​ * 获取数据的方法都是重载的

​ * getInt(int index) ‐‐ 通过下标值来取值,默认从1开始

​ * getInt(String s) ‐‐ 通过字段的名称来取值,比较常用的

3.5.释放资源

3.5.1.连接等对象必须要释放

3.5.2.释放资源的代码一帮会在finally代码块中释放

​ * 一定会执行的

3.5.3,释放的代码的标准

if(conn != null){
try {
// 释放资源
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}

3.6.JDBC增删改查

3.6.1.目的

​ * 回顾方法

​ * 封装工具类

3.7.JDBC工具类编写

3.7.1.编写配置文件

​ * 第一步:在src的目录创建db.properties文件(key=value出现的)

3.7.2.回去代码必须自己编写

​ 准备的工作

​ * 先要导入MySQL的驱动的jar包

​ * 复制编写的工具类和配置文件

​ * 编写User的类(JavaBean)

3.8.sql注入的漏洞

3.8.1.产生的效果?怎么产生?解决漏洞的问题。

3.8.2.在已知用户名的情况下,输入任意的密码,登陆进去。

3.8.3.前提条件

​ * 先已知用户名

​ * 后台的程序拼接SQL语句

3.8.4.SQL注入的漏洞怎么产生?

​ * aaa’or’1=1 密码输入了任意的字符

​ * aaa’‐‐ ’

​ * 分析原因

​ * String sql = “select * from t_user where username = '”+username+“’ and password ='”+password+“'”;

​ * 测试SQL注入漏洞的时候,输入如下的值

​ * aaa’or’1=1,密码任意的

​ * String sql = “select * from t_user where username = ‘aaa’or’1=1’ and password = 'sfsdfsds”;

​ * aaa’‐‐ ',密码也是任意的

​ * String sql = “select * from t_user where username = ‘aaa’‐‐ ‘’ and password= 'sfsdfsdfs”;

​ * 其实就是拼接SQL语句5.解决SQL注入的漏洞

3.8.5.解决SQL注入的漏洞

​ * 使用PreparedStatement接口,是Statement的子接口。

​ * 能执行SQL语句

​ * 产生预编译SQL语句的功能,解决SQL注入漏洞。

​ * 有预编译的功能,把SQL语句中的参数的部分使用?(占位符)来代替,可以先把编写的SQL语句先发送到MySQL服务器端,对这条SQL语句进行编译,

​ * 编译后的SQL语句的格式就是固定的了,再传入任何的值,都会做?的参数来出现。

​ * 掌握的方法

​ * Connection接口提供方法,conn.prepareStatement(String sql) ‐‐ 预编译SQL语句

​ * 通过PreparedStatement向?传入值

​ * setInt(第一个参数:?的位置,默认从1开始,第二个参数:?号对应的值)

​ * setString()

​ * setXxxx()

​ * setObject()

​ * 执行SQL语句的方法

​ * executeQuery() ‐‐ 执行查询,但是没有参数

​ * executeUpdate() ‐‐ 执行增删改,没有参数的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值