Java数据库JDBCconnection,statement,prepareStatement,ResultSet接口的用法和解释

Java数据库JDBC——connection,statement,prepareStatement,ResultSet接口的用法和解释

Connection常用方法

变量和类型方法描述
voidclose()立即释放此 Connection对象的数据库和JDBC资源,而不是等待它们自动释放。
StatementcreateStatement()创建一个 Statement对象,用于将SQL语句发送到数据库。
StatementcreateStatement​(int resultSetType, int resultSetConcurrency)创建一个 Statement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。
PreparedStatementprepareStatement​(String sql)创建一个 PreparedStatement对象,用于将参数化SQL语句发送到数据库。
PreparedStatementprepareStatement​(String sql, int resultSetType, int resultSetConcurrency)创建一个 PreparedStatement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。

Statement常用方法

变量和类型方法描述
voidaddBatch​(String sql)将给定的SQL命令添加到此 Statement对象的当前命令列表中。
voidclose()立即释放此 Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。
booleanexecute​(String sql)执行给定的SQL语句,该语句可能返回多个结果。
ResultSetexecuteQuery​(String sql)执行给定的SQL语句,该语句返回单个 ResultSet对象。

PrepareStatement常用方法

变量和类型方法描述
voidaddBatch()
向此 PreparedStatement对象的一批命令添加一组参数。
booleanexecute()在此 PreparedStatement对象中执行SQL语句,该对象可以是任何类型的SQL语句。
ResultSetexecuteQuery()执行此 PreparedStatement对象中的SQL查询,并返回查询生成的 ResultSet对象。
intexecuteUpdate()执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,比如INSERT , UPDATE或DELETE ; 或者不返回任何内容的SQL语句,例如DDL语句。
voidsetDate​(int parameterIndex, Date x)使用运行应用程序的虚拟机的默认时区将指定参数设置为给定的 java.sql.Date值。
voidsetDouble​(int parameterIndex, double x)将指定参数设置为给定的Java double值。
voidsetFloat​(int parameterIndex, float x)将指定参数设置为给定的Java float值。
voidsetInt​(int parameterIndex, int x)将指定参数设置为给定的Java int值。
voidsetLong​(int parameterIndex, long x)将指定参数设置为给定的Java long值。
voidsetTime​(int parameterIndex, Time x)将指定参数设置为给定的 java.sql.Time值。
voidsetString​(int parameterIndex, String x)将指定参数设置为给定的Java String值。
voidsetObject​(int parameterIndex, Object x)使用给定对象设置指定参数的值。

Resultset常用方法

变量和类型方法描述
voidclose()立即释放此 ResultSet对象的数据库和JDBC资源,而不是等待它自动关闭时发生。
voiddeleteRow()从此 ResultSet对象和基础数据库中删除当前行。
intgetInt​(int columnIndex)写第几列(1,2…n)
intgetInt​(String columnLabel)写列名
doublegetDouble​(int columnIndex)写第几列(1,2…n)
doublegetDouble​(String columnLabel)写列名
DategetDate​(int columnIndex)写第几列(1,2…n)
DategetDate​(String columnLabel)写列名
longgetLong​(int columnIndex)写第几列(1,2…n)
longgetLong​(String columnLabel)写列名
StringgetString​(int columnIndex)写第几列(1,2…n)
StringgetString​(String columnLabel)写列名
package com.isoft;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {
    private static String url="jdbc:mysql://localhost:3306/supermarket?serverTimezone =Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false";
    private static String user="root";
    private static String password="root";
    public static void main(String[] args)throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=null;
        conn= DriverManager.getConnection(url,user,password);
       String sql="SELECT * FROM goods;";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        while (rs.next()) {
            System.out.print( rs.getInt(1)+" ");
            System.out.print(rs.getString(2)+" ");
            System.out.print(rs.getInt(3)+" ");
            System.out.print(rs.getFloat(4)+" ");
            System.out.print( rs.getInt(5)+" ");
            System.out.println(rs.getDate(6)+" ");//推荐用这种,不容易错

            /* System.out.print( rs.getInt("id")+" ");
            System.out.print(rs.getString("gname")+" ");
            System.out.print(rs.getInt("count")+" ");
            System.out.print(rs.getFloat("price")+" ");
            System.out.print( rs.getInt("uid")+" ");
            System.out.println(rs.getDate("createtime")+" ");*/

            /* System.out.print( rs.getInt("id")+" ");
            System.out.print(rs.getString(2)+" ");
            System.out.print(rs.getInt(3)+" ");
            System.out.print(rs.getFloat("price")+" ");
            System.out.print( rs.getInt("uid")+" ");
            System.out.println(rs.getDate("createtime")+" ");*/
        }
        conn.close();
    }
}
运行结果:
1 苹果 45 10.0 1 2021-01-12 
2 水杯 81 27.5 1 2021-01-06 
4 杯子 2 3.5 1 2021-01-06 
5 杯子 3 7.5 1 2021-01-06 
6 水杯 5 13.8 1 2021-01-06 
7 牛奶 6 99.9 1 2021-01-06 
8 奥特曼 200 16.0 1 2021-01-06 
9 哇哈哈 14 2.0 1 2021-01-06 
11 奥里给 6 1000.0 1 2021-01-13 

当我们使用只是查询的时候一般可以使用Statement就可以,但是我们日常的业务逻辑处理中不单单只是查询,还会有DML操作,当我们执行DML操作时,为了防止sql注入,就不可以使用Statement,我们需要使用PreparedStatement接口来代替他了,PreparedStatement是Statement的子接口。
使用PreparedStatement接口的一些好处:
1.提高执行语句的性能
2.可读性和可维护性更好
3.简化Statement中的操作
4.安全性更好(可预防sql注入)

package com.isoft;

import java.sql.*;
import java.util.Scanner;

public class Main {
    private static String url="jdbc:mysql://localhost:3306/supermarket?serverTimezone =Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false";
    private static String user="root";
    private static String password="root";
    public static void main(String[] args)throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn=null;
        conn= DriverManager.getConnection(url,user,password);
        String sql="insert into goods(gname,count,price,uid,createtime) values(?,?,?,?,NOW())";
        PreparedStatement preparedStatement=conn.prepareStatement(sql);
        Scanner s=new Scanner(System.in);
        System.out.println("请输入商品名称");
        Object temp=s.next();
        System.out.println("请输入商品数量");
        Object temp1=s.next();
        System.out.println("请输入商品单价");
        Object temp2=s.next();
        System.out.println("请输入操作者编号");
        Object temp3=s.next();
        preparedStatement.setObject(1,temp);
        preparedStatement.setObject(2,temp1);
        preparedStatement.setObject(3,temp2);
        preparedStatement.setObject(4,temp3);
        System.out.println(preparedStatement.executeUpdate());

      String sql1="SELECT * FROM goods;";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql1);
        while (rs.next()) {
            System.out.print( rs.getInt(1)+" ");
            System.out.print(rs.getString(2)+" ");
            System.out.print(rs.getInt(3)+" ");
            System.out.print(rs.getFloat(4)+" ");
            System.out.print( rs.getInt(5)+" ");
            System.out.println(rs.getDate(6)+" ");

        }
        conn.close();
    }
}
运行结果:
请输入商品名称
大白兔
请输入商品数量
100
请输入商品单价
0.3
请输入操作者编号
123
1
1 苹果 45 10.0 1 2021-01-12 
2 水杯 81 27.5 1 2021-01-06 
4 杯子 2 3.5 1 2021-01-06 
5 杯子 3 7.5 1 2021-01-06 
6 水杯 5 13.8 1 2021-01-06 
7 牛奶 6 99.9 1 2021-01-06 
8 奥特曼 200 16.0 1 2021-01-06 
9 哇哈哈 14 2.0 1 2021-01-06 
11 奥里给 6 1000.0 1 2021-01-13 
12 豆干 100 1.0 123 2021-02-03 
13 辣条 100 0.5 123 2021-02-03 
14 大白兔 100 0.3 123 2021-02-03 

优化上述代码:

建立三个类
在这里插入图片描述

DBTool类:
package com.isoft;
import java.sql.*;
public class DBTool {
    private String url = "jdbc:mysql://localhost:3306/supermarket?serverTimezone =Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false";
    private String userName = "root";
    private String pwd = "root";
    private Connection conn;
    private PreparedStatement prep;

    public DBTool() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(url, userName, pwd);
    }

    public int update(String sql, Object ... objs) throws Exception {
        //切记Object空格...空格objs
/*可变参数的使用方法,在方法中定义未知数量的参数
*格式为:修饰符 返回值类型 方法名(参数类型…变量名){}
* 如果未知个数的参数类型不同,那么可以把可变参数类型定义为Object
* 修饰符 返回值类型 方法名(Object … 变量名){}
* */
        prep = conn.prepareStatement(sql);
        for (int i = 0; i < objs.length; i++) {
            prep.setObject(i + 1, objs[i]);
        }
        return prep.executeUpdate();
    }
        public void show()throws Exception{
            String sql1 = "SELECT * FROM goods;";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql1);
            while (rs.next()) {
                System.out.print(rs.getInt(1) + " ");
                System.out.print(rs.getString(2) + " ");
                System.out.print(rs.getInt(3) + " ");
                System.out.print(rs.getFloat(4) + " ");
                System.out.print(rs.getInt(5) + " ");
                System.out.println(rs.getDate(6) + " ");
            }
        }
        public void close ()throws Exception {
            if (prep != null && !prep.isClosed()) {
                prep.close();
            }
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        }
    }

GoodsImpl类:
package com.isoft;
import java.util.Scanner;
public class GoodsImpl {
    public int add() throws Exception {
        String sql = "insert into goods(gname,count,price,uid,createtime) values(?,?,?,?,NOW())";
        Scanner s = new Scanner(System.in);
        System.out.println("请输入商品名称");
        Object temp = s.next();
        System.out.println("请输入商品数量");
        Object temp1 = s.next();
        System.out.println("请输入商品单价");
        Object temp2 = s.next();
        System.out.println("请输入操作者编号");
        Object temp3 = s.next();
        DBTool tool=new DBTool();
        int str=tool.update(sql,temp,temp1,temp2,temp3);
        tool.close();
        return str;
    }
}
Main类:
package com.isoft;
public class Main {
    public static void main(String[] args) throws Exception {
        GoodsImpl g=new GoodsImpl();
        g.add();
        DBTool tool=new DBTool();
        tool.show();
        tool.close();
    }
}
运行结果:
请输入商品名称
阿尔卑斯
请输入商品数量
1000
请输入商品单价
0.5
请输入操作者编号
123
1 苹果 45 10.0 1 2021-01-12 
2 水杯 81 27.5 1 2021-01-06 
4 杯子 2 3.5 1 2021-01-06 
5 杯子 3 7.5 1 2021-01-06 
6 水杯 5 13.8 1 2021-01-06 
7 牛奶 6 99.9 1 2021-01-06 
8 奥特曼 200 16.0 1 2021-01-06 
9 哇哈哈 14 2.0 1 2021-01-06 
11 奥里给 6 1000.0 1 2021-01-13 
12 豆干 100 1.0 123 2021-02-03 
13 辣条 100 0.5 123 2021-02-03 
14 大白兔 100 0.3 123 2021-02-03 
15 水果 100 2.0 123 2021-02-03 
16 金丝猴 100 2.0 123 2021-02-03 
17 阿尔卑斯 1000 0.5 123 2021-02-03 -



  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤使用 Java 的 prepareStatement 方法往数据库传入数据,并使用 resultSet 查看结果: 1. 导入相关的包和依赖项,例如 JDBC 驱动程序。 2. 建立与数据库的连接,可以使用 DriverManager.getConnection() 方法。 3. 创建一个 PreparedStatement 对象,可以使用 connection.prepareStatement() 方法。在创建 PreparedStatement 对象时,需要指定 SQL 语句,可以使用 ? 作为占位符。 ```java String sql = "INSERT INTO table_name (col1, col2, col3) VALUES (?, ?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); ``` 4. 为占位符设置值,可以使用 setXXX() 方法,其中 XXX 表示要设置的数据类型,例如 setInt()、setString() 等。需要注意的是,占位符的位置是从 1 开始的。 ```java statement.setInt(1, 123); statement.setString(2, "abc"); statement.setDouble(3, 4.56); ``` 5. 执行 SQL 语句,可以使用 executeUpdate() 方法。该方法返回一个整数,表示受影响的行数。 ```java int rows = statement.executeUpdate(); ``` 6. 使用 resultSet 查看结果,可以使用 connection.createStatement() 方法创建一个 Statement 对象,然后使用 executeQuery() 方法执行 SQL 查询语句,最后使用 resultSet 获取查询结果。 ```java Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM table_name"); while (resultSet.next()) { int col1 = resultSet.getInt("col1"); String col2 = resultSet.getString("col2"); double col3 = resultSet.getDouble("col3"); // do something with the data } ``` 7. 关闭连接、PreparedStatement 对象和 ResultSet 对象,可以使用 close() 方法。 ```java resultSet.close(); statement.close(); connection.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值