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. **关闭连接:**```javars.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. 关闭连接;同上


