java中执行SQL语句最常用的有两种处理机制:PrepareStatement(带有预处理)和Statement。
他们使用起来略有不同(其他方面的不同我在这里就不介绍了,这里主要是讲一个问题)。
举个使用的例子:有如下数据二维表,personTable
姓名(name) 年龄(age) 婚否(married)
张三 20 未婚
李四 25 已婚
设婚否字段为bit类型,即未婚=0,已婚=1。
设问题,将名为李四的人年龄修改为22,婚否修改为未婚。
Connection conn = DBconn.getConnction();(假设)
首先使用PrepareStatement来执行修改语句:
String sql = "update personTable set age=?, married=? where name=?";
PrepareStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(22);
pstmt.setBoolean(false);// boolean型
pstmt.setString('李四');
pstmt.executeUpdate();
运行结果:成功!
下面使用Statement。
Statement stmt = conn.createStatement();
int age = 22;
boolean married = false;
String name = "李四";
String sql = "update personTable set age=" + age + ", married=" + married +
" where name=' " + name + " ' ";
stmt.executeUpdate(sql);
运行结果:失败!
报异常:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]列名 'true' 无效。
语句打印:update personTable set age = 22, married = false where name = '李四',这样的语句在SqlServer中是不允许的,因为它没有boolean类型,只有bit型,所以正确的语句应该是这样:
update personTable set age = 22, married = 0 where name = '李四'
这是为什么呢,为什么PreparementStatement的语句对了呢?
因为在PrepareStatement中有预处理机制,所以会将SQL语句中的true和false自动转换成1或0,而Statement则没有这个功能,所以就会出现这个错误
可是在执行如上边那种特别简单的sql语句的时候Statement的效率明显的要比PrepareStatement的高,那么Statement又怎么来处理呢?其实很简单,请看:
只要将变量sql的赋值写成这样:
String sql = "update personTable set age=" + age + ", married=" + (married ? 1 : 0) +
" where name=' " + name + " ' ";
怎么样是不是成功了呢?其实预处理方法里也是这么写的呢,哈哈!(众看客:原来这么简。。简单啊,这我也会啊)