暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第十一章 JDBC与MySQL数据库(9)——使用预处理语句

凯哥的故事 2020-09-09
1050


使用预处理语句



Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象。本节学习怎样使用预处理语句对象操作数据库中的表。

①预处理语句的优点

向数据库发送一个SQL语句,例如select * from mess,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令,完成有关的操作。如果不断地向数据库提交SQL语句,势必增加数据库中SQL解释器的负担,影响执行的速度。如果应用程序能针对连接的数据库,事先就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。

对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么con就可以调用prepareStatement (String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用下列方法都可以使得该底层内部命令被数据库执行:

ResultSet executeQuery()
boolean execute()
int executeUpdate()

只要编译好了PreparedStatement对象,那么该对象可以随时执行上述方法,显然提高了访问数据库的速度。

②使用通配符

在对SQL进行预处理时可以使用通配符?(英文问号)来代替字段的值,只要在预处理语句执行之前再设置通配符所代表的具体值即可。例如:

String str = "select * from mess where height < ? and name= ?";
PreparedStatement sql = con.prepareStatement(str);

在sql对象执行之前,必须调用相应的方法设置通配符?代表的具体值,例如:

sql.setFloat(1,1.76f);
sql.setString(2, "武泽");

指定上述预处理SQL语句sql中第1个通配符?代表的值是1.76,第2个通配符?代表的值是'武泽'。通配符按照它们在预处理SQL语句中从左到右依次出现的顺序分别被称为第1个、第2个、……、第m个通配符。使用通配符可以使得应用程序更容易动态地改变SQL语句中关于字段值的条件。

预处理语句设置通配?的值的常用方法有:

void setDate(int parameterIndex,Date x)
void setDouble(int parameterIndex,double x)
void setFloat(int parameterIndex,float x)
void setInt(int parameterIndex,int x)
void setLong(int parameterIndex,long x)
void setString(int parameterIndex,String x)

下面的例子5中使用预处理语句向mess表添加记录并查询了姓张的记录(使用了例子2中的GetDBConnection类)。

import java.sql.*;
public class Example5 {
public static void main(String[] args) {
Connection con;
PreparedStatement preSql; //预处理语句对象preSql
ResultSet rs;
con = GetDBConnection.connectDB("students", "root", "");
if(con == null)return;
String sqlStr = "insert into mess values(?,?,?,?)";
try {
preSql = con.prepareStatement(sqlStr); //得到预处理语句对象preSql
preSql.setString(1,"A001"); //设置第1个?代表的值
preSql.setString(2,"刘伟"); //设置第2个?代表的值
preSql.setString(3,"1999-9-10"); //设置第3个?代表的值
preSql.setFloat(4,1.77f); //设置第4个?代表的值
int ok = preSql.executeUpdate();
sqlStr = "select * from mess where name like ? ";
preSql = con.prepareStatement(sqlStr); //得到预处理语句对象preSql
preSql.setString(1, "张%"); //设置第1个?代表的值
rs = preSql.executeQuery();
while (rs.next()) {
String number = rs.getString(1);
String name = rs.getString(2);
Date date = rs.getDate(3);
float h = rs.getFloat(4);
System.out.printf("%s\t",number);
System.out.printf("%s\t",name);
System.out.printf("%s\t",date);
System.out.printf("%.2f\n",h);
}
con.close();
}
catch (SQLException e) {
System.out.println("记录中number值不能重复"+e);
}
}
}


文章转载自凯哥的故事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论