Java-JDBC【之】JDBC概述、获取连接、操作流程、SQL注入问题与解决、查询解析ResultSet
1.JDBC概述
- JDBC(Java Database Connectivity)
JDBC是Java官方提供的,是一套用于操作数据库的接口,接口由不同的数据库厂商来提供驱动jar包
而对于开发人员来说,引入驱动后,只需要面向接口API编程,无需考虑内部实现
- JDBC(Java Database Connectivity)
1.独立于数据库管理系统存在的、一组操作数据库的公共API接口
2.访问不同的数据库,除了引入驱动包不一样外,操作流程是一致的
3.开发者,面向接口API编程,无需考虑内部实现,加快开发过程
2.操作流程
1.初始化项目,导入驱动jar包
- 两个包
mysql、junit
2.加载驱动类
- 加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
- 驱动包内部默认加载:mysql-connector-java META-INF\services\java.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学习》
《幕》
- 留白 —<老吉>
- ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀