1、Statement
该对象用于执行静态的 SQL 语句,并且返回执行结果
通过调用 Connection 对象的 createStatement 方法创建该对象
Statement 接口中定义了下列方法用于执行 SQL 语句
查询:ResultSet excuteQuery(String sql)——返回查询结果的封装对象ResultSet.
ResultSet对象:
通过调用 Statement 对象的 excuteQuery() 方法创建该对象
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现,其中维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
修改、删除、增加:int excuteUpdate(String sql)——返回影响的数据表记录数.
示例代码:
@Override
public void add(Student student) {
// 1. 获取连接
Connection connection = DBUtil.getConnection();
Statement statement = null;
try {
//>2.获取执行语句的对象——静态的sql语句
statement = connection.createStatement();
StringBuilder sql = new StringBuilder(
"insert into student values(null,'");
sql.append(student.getName()).append("','");
sql.append(student.getSex()).append("',");
sql.append(student.getAge()).append(",'");
sql.append(dateFormat.format(student.getBirthday())).append("')");
System.out.println(sql);
// 3.执行静态sql
statement.executeUpdate(sql.toString());
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, statement, null);
}
}
2、PreparedStatement
public interface PreparedStatemen textends Statement表示预编译的 SQL 语句的对象,即实现了动态的SQL。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值,注意用setXXX方式设置时,需要与数据库中的字段类型对应,例如mysql中字段为varchar,就需要使用setString方法,如果为Date类型,就需要使用setDate方法来设置具体sql的参数.
注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。
如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
代码示例:
@Override
public void add(Student stu) {
// 连接数据库
Connection connection = DbUtils.getConnection();
PreparedStatement preparedStatement = null;
String sql = "INSERT INTO student VALUES (null,?,?,?,?)";
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, stu.getName());
preparedStatement.setString(2, stu.getSex());
preparedStatement.setInt(3, stu.getAge());
// 第二参数为java.sql.Date类型,为java.util.Date的子类,需要处理
preparedStatement.setDate(4, new Date(stu.getBirthday().getTime()));
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
DbUtils.close(connection, preparedStatement);
}
}
两者的区别:
1、代码的可读性和可维护性.
PreparedStatement 能最大可能提高性能:
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
2、PreparedStatement能保证安全性:statement中,我们需要对静态sql语句进行拼接,可能用户输入的内容参与了拼接,容易出现安全性问题.
例如:
@Test
public void testLoginByStatement() {
// >>1. 接受客户端在登录页面上输入的用户名和密码
String username = "zhangsan"; // request.getParameter('username')
String password = "zhangsan1111' or 1=1 or ''=' "; // request.getParameter('password') //如果or 1=1 or ''=' "为用户输入的内容的话,会影响到整个sql语句的执行结果.
Connection connection = DBUtil.getConnection();
ResultSet resultSet = null;
Statement statement = null;
try {
statement = connection.createStatement();
// >>2. 根据用户输入的用户名和密码 到用户表中找有同时存在的记录
String sql = "select * from userinfo where username='" + username
+ "' and password='" + password + "'";
System.out.println(sql);
resultSet = statement.executeQuery(sql);
// >>3, 如果根据用户和密码通过执行sql查询出来有结果的话,说明 该用户和密码在数据库中存在, 登录成功
if (resultSet.next()) {
System.out.println("登录成功");
// 把数据库中的对应的用户数据查询出来封装到user对象中.. 然后把user放在sessoin中
} else {
System.out.println("登录失败");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(connection, statement, resultSet);
}
}
而PreparedStatement不会存在这样的安全性问题,利用?通配符来预编译sql语句,程序员只需要动态设置sql语句中的?通配符内容,保证了安全性.
测试代码:
@Test
public void testLoginByPreparedStatement() {
// >>1. 接受客户端在登录页面上输入的用户名和密码
String username = "zhangsan"; // request.getParameter('username')
String password = "zhangsan"; // request.getParameter('password')
Connection connection = DBUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
String sql = "select * from userinfo where username=? and password=?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
总结:在实际应用中,我们通常需要使用PreparedStatement来保证程序的安全、高效.
分享到:
相关推荐
Statement和PreparedStatement是JDBC中的两种不同的语句对象,用于执行数据库操作。虽然它们都可以执行SQL语句,但是它们之间存在着很大的区别。 首先, Statement对象执行的SQL语句是直接编译的,而...
在Java的JDBC(Java Database Connectivity)中,与数据库交互的核心接口是Statement和PreparedStatement。这两个接口都是用于执行SQL语句的,但它们在特性和效率上有所不同。 Statement接口是最基本的SQL执行方式...
JDBC 中 PreparedStatement 接口提供的 execute、executeQuery 和 executeUpdate 之间的区别及用法 JDBC 中的 PreparedStatement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。...
`PreparedStatement`是Java数据库连接(JDBC)API中的一种重要接口,它继承自`Statement`接口,并在其基础上进行了扩展和优化。`PreparedStatement`的主要特点在于它可以预先编译SQL语句,并允许用户在执行前动态地...
jdbc中preparedStatement比Statement的好处
因此,如果读取一个 ResultSet 与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成,如果存在某个语句打开的当前 ResultSet 对象,则 Statement 接口中所有执行方法都会隐式关闭它。 ...
3. `Statement`接口的`executeUpdate(String sql)`方法用于执行SQL中的`insert`、`update`和`delete`语句。 4. `PreparedStatement`是`Statement`的子接口,用于执行预编译的SQL语句。 5. `ResultSet`接口中定义了...
PreparedStatement中的占位符通过setXXX()系列方法来设置值,这里的XXX对应于Java类型(如setInt(), setString()等)。每个问号对应一个参数,参数顺序与SQL语句中的问号位置一致。例如: ```java pstmt.setInt(1...
* 插入数据:使用 JDBC 的 Statement 或 PreparedStatement 对象可以插入数据。插入数据需要指定要插入的数据表和字段,然后使用 executeUpdate() 方法执行插入操作。 * 修改数据:使用 JDBC 的 Statement 或 ...
"JDBC.zip_创建数据对象"这个主题主要涉及如何利用JDBC来创建和操作数据库中的数据对象,如表、视图、索引等。在这个过程中,我们需要理解JDBC的基本概念、工作原理以及如何设置开发环境。 首先,JDBC是一个Java ...
5. **事务处理**:在JDBC中,可以通过Connection对象的setAutoCommit()方法来开启或关闭自动提交,手动管理事务的提交和回滚,例如使用commit()和rollback()方法。 6. **分页显示**:在JDBC中实现分页查询通常需要...
本教程将深入浅出地介绍如何使用JDBC的Statement接口来执行数据库的增加(INSERT)和删除(DELETE)操作,帮助初学者从入门到熟练掌握这一核心技术。 首先,JDBC的核心是Java.sql包中的DriverManager类,它负责管理...
`Connection`接口提供了创建Statement、PreparedStatement和CallableStatement对象的方法,以执行SQL语句。 - `createStatement()`:返回一个Statement对象,用于执行非参数化的SQL语句。 - `prepareStatement...
Java 中的 PreparedStatement 和 Statement 都是用于执行 SQL 语句的接口,但是它们之间存在一些关键的区别。 首先,从数据库执行 SQL 语句的角度来看,使用 PreparedStatement 语句可以提高数据库访问的效率。这是...
核心接口包括`DriverManager`、`Connection`、`Statement`、`PreparedStatement`和`ResultSet`等。这些接口提供了创建数据库连接、执行SQL语句和处理查询结果的基本操作。 2. **驱动管理器(DriverManager)** `...
Java面试题34.jdbc中preparedStatement比Statement的好处.mp4
在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一套标准接口。PrepareStatement是JDBC提供的一种预编译的SQL语句,它可以提高数据库操作的效率和安全性。本资源主要涵盖了使用JDBC ...
在Java编程中,PreparedStatement是Java SQL API中的一个接口,它是Statement接口的子接口。这个练习主要涉及如何使用PreparedStatement来插入宠物信息到数据库中。PreparedStatement的主要优势在于它的预编译能力和...
Java Database Connectivity(JDBC)是Java平台中的核心API,由Sun Microsystems(现已被Oracle公司收购)开发并维护,它为Java开发者提供了标准的接口,用于与各种类型的数据库进行交互。JDBC是Java语言连接数据库...
3. `com.mysql.jdbc.Statement`和`com.mysql.jdbc.PreparedStatement`:分别实现了JDBC的Statement和PreparedStatement接口,针对MySQL进行了优化。 4. `com.mysql.jdbc.ResultSet`:实现了JDBC的`java.sql....