目录
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() ‐‐ 执行增删改,没有参数的