JDBC数据库编程:PreparedStatement接口

使用PreparedStatement进行数据库的更新及查询操作。

PreparedStatement

PreparedStatement是statement子接口。属于预处理。

使用statement操作时候肯定要执行一条完整的sql语句。执行之前是使用connection直接创建的。

好比占座,证明此坐已经有人,但是等待人的到来。

常用方法:

connection接口:

 PreparedStatement prepareStatement(String sql) 
          创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 

通过以上方法可以得到PreparedStatement 接口实例。

之后通过一系列的setXXX方法设置内容,根据位置设置。

如果更新的话,就会返回更新数据的记录数(更新了几条数据)。

注意点:

关于日期输入问题:正常情况都是使用java.utill.Date表示日期,但是preparedStatement中,如果要想使用日期,必须使用java.sql.Data类型。

java.lang.Object
  继承者 java.util.Date
      继承者 java.sql.Date

要想将一个java.utill.Data转换成java.sql.Data,应该使用如下形式:

  通过SimpleDateFormat类将一个字符串编程java.utill.Data类型。

  通过java.utill.Data取出具体日期数(通过getTime()方法),将其变为java.sql.Data类型。

范例:PreparedStatement执行数据库的插入操作。

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.text.SimpleDateFormat ;
public class PreparedStatementDemo01 {
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定义MySQL数据库的连接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL数据库的连接用户名
    public static final String DBUSER = "root" ;
    // MySQL数据库的连接密码
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有异常抛出
        Connection conn = null ;        // 数据库连接
        PreparedStatement pstmt = null ;    // 数据库操作
        String name = "李兴华" ;    // 姓名
        int age = 30 ;    // 年龄
        String birthday = "2007-08-27" ;    // 生日      日期类型转换
      java.util.Date temp = null ;
      temp = new SimpleDateFormat("yyyy-MM-dd").parse(birthday) ;
      java.sql.Date bir = new java.sql.Date(temp.getTime()) ;
        String sql = "INSERT INTO user(name,age,birthday) VALUES (?,?,?) " ;
        Class.forName(DBDRIVER) ;    // 加载驱动程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;    // 实例化PreapredStatement对象
        pstmt.setString(1,name) ;  设置列的内容。
        pstmt.setInt(2,age) ;
        pstmt.setDate(3,bir) ;
        int t = pstmt.executeUpdate() ;    // 执行更新
        System.out.println(t);
        pstmt.close() ;
        conn.close() ;            // 数据库关闭
    }
};

输出结果:

Sun Apr 09 21:58:04 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
1

表示,更新一条数据。

查询结果:

既然可以通过此接口完成更新操作,

那么通过此接口执行查询操作。

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet;
import java.text.SimpleDateFormat ;
public class PreparedStatementDemo01 {
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定义MySQL数据库的连接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL数据库的连接用户名
    public static final String DBUSER = "root" ;
    // MySQL数据库的连接密码
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有异常抛出
        Connection conn = null ;        // 数据库连接
        PreparedStatement pstmt = null ;    // 数据库操作
        String keyWord = "李" ;     // 设置查询关键字
        ResultSet rs = null ;    // 接收查询结果
        String sql = "SELECT name,age,birthday " +
                " FROM user WHERE name LIKE ? " ;
        Class.forName(DBDRIVER) ;    // 加载驱动程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;    // 实例化PreapredStatement对象
        pstmt.setString(1,"%"+keyWord+"%") ;
        rs = pstmt.executeQuery() ;    // 执行查询
        while(rs.next()){
            String name = rs.getString(1) ;
            int age = rs.getInt(2) ;
            java.util.Date d = rs.getDate(3) ;
            System.out.print("姓名:" + name + ";") ;
            System.out.print("年龄:" + age + ";") ;
            System.out.println("生日:" + d + ";") ;
            System.out.println("-------------------------") ;
        }
        rs.close() ;
       pstmt.close() ;
        conn.close() ;            // 数据库关闭
    }
};

输出结果:

Sun Apr 09 22:04:30 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
姓名:李兴华;年龄:30;生日:2007-08-27-------------------------

如果现在假设查询的是全部记录,不需要设置任何内容,只需要创建完PreparedStatement对象后直接查询即可。

package 类集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet;
import java.text.SimpleDateFormat ;
public class PreparedStatementDemo01 {
    // 定义MySQL的数据库驱动程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定义MySQL数据库的连接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL数据库的连接用户名
    public static final String DBUSER = "root" ;
    // MySQL数据库的连接密码
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有异常抛出
        Connection conn = null ;        // 数据库连接
        PreparedStatement pstmt = null ;    // 数据库操作
        ResultSet rs = null ;    // 接收查询结果
        String sql = "SELECT name,age,birthday FROM user" ;
        Class.forName(DBDRIVER) ;    // 加载驱动程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        pstmt = conn.prepareStatement(sql) ;    // 实例化PreapredStatement对象
      rs = pstmt.executeQuery() ;    // 执行查询
        while(rs.next()){
            String name = rs.getString(1) ;
            int age = rs.getInt(2) ;
            java.util.Date d = rs.getDate(3) ;
            System.out.print("姓名:" + name + ";") ;
            System.out.print("年龄:" + age + ";") ;
            System.out.println("生日:" + d + ";") ;
            System.out.println("-------------------------") ;
        }
        rs.close() ;
        pstmt.close() ;
        conn.close() ;            // 数据库关闭
    }
};

与之前相比,删除了设置查询条件语句。

在开发中到底使用preparedStatement还是使用statement接口操作中呢?

实际上开发中是不会有人使用statement接口的,因为他是采用拼凑的SQL语句,这样就可能会造成SQL注入漏洞

举例,最早的网站只要输入“,”,那么网站基本完蛋了。

总结:

preparedStatement基本工作原理,插入时,先占位,之后再设置内容。

原文地址:https://www.cnblogs.com/alsf/p/6686575.html