zoukankan      html  css  js  c++  java
  • Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用

    预编译

    SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

    预编译的优点

    1、PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程。
    2、使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
    3、statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支持批处理
    4、PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。这种转换也带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
    5、PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。 

    预编译的核心代码

    //预编译方式构建SQL查询:
    String sql = "select * from student where year(birthday) between ? and ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, "1987");
    ps.setString(2, "1990");
    rs = ps.executeQuery();

    预编译的简单范例

    以下方法的第一个参数是一个SQL 语句,第二三个参数是需要查询的范围。
    	/**PreparedStatement 预编译之查询栏目的范围 */
    	public ResultSet StartQuery(String sql,String s1, String s2) {
    		getConnection();
    		try {
    			pStatement = connection.prepareStatement(sql);
    			pStatement.setString(1, s1);
    			pStatement.setString(2, s2);
    			rSet = pStatement.executeQuery();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return rSet;
    	}

    应用

    		System.out.println("生日范围查询:");
    		ResultSet resultSet = jDemo1.StartQuery("select * from t_userr where year(birthdate) between ? and ?","1992","1992");
    		jDemo1.AllResult(resultSet);

    预编译的拓展范例一(SQL查询)

    以下,我们对上面的方法进行拓展,使之能适应更宽泛的情况。
    第一个参数是SQL语句,第二个参数是查询的一个参数列表。(一数组形式存放)
    	/** PreparedStatement 预编译之查询拓展版 */
    	public ResultSet StartQueryLook(String sql,Object[] s) {
    		getConnection();
    		try {
    			pStatement = connection.prepareStatement(sql);
    			for (int i = 0; i < s.length; i++) {
    				pStatement.setObject(i+1, s[i]);
    			}
    			rSet = pStatement.executeQuery();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return rSet;
    	}

    应用

    		//预编译之查询拓展版应用1
    		System.out.println("生日范围查询:");
    		String[] s1 = {"1992","1992"};
    		ResultSet resultSet = jDemo1.StartQueryLook("select * from t_userr where year(birthdate) between ? and ?",s1);
    		jDemo1.AllResult(resultSet);
    		//预编译之查询拓展版应用2
    		System.out.println("ID范围查询:");
    		String[] s2 = {"100","200"};
    		ResultSet resultSet2 = jDemo1.StartQueryLook("select * from t_userr where id between ? and ?",s2);
    		jDemo1.AllResult(resultSet2);

    预编译的拓展范例二(SQL增添、删除、修改)

    	/** PreparedStatement 预编译之增删改拓展版 */
    	public int StartQueryAll(String sql,Object[] objArr) {
    		int count = 0;
    		getConnection();
    		try {
    			pStatement = connection.prepareStatement(sql);
    			if(objArr!=null && objArr.length>0) {
    				for (int i = 0; i < objArr.length; i++) {
    					pStatement.setObject(i+1, objArr[i]);
    				}
    			}
    			count = pStatement.executeUpdate();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			close();
    		}
    		return count;
    	}

    应用

    		//预编译之增删改拓展版:批量增加
    		for (int i = 0; i < 10; i++) {
    			Object[] s3 = {10,10};
    			jDemo1.StartQueryAll("insert into jdbctest(username,password) values(?,?)",s3);
    		}
    		//预编译之增删改拓展版:批量删除
    		System.out.println("删除多条:");
    		jDemo1.StartQueryAll("delete from t_userr where id between ? and ?",new Object[]{"1010","1030"});




  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3226225.html
Copyright © 2011-2022 走看看