Java-JDBC【之】JDBC概述、获取连接、操作流程、SQL注入问题与解决、查询解析ResultSet
- 1.JDBC概述
- 2.操作流程
- 1.初始化项目,导入`驱动jar包`
- 2.加载驱动类
- 3.创建数据库连接对象`Connection`
- 4.创建`Statement` (SQL注入问题,在下面解决)
- 5.执行SQL
- 6.解析查询对象`ResultSet`
- 7.关闭连接 `ResultSet 、Statement 、Connection`
- 3.SQL注入问题与解决(Statement 、PreparedStatement)
- 3.1.模拟SQL注入
- 3.2.PreparedStatement解决
- 3.3.Statement 与 PreparedStatement
- 4.完整源码
- 《目录:Java-JDBC学习(编写中...)》
- 《幕》
1.JDBC概述
- JDBC(Java Database Connectivity)
JDBC是Java官方提供的,是一套用于操作数据库的接口,接口由不同的数据库厂商来提供驱动jar包
而对于开发人员来说,引入驱动后,只需要面向接口API编程,无需考虑内部实现
- JDBC(Java Database Connectivity)
1.独立于数据库管理系统存在的、一组操作数据库的公共API接口
2.访问不同的数据库,除了引入驱动包不一样外,操作流程是一致的
3.开发者,面向接口API编程,无需考虑内部实现,加快开发过程
2.操作流程
1.初始化项目,导入驱动jar包
2.加载驱动类
- 加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
- 驱动包内部默认加载:mysql-connector-java META-INFservicesjava.sql.Driver(com.mysql.cj.jdbc.Driver)
- 一般主动指定 Class.forName(“com.mysql.cj.jdbc.Driver”)
- Class.forName的加载机制,是类加载时,会执行静态代码块
3.创建数据库连接对象Connection
- 创建数据库连接需要三个参数
- 1.URL:jdbc:mysql://127.0.0.1:3306/abl?user=root
由三部分组成,协议:jdbc 子协议:mysql 名称:127.0.0.1:3306/abl
问号 ?后可携带参数 - 2.用户名 和 密码 (user,password)
4.创建Statement (SQL注入问题,在下面解决)
- Statement:用于执行 SQL 语句并返回它所生成结果的对象。
5.执行SQL
6.解析查询对象ResultSet
7.关闭连接 ResultSet 、Statement 、Connection
3.SQL注入问题与解决(Statement 、PreparedStatement)
3.1.模拟SQL注入
- 通过字符串拼SQL的形式,存在这种SQL注入问题
- 账号是对的,但是密码随便输入,最后只需要加上 or '1' = '1' ,相当于添加了判断条件,这样就满足整体条件为 true返回查询信息
3.2.PreparedStatement解决
- PreparedStatement 将SQL进行预编译,将传入的参数认为是?占位符的内容,参数不会被解析为表达式
- 和上面同样的输入,最终经过预编译后,得到的字符串为 select id,a_account from a_user where a_account = '001' and a_password ='999999 or ''1'' = ''1'''
- 如此,就通过PreparedStatement,解决了预编译问题
3.3.Statement 与 PreparedStatement
- Statement
- 1.表示执行一条 SQL 语句
- 2.数据库无法提供优化,每执行一次都要对传入的语句编译一次
- 3.存在SQL注入问题
- 4.字符串拼餐,SQL过长不易阅读
- PreparedStatement
- 1.PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
- 2.PreparedStatement 对象所代表的 SQL 语句中,参数用问号(?)来表示。设置参数值时,下标索引从1开始
- 3.数据库会对预编译语句提供性能优化。数据库会缓存预编译语句,重复调用时不需要二次编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
- 4.PreparedStatement 可以防止 SQL 注入
- 5.提高代码的可读性和可维护性
4.完整源码
《目录:Java-JDBC学习(编写中…)》
《幕》
- 留白 —<老吉>
- ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀