当前位置: 首页 > 图灵资讯 > 技术篇> ResultSet和satement和preparedStatement

ResultSet和satement和preparedStatement

来源:图灵教育
时间:2023-05-28 09:30:30

1.ResultSet[结果集]8271.1基本介绍

1.表示数据库结果集的数据表通常通过执行查询数据库的语言生成

2.Resultset对象保持光标指向其当前数据行。起初,光标位于第一行之前

3.next方法将光标移动到下一行,由于在resultset对象中没有更多的行时返回false,因此可以在while循环中使用循环来收集结果

ResultSet和satement和preparedStatement_java

1.2应用实例

ResultSet和satement和preparedStatement_SQL_02

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基本介绍

ResultSet和satement和preparedStatement_PreparedStatement_03

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();    }}

上一篇:

封装 JDBCUtils和事务

下一篇:

JDBC概述