1.ResultSet[结果集]8271.1基本介绍
1.表示数据库结果集的数据表通常通过执行查询数据库的语言生成
2.Resultset对象保持光标指向其当前数据行。起初,光标位于第一行之前
3.next方法将光标移动到下一行,由于在resultset对象中没有更多的行时返回false,因此可以在while循环中使用循环来收集结果
1.2应用实例 com中的代码.stulzl.resultset_.ResultSet_
package com.stulzl.resultset_;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.*;import java.util.Properties;//演示select语句返回Resultset,并取出结果 827@SuppressWarnings({"all"})public class ResultSet_ { public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException { //通过 Properties 对象获取配置文件的信息 Properties properties = new Properties(); properties.load(new FileInputStream("src\\mysql.properties")); //获取相关值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //1.注册驱动 Class.forName(driver);//建议写上 //2.连接 Connection connection = DriverManager.getConnection(url, user, password); //System.out.println(“方法5=””+connection); //3.获得Statementtentententententes Statement statement = connection.createStatement(); //4.组织sql语句 String sql = "select id,name,sex,borndate from actor"; //执行给定 SQL 语句,返回单个语句 ResultSet 对象 /* +----+-----------+-----+---------------------+ | id | name | sex | borndate | +----+-----------+-----+---------------------+ | 2 | 刘德华 | 男 | 1970-12-12 00:00:00 | | 3 | jack | 男 | 1990-11-11 00:00:00 | +----+-----------+-----+---------------------+ */ ResultSet resultSet = statement.executeQuery(sql); //5.使用while循环取出数据 while(resultSet.next(){/////)next()光标可以向后移动,如果没有更多的行,返回falsee int id = resultSet.getInt(1);//获取改行第一列 String name = resultSet.getString(2);//获取改行第二列 String sex = resultSet.getString(3);//获取改行第三列 Date date = resultSet.getDate(4);//获得银行第四列 System.out.println(id+"\t"+name+"\t"+sex+"\t"+date); } ///关闭连接 resultSet.close(); statement.close(); connection.close(); }}
SRC下的mysqll配置文件.properties
user=rootpassword=lzlurl=jdbc:mysql://localhost:3306/hsp_db02driverdriver=com.mysql.jdbc.Driver
数据库E:java学习\初级\course168db_actor_
-- 创建测试表 演员表 822CREATE TABLE actor ( -- 演员表id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(32) NOT NULL DEFAULT '',sex CHAR(1) NOT NULL DEFAULT '女',borndate DATETIME,phone VARCHAR(12));SELECT * FROM actor-- 为测试ResultSetINSERT增加两个记录 INTO actorVALUES(NULL,"刘德华","男","1970-12-12"'110');INSERT INTO actorVALUES(NULL,'jack“男”,“1990-11-11”,“112”;
2.基本介绍Statement822.1
1.Statement对象用于执行静态SQL语句并返回其产生的结果
2.连接建立后,需要访问数据库,执行命名或SQL语句
Statement[SQL注入问题]
PreparedStatement[预处理]
CallableStatement[存储过程][存储过程]]
3.Statement对象执行SQL语句,SQL注入风险
4.SQL注入是指在用户输入数据中注入非法SQL句段或命令,恶意攻击数据库,而不是充分检查用户输入的数据。sqlinjection.sql
5.为了防止SQL注入,只需要用PreparedStatement(从Statement扩展而来)代替Statement,然后用java演示.
2.1.演示sql注入问题828代码:java学习\初级\course169db_sql_injection
#演示sql注入问题 828-- 创建表CREATEEE TABLE admin ( -- NAME管理员表 VARCHAR(32) NOT NULL UNIQUE,pwd VARCHAR(32) NOT NULL DEFAULT '') CHARACTER SET utf8-- 添加数据INSERT INTO admin VALUES('tom','123');-- 查询管理是否存在SELECT * FROM adminWHERE NAME = 'tom' AND pwd = '123'-- SQL注入-- 输入用户名 为 1' or-- 输入通用密码 为 or '1'= 1SELECT * FROM adminWHERE NAME = '1' OR' AND pwd = 'OR '1'= '1'
2.1.用java演示statement注入问题829代码.stulzl.statement_Statement_
package com.stulzl.statement_;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.*;import java.util.Properties;import java.util.Scanner;///演示statement的注入问题 829@SuppressWarnings({"all"})public class Statement_ { public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException { Scanner scanner = new Scanner(System.in); ///让用户输入管理员名和密码 ///输入用户名 为 1' or //输入通用密码 为 or '1'= '1 System.out.println(“请输入管理员名称”);//next(): 当接收到 空格或者 表示结束 String admin_name = scanner.nextLine();//说明,假如你想看 SQL 注入,这里需要用 nextline回车代表结束 System.out.println(“请输入密码”); String admin_pwd = scanner.nextLine(); //通过 Properties 对象获取配置文件的信息 Properties properties = new Properties(); properties.load(new FileInputStream("src\\mysql.properties")); //获取相关值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //1.注册驱动 Class.forName(driver);//建议写上 //2.连接 Connection connection = DriverManager.getConnection(url, user, password); //System.out.println(“方法5=””+connection); //3.获得Statementtentententententes Statement statement = connection.createStatement(); //4.组织sql语句 String sql = "select name , pwd from admin where name='" +admin_name+"' and pwd = '"+admin_pwd+"'"; ResultSet resultSet = statement.executeQuery(sql); if(resultSet.next(){///如果查询到记录,说明管理存在 System.out.println(恭喜成功登录); }else { System.out.println(“对不起登录失败”; } ///关闭连接 resultSet.close(); statement.close(); connection.close(); }}
3.PreparedStatement(预处理)8303.1基本介绍
1.用问号()表示PreparedStatement执行的SQL语句中的参数,并通过调用PreparedStatement对象的SetXX()来设置这些参数.setXxx()方法有两个参数。第一个参数是SQL语句中的参数索引(从1开始),第二个是SQL语句中设置的参数值
2.调用executeQuery(),返回Resultset对象
3.调用executeupdate():执行更新包括增加、删除和修改
3.2预处理的好处1.不再使用+拼接sq|句子,减少语法错误
2.有效解决sq|注入问题!
3.编译次数大大降低,效率高
com中的代码.stulzl.preparedstatement_PreparedStatement_
package com.stulzl.preparedstatement_;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.sql.*;import java.util.Properties;import java.util.Scanner;///演示PreparedStatement预处理的使用 830@SuppressWarnings({"all"})public class PreparedStatement_ { public static void main(String[] args) throws Exception { Scanner scanner = new Scanner(System.in); ///让用户输入管理员名和密码 ///输入用户名 为 1' or //输入通用密码 为 or '1'= '1 System.out.println(“请输入管理员名称”);//next(): 当接收到 空格或者 表示结束 String admin_name = scanner.nextLine();//说明,假如你想看 SQL 注入,这里需要用 nextline回车代表结束 System.out.println(“请输入密码”); String admin_pwd = scanner.nextLine(); //通过 Properties 对象获取配置文件的信息 Properties properties = new Properties(); properties.load(new FileInputStream("src\\mysql.properties")); //获取相关值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //1.注册驱动 Class.forName(driver);//建议写上 //2.连接 Connection connection = DriverManager.getConnection(url, user, password); //3.组织sql语句 //3.1在这里?相当于占位符 String sql = "select name , pwd from admin where name= ?相当于占位符 String sql = "select name , pwd from admin where name= ? and pwd = ? "; //3.2 preparedStatement 对象实现了 PreparedStatement 实现接口的对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //3.3给?赋值 preparedStatement.setString(1,admin_name);//用户名 preparedStatement.setString(2,admin_pwd);//密码 //4. 执行 select 语句使用 executeQuery // 如果执行的话 dml(update, insert ,delete)使用 executeUpdate() // 这里执行 executeQuery ,不要在写 sql ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next(){///如果查询到记录,说明管理存在 System.out.println(恭喜成功登录); }else { System.out.println(“对不起登录失败”; } ///关闭连接 resultSet.close(); preparedStatement.close(); connection.close(); }}
3.3演示preparedstatementexecuteupdate()方法831com中的代码.stulzl.preparedstatement_02executeUpdate_
package com.stulzl.preparedstatement_02;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Properties;import java.util.Scanner;///演示preparedstatementexecuteupdate()方法 831@SuppressWarnings({"all"})public class executeUpdate_ { public static void main(String[] args) throws Exception { Scanner scanner = new Scanner(System.in); ///让用户输入管理员名和密码 ///输入用户名 为 1' or //输入通用密码 为 or '1'= '1 System.out.println(“请输入管理员名称”);//next(): 当接收到 空格或者 表示结束 String admin_name = scanner.nextLine();//说明,假如你想看 SQL 注入,这里需要用 nextline回车代表结束///// System.out.println(“请输入密码”);// String admin_pwd = scanner.nextLine(); //通过 Properties 对象获取配置文件的信息 Properties properties = new Properties(); properties.load(new FileInputStream("src\\mysql.properties")); //获取相关值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //1.注册驱动 Class.forName(driver);//建议写上 //2.连接 Connection connection = DriverManager.getConnection(url, user, password); //3.组织sql语句 //3.1在这里?相当于占位符 //添加记录 //String sql = "insert into admin values(?相当于占位符 //添加记录 //String sql = "insert into admin values(?, ?)"; ///修改记录 //String sql = "update admin set pwd=? where name=?"; ///删除记录 String sql = "delete from admin where name= ?"; //3.2 preparedStatement 对象实现了 PreparedStatement 实现接口的对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //3.3给?赋值 //添加 //preparedStatement.setString(1,admin_name);//用户名 //preparedStatement.setString(2,admin_pwd);//密码 //这是修改操作,因为要确保pwd和name对应 //preparedStatement.setString(1,admin_pwd);//用户名 //preparedStatement.setString(2,admin_name);//密码 ///删除对应,因为只需要name对应。 preparedStatement.setString(1,admin_name);//用户名 // 执行的是 dml(update, insert ,delete)使用 executeUpdate() int rows = preparedStatement.executeUpdate(); System.out.println(rows>0?“成功执行”:“执行失败”); ///关闭连接 preparedStatement.close(); connection.close(); }}