1,JDBC的相关API:
DriverManager | 用于注册数据库连接驱动; |
---|---|
Connection | 获取数据库连接对象; |
Statement | 创建语句对象; |
ResultSet | 获取结果集 |
PreparedStatement | 创建预编译的语句对象,解决sql注入问题的 衍生子类(Statement的子类) |
a,Statement 的 两个sql操作方法:
executeUpdate | 用于对数据库数据的增删改操作 |
---|---|
executeQuery | 用于对数据库数据的查询操作(select) |
b,ResultSet 获取数据的相关API:
2,JDBC的使用步骤:
创建连接对象:DriverManager . getConnection
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "root");
//jdbc:mysql://localhost:3306/day17
//连接数据库的url;
获取sql语句对象:
Statement statement = connection.createStatement();
执行sql语句:
增删改的格式:
//执行sql语句并返回一个影响的行数;(增删改:executeUpdate)
int i = statement.executeUpdate("insert into user value (null,'xtl','0000'),(null,'jdi','9999')");
查询的格式:
//定义要执行的sql语句:
String sql1 = ("select * from USER ");
//提交sql语句并获取执行查询的结果集;
ResultSet rs = statement.executeQuery(sql1);
遍历数据库获取对应的字段: ```java // //遍历数据库索引获取对应字段: /*
next先后移动一位,如过遍历完后返回false;
*/ // while (rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
String passward = rs.getString("password");
User user = new User(id, name, passward);
//将获取的数据封装到对象并放到list集合中
list.add(user);
}
5. **关闭连接:**
```java
rs.close();
statement.close();
connection.close();
3,什么是SQL注入:
- 按照正常道理来说,我们在密码处输入的所有内容,都应该认为是密码的组成。
- 但是现在Statement对象在执行sql语句时,将密码的一部分内容当做查询条件来执行了。
- 原因示例: ```java “SELECT * FROM user WHERE name=’” + name + “‘ AND password=’” + password + “‘;”;
// 将用户输入的账号密码拼接后 “SELECT FROM user WHERE name=’hehe’ AND password=’a’or’1’=’1’;” //此时的sql语句将变成: “SELECT FROM user WHERE TRUE” //意思就是查询整张表,并返回true导致条件逻辑错误;
<a name="SFPuJ"></a>
## A,sql注入的解决:( 及 预编译语句对象:PreparedStatement 的使用)
<a name="PHNeB"></a>
### 1,为何PreparedStatement对象可以避免sql的注入问题 ?:
1. 预编译:SQL语句在执行前就已经编译好了,执行速度更快。;
1. 安全性更高:没有字符串拼接的SQL语句,所以避免SQL注入的问题;
1. 代码的可读性更好,因为没有字符串拼接;
<a name="dIrHn"></a>
### 2, * PreparedStatement 对象的使用步骤:(Statement的子接口)
1. 创建连接对象;略(同上)
1. 创建PreparedStatement 预编译语句对象:
1. 也可以先定义sql语句并将需要变动的内容使用占位符进行代替:
```java
//直接给sql语句:
PreparedStatement preparedStatement = connection.prepareStatement("select * from tb_brand where status=?");
//先定义语句后传入:
String sql=("select * from tb_brand where status=?");
//创建预编译的语句对象:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
3. **使用真实值替换占位符**:**preparedStatement . set**数据类型
//(第几个占位符,真实的值)
preparedStatement.setInt(1, 1);
4. 执行sql语句:
//增删改操作:(注意:这里不需要再传入sql语句,因为在上面已经有了,而且会进行预先编译)
preparedStatement.executeUpdate();
//查询操作:
preparedStatement.executeQuery();
5. 遍历数据并保存到对象;略(同上)
5. 关闭连接;同上