Java数据库编程---PreparedStatement接口

PreparedStatement简介

PreparedStatement是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表之中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后再进行设置,以插入数据为例,使用PreparedStatement插入数据时,数据表中的指针首先指向最后一条数据之后,但是里面的内容是不知道的,而是等待用户分别设置。


 

使用Statement操作的时候,肯定要执行的是一条完整的SQL语句,执行之前是使用Connection直接创建的。


通过Connection接口中的:

prepareStatement

PreparedStatement prepareStatement(String sql)

                                   throws SQLException

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

之后使用一系列的setXXX()方法设置内容,根据位置设置。

如果执行更新语句的话,则会返回更新数据的记录数。

注意:

关于日期的输入问题:在正常情况下都使用java.util.Date表示日期,但是在PreparedStatement中如果要想使用日期则必须使用java.sql.Date类型。


注意:设置日期格式的问题

在PreparedStatement中定义了setDate()方法,此方法可以设置日期内容,但是此方法在使用时,后面的Date类型变量是java.sql.Date,而不是java.util.Date,所以如果要想将一个java.util.Date类型的内容变为java.sql.Date类型的内容应该使用如下的语句形式:

String birthday = “2007-08-27”; //生日

java.util.Date temp = null;     //声明一个Date对象

//通过SimpleDateFormat类将一个字符串变为java.util.Date类型。

Temp = new SimpleDateFormat(“YYYY-MM-DD”).parse(birthday);

//通过java.util.Date取出具体的日期数,并将其变为java.sql.Date类型。

java.sql.Date bir = new java.sql.Date(temp.getTime());


例子:使用PreparedStatement执行数据库的插入操作

【PreparedStatementDemo01.java代码如下】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

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/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;   //数据库操作

    String name = "荷花";

    String password = "www.sun.com";

    int age = 18;

    String sex = "女";

    String birthday = "2014-02-16";

    java.util.Date temp = null;

    temp = new SimpleDateFormat("YYYY-MM-DD").parse(birthday);//将字符串类型的数据变为Date类型的数据。

    java.sql.Date bir = new java.sql.Date(temp.getTime());//将java.util.Date类型转换为java.sql.Date类型。

    String sql = "INSERT INTO user(name,password,age,sex,birthday) VALUES(?,?,?,?,?)";

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql); //实例化preparedStatement对象

    pstmt.setString(1,name);

    pstmt.setString(2,password);

    pstmt.setInt(3,age);

    pstmt.setString(4,sex);

    pstmt.setDate(5,bir);

    int t = pstmt.executeUpdate();//执行更新

    System.out.println(t);

    pstmt.close();

    conn.close();         //数据库关闭

}

};

编译运行的结果如下:


输出的数据“1”表示已经插入一行。此时user表已经发生改变:

插入数据前:


插入数据后:


可见,数据插入已经成功。


既然可以通过此接口完成更新操作,那么就可以通过此接口完成查询操作

【PreparedStatementDemo02.java代码如下】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.ResultSet;

import java.sql.PreparedStatement;

import java.text.SimpleDateFormat;

public class PreparedStatementDemo02{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;   //数据库操作

    String keyWord = "花";  //设置查询关键字

    ResultSet rs = null;    //接收查询结果

    String sql = "SELECT id,name,password,age,sex,birthday" + 

    " FROM user WHERE name LIKE ? OR password LIKE ? OR sex LIKE ?";

    //双引号和FROM之间如果没有空格的话,则运行的时候会产生错误。

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql); //实例化preparedStatement对象

    pstmt.setString(1,"%"+keyWord+"%");

    pstmt.setString(2,"%"+keyWord+"%");

    pstmt.setString(3,"%"+keyWord+"%");

    rs = pstmt.executeQuery(); //执行查询

    while(rs.next()){

        int id = rs.getInt(1);

        String name = rs.getString(2);

        String pass = rs.getString(3);

        int age = rs.getInt(4);

        String sex = rs.getString(5);

        java.util.Date d = rs.getDate(6);

        System.out.print("编号: " + id + ";");

        System.out.print("姓名: " + name + ";");

        System.out.print("密码: " + pass + ";");

        System.out.print("年龄: " + age + ";");

        System.out.print("性别: " + sex + ";");

        System.out.println("生日: " + d + ";");

        System.out.println("---------------------------");

    }

    rs.close();

    pstmt.close();

    conn.close();         //数据库关闭

}

};

编译运行的结果如下:


可见,包含关键字“花”的结果全部列出来了。


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

【PreparedStatementDemo03.java代码如下】

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.ResultSet;

import java.sql.PreparedStatement;

import java.text.SimpleDateFormat;

public class PreparedStatementDemo03{

    //定义MySQL的数据库驱动程序

    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    //定义MySQL数据库的连接地址

    public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    //MySQL数据库的连接用户名

    public static final String DBUSER = "root";

    //MySQL数据库的连接密码

    public static final String DBPASS = "mysqladmin";

    public static void main(String args[]) throws Exception{

    Connection conn = null;    //数据库连接

    PreparedStatement pstmt = null;   //数据库操作

    String keyWord = "花";  //设置查询关键字

    ResultSet rs = null;    //接收查询结果

    String sql = "SELECT id,name,password,age,sex,birthday" + " FROM user ";

    //双引号和FROM之间如果没有空格的话,则运行的时候会产生错误。

    Class.forName(DBDRIVER);  //加载驱动程序

    conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);

    pstmt = conn.prepareStatement(sql); //实例化preparedStatement对象

    rs = pstmt.executeQuery(); //执行查询

    while(rs.next()){

        int id = rs.getInt(1);

        String name = rs.getString(2);

        String pass = rs.getString(3);

        int age = rs.getInt(4);

        String sex = rs.getString(5);

        java.util.Date d = rs.getDate(6);

        System.out.print("编号: " + id + ";");

        System.out.print("姓名: " + name + ";");

        System.out.print("密码: " + pass + ";");

        System.out.print("年龄: " + age + ";");

        System.out.print("性别: " + sex + ";");

        System.out.println("生日: " + d + ";");

        System.out.println("---------------------------");

    }

    rs.close();

    pstmt.close();

    conn.close();         //数据库关闭

}

};

编译运行的结果如下:


可见,全部的结果都被查询出来了。


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

实际上,在实际的开发应用中是不会有人使用Statement接口的,因为其采用的是拼凑的SQL语句形式,那么这样一来就有可能造成SQL的注入漏洞。举例:最早的国内的大部分站点,大家只要输入“’”,一查询,基本上站点就完蛋。


小结:

1.PreparedStatement的基本工作原理:插入时,先占位,之后再设置内容。

2.开发中建议不要使用Statement接口,而使用PreparedStatement接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值