1.可以传参的查询语句
需要用到PreparedStatement
例程:
c = DriverManager.getConnection(url,account,password);
PreparedStatement st1 = c.prepareStatement("select * from customers where cust_id = ?");
st1.setInt(1, 10001);
//ResultSet rs1 = st1.executeUpdate();
ResultSet rs1 = st1.executeQuery();
while(rs1.next()) {
System.out.println("id: " + rs1.getInt(1) + " name: "+
rs1.getString(2));
}
使用 ? 来表示待传入的参数
PreparedStatement的的性能比statement更快,且可以防止SQL注入攻击
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
一般select语句使用 executeQuery 可以返回结果集,插入更新等语句使用executeUpdate 返回影响的数据数量。
2.批量处理SQL
这里由于PreparedStatement预编译时使用的资源比较多,所以对于大批量的操作,一般使用 Statement
//设置为手动提交
c.setAutoCommit(false);
Statement stmt2 = c.createStatement();
for(int i = 1;i<=20000;i++) {
//该语句未测试
stmt2.addBatch("insert into learn (id,name) values('" + i +"', zhang)");
}
stmt2.executeBatch();
//提交事务
c.commit();
3.事务回滚
一组SQL语句中,当有一个SQL语句操作不成功时,整组SQL语句都不会提交,rollback
流程
try{
//设置手动提交事务
c.setAutoCommit(false);
//SQL语句1
//SQL语句2
//....
//提交事务
c.commit();
}catch(SQLException e){
e.printStackTrace();
c.rollback();
}
在mysql里面一般默认为自动提交事务,即对象execute后便会提交,此处设置手动提交,一组sql语句execute之后,提交事务,遇到异常就会rollback
3.大文本对象
数据库对大文本对象使用clob方法,数据库类型text longtext等,在代码中是同setclob来设置对象
如将文本文件内容导入数据库
stmt.setClob(2, new FileReader(new File("e:\\1.txt")));
同样对于二进制大对象则使用 blob
4.调用存储过程
待续