JDBC Statement,PreparedStatement
2018-08-12 本文已影响0人
羽寂
Statement系列接口用于将用户创建的sql语句提交到数据库执行,除了执行存储过程外,一些接口方法还接收参数。
如何选择使用哪种类型Statement?
-
Statement对于固定的sql语句很有用,Statement不能接收参数。
-
PreparedStatement适用于需要多次进行调用的sql语句和多个参数的情况,PreparedStatement可以接收参数。使用PreparedStatement好处多多。比如:防SQL攻击、提高代码的可读性、可维护性、提高效率!
-
CallableStatement用于访问数据库的存储过程,CallableStatement也可以接收参数。存储过程的优点:执行效率很快(因为在数据库服务端执行的)。缺点:移植性差(不同数据库的存储过程是不可移植的)。
Statement的使用
1.创建Statement对象
Statement stmt=conn.creatStatement();
2.Statement常用方法
- boolean execute(String sql) 返回boolean类型,在执行sql语句后,如果ResultSet检索到,则返回true,否则返回false。
- int executeUpdate(String sql) 返回int类型,方法用于执行sql语句,将返回sql语句影响的行数。
- ResultSet executeQuery(String sql) 执行sql语句,将返回结果集。用ResultSet实例化 result去接收返回集。
3.关闭
stmt.close(); 关闭并释放资源。
PreparedStatement的使用
1.使用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();
2.常用方法:
根据一般的使用习惯
- boolean execute();在进行数据库或表的创建删除操作时使用。(不传入参数)
- ResultSet executeQuery(); 数据查询时使用。(不传入参数)
- int executeUpdate(); 数据的插入删除、修改时使用。(不传入参数)
比如要查询信息得到结果集可以这样写: ResultSet rs=ps.executeQuery(); (这里不传入参数)
2.关闭
ps.close(); 关闭并释放资源。
CallableStatement的使用
1.创建一个CallableStatement
1.1 存储过程存在的三种参数:IN OUT INOUT
- IN 创建SQL语句时其参数值是未知的。 使用setXXX()方法将值绑定到IN参数。
- OUT 由SQL语句返回的参数值。可以使用getXXX()方法从OUT参数中检索值。
- INOUT 提供输入和输出值的参数。使用setXXX()方法绑定变量并使用getXXX()方法检索值。
1.2 如果存储过程只是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();
1.3 如果存储过程是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);
1.4 关闭CallableStatement
cstmt.close();