JDBC的一些笔记整理
Java DataBase Connectivity ,即Java数据库连接,针对java对数据库进行操作时各大数据库厂商制定的一套标准接口,这套接口由各大数据库厂商进行了实现。
使用步骤:
- 引入jar文件.
- 加载数据库驱动 (JavaSE项目中可以省略 , JavaWeb项目必须编写此步骤)
Class.forName(“com.mysql.jdbc.Driver”); - 通过驱动管理器, 获取JDBC连接对象.
Connection conn = DriverManager.getConnection(“数据库连接地址”,“帐号”,“密码”);
// 数据库连接地址格式: 主协议:子协议://ip地址:端口号/数据库名称
// mysql的连接地址: jdbc:mysql://localhost:3306/java35
// oracle的连接地址: jdbc:oracle:thin:@localhost:1521:ORCL - 通过连接对象, 创建SQL执行对象 (SQL执行环境)
Statement state = conn.createStatement(); - 通过SQL执行对象 ,执行SQL语句.
state.execute(String sql语句); - 释放资源
state.close();
conn.close();
JDBC中常用的类型与方法
- DriverManager : 驱动管理器
常用方法:
- 获取数据库连接:
static Connection getConnection(String 数据库地址,String 账号 ,String 密
码)
- Connection : 数据库连接对象
常用方法:
- 创建SQL执行对象: Statement createStatement();
- Statement : SQL执行对象
常用方法:
- 执行SQL语句(查询语句返回true, 其它语句返回false)
boolean execute(String sql); - 执行DML语句(INSERT UPDATE DELETE) 和 DDL语句(create alter drop)
(返回int值, 表示语句对数据库表格的影响行数 !)
(通常我们认为 返回值>0 表示执行成功.)
int executeUpdate(String sql); - 执行DQL语句 (select)
ResultSet executeQuery(String sql);
- ResultSet : 结果集对象 (指的是一个select语句的查询结果)
常用方法:- 控制游标移动的常用方法:
- boolean next() ****
作用: 控制游标向下一行移动.
返回值: 移动成功返回true , 下一行不存在移动失败, 返回
false - boolean privious() 了解
作用: 控制游标向上一行移动.
返回值: 移动成功返回true , 上一行不存在移动失败, 返回
false - boolean absolute(int 行号) 了解
作用: 控制游标向指定行移动
返回值: 移动成功返回true , 行不存在移动失败, 返回false - boolean beforeFirst() 了解
作用: 控制游标移动到第一行
返回值: 移动成功返回true, 没有第一行数据返回false - boolean afterLast() 了解
作用: 控制游标移动到最后一行
返回值: 移动成功返回true, 没有最后一行数据返回false
- 获取游标指向行的字段值的常用方法:
- XXX getXXX(String 列名) ***
根据字段名, 得到此字段的值 - XXX getXXX(int 字段的索引) *
根据字段的索引, 得到字段的值 , 索引从1开始
DAO :database access object ,夹在业务逻辑与数据库资源中间。
即是通过对数据库的访问操作设计的一个接口,这样的方式可以有效的抽象出需要的业务方法,当对数据库添加更多操作时,可以有效的利用dao层对象调用业务逻辑的方法。使得各功能的逻辑更加清晰,耦合度更低,代码复用性更高。
Sql注入问题
在MySQL数据库中,当业务层使用的执行查询的sql语句出现歧义时,出现的不该发生的现象。
使用JDBC对数据库连接后,我们要使用connection连接对象来,创建执行sql的执行对象。
这时如果通过createStatement()方法进行创建,调用执行的sql方法时通过拼接字符串的操作。下面通过演示说明。
当我们执行executeQuery()方法,进行数据库查询的操作时,如果密码传入的规则按照
上图的操作进行拼接,就会使得sql语句成立,并查到了数据,导致了数据不安全。
当时想了一下,如果以该方式输入任何一个已知账号,并通过拼接上面图片的字符串方式输入密码,那么任何人的账户都能登录了哈哈。
为了解决这个sql注入的问题,我们可以使用
prepareStatement()方法来创建SQL执行对象,并在参数中使用查询的sql语句,通过对需要传递的sql语句关键字,进行参数化的处理,这时候,我们就可以避免sql注入的问题了。
接着再对每个?的值进行设置,setString()中的两个参数,第一个表示sql语句的参数的索引位置,从1开始。第二个参数表示sql语句的参数的值。
这时执行时不需要再传入sql语句了。