三者联系
- Statement、PreparedStatement和CallableStatement都是接口(interface)。
- Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
- 三者功能特点:
- Statement接口提供了执行语句和获取结果的基本方法;
- PreparedStatement接口添加了处理 IN 参数的方法;
- CallableStatement接口添加了处理 OUT 参数的方法。
Statement
Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行时,数据库都要编译该SQL语句。
PreparedStatement
表示预编译的SQL语句的对象,用于执行带参数的预编译的SQL语句,也可以不带参数。编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题。
CallableStatement
提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。继承自PreparedStatement,支持带参数的SQL操作。提供了对输出和输入/输出参数(IN/OUT)的支持。不同数据库的存储过程是不可移植的,因此CallableStatement
面临移植性差问题。
Statement的使用
- 创建Statement对象
java Statement stmt = connection.creatStatement();
- Statement常用方法
- boolean execute(String sql) 返回boolean类型,在执行sql语句后,如果ResultSet检索到,则返回true,否则返回false。
- int executeUpdate(String sql) 返回int类型,方法用于执行sql语句,将返回sql语句影响的行数。
- ResultSet executeQuery(String sql) 执行sql语句,将返回结果集。用ResultSet实例化 result去接收返回集。
- 关闭
java stmt.close(); // 关闭并释放资源。
PreparedStatement的使用
//连接数据库
String sql="insert into userInfo(username.password,gender,age) value(?,?,?,?)";
//可以传入参数
PreparedStatement ps=conn.prepareStatement(String sql);
//调用setXXX系列方法给问号赋值,下标从1开始,代表第一个问号
ps.setString(1,"name");
ps.setInt(2,123456);
ps.setString(3,"男");
ps.setInt(4,25);
//执行插入
ps.executeUpdate();
ps.close();
conn.close();
- 常用方法:
-
boolean execute()
在进行数据库或表的创建删除操作时使用。 -
ResultSet executeQuery()
数据查询时使用。 -
int executeUpdate()
数据的插入删除、修改时使用。
-
- 关闭
java ps.close(); // 关闭并释放资源。
CallableStatement的使用
- 创建一个CallableStatement
存储过程存在的三种参数:IN OUT INOUT- IN 创建SQL语句时其参数值是未知的。 使用setXXX()方法将值绑定到IN参数。
- OUT 由SQL语句返回的参数值。可以使用getXXX()方法从OUT参数中检索值。
- INOUT 提供输入和输出值的参数。使用setXXX()方法绑定变量并使用getXXX()方法检索值。
- 如果存储过程只是IN
String sql="{call getEmpName (?, ?)}"; //conn.prepareCall() 与conn.preparedStatement()功能一样 CallableStatement cstmt=conn.prepareCall(sql); cstmt.setString(1,"aaa"); cstmt.setInt(2,123); //发送参数,所有调用存储过程的sql语句都是使用executeQuery方法执行。 ResultSet rs=cstmt.executeQuery();
- 如果存储过程是INOUT
//第一个?是输入参数,第二个?是输出参数 String sql = "CALL pro_test2(?,?)"; CallableStatement cstmt=conn.prepareCall(sql); //设置输入参数 cstmt=setInt(1,5); //设置输出参数,用registerOutParameter绑定 cstmt.registerOutParameter(2,java.sql.Types.VARCHAR); //执行 cstmt.executeQuery(); //根据?位置取得数据getXXX()方法只用于存储过程 String rs=cstmt.getString(2);
- 关闭CallableStatement
java cstmt.close();
批量查询
// Statement的Batch使用:
Statement stmt = conn.createStatement();
String sql = null;
for (int i = 0; i < 20; i++) {
sql = "insert into test(id, name)values(" + i + ", " + i + "_name)";
stmt.addBatch(sql);
}
stmt.executeBatch();
// PreparedStatement的Batch使用:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID =?");
for (int i = 0; i < length; i++) {
pstmt.setBigDecimal(1, param1[i]);
pstmt.setInt(2, param2[i]);
pstmt.addBatch();
}
pstmt.executeBatch();
```