JDBC之PreparedStatement类中预编译的综合应用解析
程序员文章站
2023-12-19 15:08:46
预编译的优点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"});