使用预处理语句
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; //预处理语句对象preSqlResultSet rs;con = GetDBConnection.connectDB("students", "root", "");if(con == null)return;String sqlStr = "insert into mess values(?,?,?,?)";try {preSql = con.prepareStatement(sqlStr); //得到预处理语句对象preSqlpreSql.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); //得到预处理语句对象preSqlpreSql.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);}}}







