Statement接口
- 用于执行静态SQL语句并返回它所生成结果的对象
-
三种Statement类:
- Statement
由createStatement创建,用于发送简单的SQL语句(不带参的)
-
PreparedStatement
继承自Statement接口,由PrepareStatement创建,用于发送含有一个或多个输入参数的sql语句.PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入.我们一般都用PreparedStatement.
-
CallableStatement
继承自PreparedStatement.由方法prePareCall创建,用于调用存储过程.
- Statement
-
常用的Statement方法
- execute():运行语句,返回是否有结果集
-
executeQuery():运行select语句,返回ResultSet结果集
-
executeUpdate():运行insert/update/delete操作,返回更新的行数
Code
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试执行SQL语句,以及SQL注入问题
* @author Matrix42
*
*/
public class Demo02 {
public static void main(String[] args) {
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//建立连接 耗时 耗资源
//连接对象内部包含了Socket对象,是一个远程的连接,比较耗时,这是Connection对象管理的一个要点!
//真正开发中,为了提高效率,都会使用连接池来管理连接对象!
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
Statement stmt = conn.createStatement();
//Statement要使用变量必须拼字符串 还有sql注入问题
//String sql = "insert into t_user(username,pwd,regTime) values('赵六','6666',now())";
//stmt.execute(sql);
//测试SQL注入
String id = "5 or 1=1";//外部传入的参数 恶意加上or 1=1
String sql = "delete from t_user where id ="+id;
stmt.execute(sql);
//内容全部删除
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class Demo03 {
public static void main(String[] args) {
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
String sql = "insert into t_user(username,pwd,regTime) values(?,?,?)";//?为占位符
PreparedStatement ps = conn.prepareStatement(sql);
//参数索引是从1开始计算,而不是0
//ps.setString(1, "matrix42");
//ps.setString(2, "123456");
//可以使用setObject处理参数
ps.setObject(1, "一会");
ps.setObject(2, "6789");
ps.setObject(3, new java.sql.Date(System.currentTimeMillis()));
ps.execute();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ResultSet接口
-
Statement执行SQL语句时返回ResultSet结果集
-
ResultSet提供的检索不同类型字段的方法,常用的有:
-
getString() 获得在数据库里是varchar,char等数据类型的对象
-
getFloat() 获得在数据库里是Float类型的对象
-
getDate() 获得在数据库里是Date类型的数据
-
getBoolean() 获得在数据库里是Boolean类型的数据
-
-
依次关闭使用的对象及连接
-
ResultSet -> Statement -> Connection
Code
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo04 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
String sql = "select * from t_user where id > ?";// ?为占位符
ps = conn.prepareStatement(sql);
ps.setObject(1, 2);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//一定要分开,防止一个出现异常其余不能关闭
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (ps!=null) {
ps.close();
}
} catch(SQLException e){
e.printStackTrace();
}
try {
if (conn!=null) {
conn.close();
}
} catch(SQLException e){
e.printStackTrace();
}
}
}
}