PreparedStatement

    xiaoxiao2021-12-14  25

    虽然可以利用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(DBURL, DBUSER, PASSWORD); // 连接数据库

            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(DBURL, DBUSER, PASSWORD); // 连接数据库

            // 如果在编写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(DBURL, DBUSER, PASSWORD); // 连接数据库

            // 如果在编写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(DBURL, DBUSER, PASSWORD); // 连接数据库

            // 如果在编写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(DBURL, DBUSER, PASSWORD); // 连接数据库

            // 如果在编写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(DBURL, DBUSER, PASSWORD); // 连接数据库

            // 如果在编写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(DBURL, DBUSER, PASSWORD); // 连接数据库

            // 如果在编写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();

        }

    }

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

    转载请注明原文地址: https://ju.6miu.com/read-964839.html

    最新回复(0)