PreparedStatement

虽然可以利用Statement操作数据库,但是如果在开发之中,Statement是不可能使用的,以增加数据为例,在本表之中姓名、生日、介绍应该由用户自己输入。

范例:问题引出

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.Statement;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        String name = "Mr'SMITH" ;

        String birthday = "2012-12-25" ;

        String note = "荒唐的世界末日" ;

        Connection conn = null; // 每一个Connection对象都表示一个连接

        Statement stmt = null ; // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        stmt = conn.createStatement() ; // 创建Statement对象

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = " INSERT INTO member(mid,name,birthday,note) "

                + " VALUES (myseq.nextval,'"+name+"', "

                + " TO_DATE('"+birthday+"','yyyy-mm-dd'),'"+note+"') " ;

        System.out.println(sql);

        int len = stmt.executeUpdate(sql) ; // 执行SQL

        System.out.println("更新行数:" + len);

        conn.close() ;

    }

}

INSERT INTO member(mid,name,birthday,note)  VALUES (myseq.nextval,'Mr'SMITH', TO_DATE('2012-12-25','yyyy-mm-dd'),'荒唐的世界末日')

Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00917: 缺失逗号

         此时的程序中由于SQL需要拼凑的原因,那么用户一旦输入了一些敏感的字符,就有可能造成错误,严重的就有可能出现严重的安全漏洞,所以就得出结论:拼凑的SQL不能用。

         在实际的开发之中永恒不会有人去使用Statement,而都使用Statement的子接口:PreparedStatement(预处理)。提升操作的性能。那么现在如果要使用PreparedStatement接口,则就必须通过Connection接口中的新方法实例化对象:

                   · 方法:public PreparedStatement prepareStatement(String sql) throws SQLException ;

         当取得了PreparedStatement接口对象之后,就可以利用新的方法操作:

                   · 更新操作:public int executeUpdate() throws SQLException;

                   · 查询操作:public ResultSet executeQuery() throws SQLException。

         而最为重要的是,在创建PreparedStatement的时候所需要设置的内容都要通过一个占位符“?”表示,而在执行更新和查询之前,需要使用一系列的setXxx()方法设置“?”的数据。

         但是在进行setDate()方法操作的时候需要注意一点:操作的是java.sql.Date,而不是java.util.Date。java.sql.Date是java.util.Date的子类,而在java.util.Date下一共有三个子类,而且这三个子类都是保存在java.sql包之中:Date(保存日期)、Time(保存时间)、TimeStamp(时间戳,日期 + 时间)。

范例:实现数据增加

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.util.Date;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        String name = "Mr'SMITH" ;

        Date birthday = new Date() ;

        String note = "荒唐的世界末日" ;

        Connection conn = null; // 每一个Connection对象都表示一个连接

        PreparedStatement pstmt = null ;    // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = " INSERT INTO member(mid,name,birthday,note) "

                + " VALUES (myseq.nextval,?,?,?) " ;

        pstmt = conn.prepareStatement(sql) ;    // 创建PreparedStatement接口对象

        pstmt.setString(1, name);

        pstmt.setDate(2, new java.sql.Date(birthday.getTime()));

        pstmt.setString(3, note);

        int len = pstmt.executeUpdate() ;   // 执行SQL

        System.out.println("更新行数:" + len);

        conn.close() ;

    }

}

         在开发之中为了保证更新的质量,所有的操作一定使用的是PreparedStatement,以上做的只是一个增加(修改和删除也一样),而重点在于下面的查询操作上。

范例:查询全部数据

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Date;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        Connection conn = null; // 每一个Connection对象都表示一个连接

        PreparedStatement pstmt = null ;    // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = " SELECT mid,name,birthday,note FROM member " ;

        pstmt = conn.prepareStatement(sql) ;

        ResultSet rs = pstmt.executeQuery() ;

        while (rs.next()) {

            int mid = rs.getInt(1) ;

            String name = rs.getString(2) ;

            Date birthday = rs.getDate(3) ;

            String note = rs.getString(4) ;

            System.out.println(mid + "," + name + "," + birthday + "," + note);

        }

        conn.close() ;

    }

}

范例:根据编号查询,查询指定编号的数据,此时只会返回单行多列数据。

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Date;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        int mid = 15 ;  // 查询数据

        Connection conn = null; // 每一个Connection对象都表示一个连接

        PreparedStatement pstmt = null ;    // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = " SELECT mid,name,birthday,note "

                + " FROM member WHERE mid=?" ;

        pstmt = conn.prepareStatement(sql) ;

        pstmt.setInt(1, mid);

        ResultSet rs = pstmt.executeQuery() ;

        if (rs.next()) {

            mid = rs.getInt(1) ;

            String name = rs.getString(2) ;

            Date birthday = rs.getDate(3) ;

            String note = rs.getString(4) ;

            System.out.println(mid + "," + name + "," + birthday + "," + note);

        } else {

            System.out.println("没有数据返回!");

        }

        conn.close() ;

    }

}

范例:模糊查询

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Date;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        String keyWord = "谢" ;

        Connection conn = null; // 每一个Connection对象都表示一个连接

        PreparedStatement pstmt = null ;    // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = " SELECT mid,name,birthday,note "

                + " FROM member WHERE name LIKE ?" ;

        pstmt = conn.prepareStatement(sql) ;

        pstmt.setString(1, "%" + keyWord + "%");    // 在此写%

        ResultSet rs = pstmt.executeQuery() ;

        while (rs.next()) {

            int mid = rs.getInt(1) ;

            String name = rs.getString(2) ;

            Date birthday = rs.getDate(3) ;

            String note = rs.getString(4) ;

            System.out.println(mid + "," + name + "," + birthday + "," + note);

        }

        conn.close() ;

    }

}

         如果在执行模糊查询的时候不设置任何的关键字,表示查询全部。

范例:分页显示

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Date;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        int currentPage = 2;

        int lineSize = 5;

        String keyWord = "";

        Connection conn = null; // 每一个Connection对象都表示一个连接

        PreparedStatement pstmt = null; // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = "SELECT * FROM ("

                + " SELECT mid,name,birthday,note,ROWNUM rn "

                + " FROM member WHERE name LIKE ? AND ROWNUM<=?) temp "

                + " WHERE temp.rn>? ";

        pstmt = conn.prepareStatement(sql);

        pstmt.setString(1, "%" + keyWord + "%"); // 在此写%

        pstmt.setInt(2, currentPage * lineSize);

        pstmt.setInt(3, (currentPage - 1) * lineSize);

        ResultSet rs = pstmt.executeQuery();

        while (rs.next()) {

            int mid = rs.getInt(1);

            String name = rs.getString(2);

            Date birthday = rs.getDate(3);

            String note = rs.getString(4);

            System.out.println(mid + "," + name + "," + birthday + "," + note);

        }

        conn.close();

    }

}

范例:统计数据行

package cn.mldn.demo;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

public class TestDemo {

    private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";

    private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";

    private static final String DBUSER = "scott";

    private static final String PASSWORD = "tiger";

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

        String keyWord = "";

        Connection conn = null; // 每一个Connection对象都表示一个连接

        PreparedStatement pstmt = null; // 定义数据库操作对象

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

        conn = DriverManager.getConnection(DBURLDBUSERPASSWORD); // 连接数据库

        // 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格

        String sql = "SELECT COUNT(mid) FROM member WHERE name LIKE ?";

        pstmt = conn.prepareStatement(sql);

        pstmt.setString(1, "%" + keyWord + "%"); // 在此写%

        ResultSet rs = pstmt.executeQuery();

        if (rs.next()) {    // 永恒有数据返回

            System.out.println(rs.getInt(1));

        }

        conn.close();

    }

}

         以上所给出的几个基本的数据库操作,一定要拿下,明天就要用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值