一。查询语句
1)使用executeQuery单个查询数据
该方法用于执行产生单个结果集的SQL语句,不能执行insert、update、delete等单一DDL语句(create、drop等)。如果执行这些语句将会抛出SQLException异常。但当执行多条语句时,可以执行DDL语句,但第一条语句必须是返回结果集的SQL语句,后面跟着的是其他的任何SQL语句。
方法定义为:ResultSet executeQuery(String sql) 。通过对返回的对象来访问查询结果集,最常用的操作是扫描结果集,可以使用ResultSet的next方法,返回的“游标”处于结果集的第一个对象的上面,没有指向第一个对象。主要完成两个任务:
1.判断是否还有下一条记录。如果有返回true。
2.如果有下一条记录,将当前记录指针后移一个位置。(
在读数据时可以根据列索引和列名来读取字段。getXxx(String xx)。
在某些情况下并不需要得到全部的查询结果,可以使用Statement接口的setMaxRows方法限制返回的记录数。此外还可以使用getMaxRows方法获得最大返回记录数。
ResultSet其他功能:
wasNull方法:判断最后一次使用getXxx方法读取的字段值是否为NULL。
findColumn方法:获取某个列名在列集合中的位置。
2)使用execute执行单个查询语句
execute可以执行任何SQL语句,并不直接返回ResultSet对象,方法如下:
boolean execute(String sql)
通过boolean的值确定执行的是返回结果集的SQL语句(select),还是不返回结果集的语句。如果返回true,可以通过Statement接口的getResultSet方法返回ResultSet对象。如果返回false,可以通过getUpdateCount方法返回被影响的记录数。此外,也可以直接通过getResultSet方法的返回值判断执行的是何种语句。
if(stmt.execute(...)){ ResultSet rs = stmt.getResultSet(); while(rs.next()){ ... } }
3)处理多个结果集ResultSet
execute方法不仅可以执行单条查询语句,而且还可以执行多条查询语句,不同查询语句之间用分号(;)隔开。
1.当JDBC执行多条查询语句时(全部都是select语句)
处理所有的结果集需使用ResultSet接口的getMoreResults方法来判断是否存在下一个结果集。
execute方法只根据多条sql语句中的第一条的类型来返回ture或false。如果第一条是查询语句,责getResultSet返回一个ResultSet对象,execute方法返回true。否则返回false.因此,在已知语句全部都是select语句时,可以不用判断。但如果是混合形式的,则需要采取2方法。
2.当执行混合形式的语句
方法见 “ 二。对数据库进行更新”
boolean getMoreResults()
该方法与next()方法不同,该方法返回的“游标”位置就处于第一个结果集上。需使用do...while()语句。
if(stmt.execute()){ ResultSet rs = null; do{ //依次获得执行多条sql语句返回的ResultSet对象 rs = stmt.getResultSet(); while(rs.next()){ .. } }while(stmt.getMoreResults()); }
需要注意的是:MySQL JDBC驱动不支持多结果集,因此要想使用execute方法执行多条查询SQL语句,必须在连接字符串中加上allowMultiQueries=true。
二。对数据库进行更新
对数据库的另一重要操作就是更新数据库,主要包括插入数据(insert语句)、更新数据(update语句)和删除数据(delete语句)。执行方法有execute()方法、executeUpdate()方法
1)使用execute方法执行混合形式的SQL语句
execute方法不仅可以执行查询语句,也可以执行不返回结果集的查询语句(DML),并可以同时执行上述语句的混合形式。各语句之间用分号隔开。如stmt.execute(insertDate + ";" + "insertData" + ";" + "selectData");
结果处理方法:
不能使用execute方法的返回值或getMoreResults方法来处理每条SQL语句的执行结果。需使用getUpdateCount方法,该方法根据执行的语句不同而返回不同的值:
1.如果当前执行的是返回结果集的SQL语句,返回-1.
2.否则返回实际的更新记录数。
只有当getMoreResults方法返回false,并且getUpdateCount方法返回-1时,才表明所有的结果都被处理了。
do{ }while(!(stmt.getMoreResults()==false)&&stmt.getUpdateCount()==-1));
2)使用executeUpdate方法更新数据
除了可以使用execute方法执行不返回结果集的SQL语句外,还可以使用executeUpdate方法来完成同样的工作。
int executeUpdate(String sql)
executeUpdate方法和executeQuery方法类似,当执行多条语句时,第一条语句必须是不返回结果集的SQL语句。
3)获得自增字段的值
Statement接口的getGeneratedKeys方法,可以获得最近一次插入数据后自增字段的值。
ResulteSet getGeneratedKeys()
当插入多条记录时,可以通过对ResultSet扫描获得。
也可以通过execute方法和executeUpdate方法获得自增字段的值,但如果执行多条插入语句,只返回第一条插入语句生成的自增字段的值。