欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JDBC之PreparedStatement类中预编译的综合应用解析

程序员文章站 2023-12-16 17:15:58
预编译的优点1、preparedstatement是预编译的,对于批量处理可以大大提高效率. 也叫jdbc存储过程。2、使用 statement 对象。在对数据库只执行一次...

预编译的优点
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"});

上一篇:

下一篇: