在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.
基于以下的原因:
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.
二.PreparedStatement尽最大可能提高性能.
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.
当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.
三.最重要的一点是极大地提高了安全性.
即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?
select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.
分享到:
相关推荐
Statement和PreparedStatement之间的区别 Statement和PreparedStatement...结论:在 JDBC 应用中,建议使用PreparedStatement对象来代替Statement对象,以提高执行速度、避免SQL注入攻击和提高代码可读性和可维护性。
然而,这种方式对于复杂的数据结构和大量的对象操作可能会变得繁琐。为了更高效地处理对象与数据库之间的映射,开发者通常会选择使用ORM框架,如Hibernate或MyBatis。这些框架提供了自动化的对象-关系映射功能,可以...
在实际开发中,为了提高效率和安全性,我们通常会使用PreparedStatement接口来代替Statement接口。 1. **PreparedStatement简介** PreparedStatement是Statement的一个子接口,它的主要优势在于预编译。预编译的...
- 使用PreparedStatement代替Statement,预编译SQL语句可以提高执行速度。 - 执行完SQL后,及时关闭结果集、Statement和Connection,避免资源泄露。 - 考虑使用连接池(如C3P0、HikariCP)管理数据库连接,提高...
本资源主要涵盖了使用JDBC PrepareStatement进行MySQL数据库操作的各种场景,包括基本的查询、更新以及批量处理。 首先,我们来看一下JDBC连接MySQL的步骤。在Java程序中,我们需要导入相应的JDBC驱动,例如`...
本文将重点讲解如何使用JDBC保存一个Java对象到数据库,并获取插入后自动生成的主键值。 #### 二、关键概念 1. **PreparedStatement**:预编译的SQL语句,它可以提高执行效率,并有助于防止SQL注入攻击。 2. **...
1. 使用PreparedStatement代替Statement,减少SQL解析时间。 2. 数据库连接池:通过数据源实现连接池,复用数据库连接,降低连接创建和释放的开销。 3. 分页查询:避免一次性获取大量数据,使用LIMIT或OFFSET等分页...
在实际应用中,为了提高代码的可读性和安全性,通常会使用`PreparedStatement`代替`Statement`,预编译SQL语句以防止SQL注入攻击。此外,JDBC还涉及事务管理,确保一系列操作要么全部成功,要么全部回滚,以维护数据...
- 使用PreparedStatement代替Statement,减少SQL解析时间。 - 使用批处理(Batch Updates)提高批量插入或更新的效率。 - 使用连接池(Connection Pool)管理数据库连接,避免频繁创建和关闭连接。 8. JDBC ...
1. 使用PreparedStatement代替Statement,防止SQL注入。 2. 使用连接池(如C3P0、DBCP、HikariCP等)管理数据库连接,提高性能。 3. 使用批处理(Batch Processing)处理批量数据操作,减少与数据库的交互次数。 ...
- 使用PreparedStatement代替Statement,减少SQL解析时间。 - 使用批处理处理大量插入或更新操作。 - 合理设置JDBC连接池大小,避免频繁创建和销毁连接。 - 使用Statement的`setFetchSize()`方法控制结果集的大小,...
1. 使用PreparedStatement代替Statement,减少解析时间,提高效率。 2. 使用连接池:例如C3P0、DBCP、HikariCP等,避免频繁创建和销毁数据库连接。 3. 批量处理:尽量将多条SQL语句一起执行,减少网络往返次数。 ...
JDBC(Java Database Connectivity)是Java编程语言中用于与各种关系型...不过要注意,实际开发中为了防止SQL注入和提高性能,通常会使用`PreparedStatement`代替`Statement`,并且应当使用连接池来管理数据库连接。
1. 使用PreparedStatement代替Statement,减少解析次数。 2. 使用连接池(如C3P0、HikariCP)管理数据库连接,避免频繁创建和销毁。 3. 使用批处理,减少网络传输次数。 4. 适当设置JDBC参数,如fetchSize控制每次从...
4. **使用PreparedStatement代替Statement**:防止SQL注入,提高性能。 5. **合理设置 Statement属性**:例如设置合适的缓冲大小,提高读写效率。 **异常处理**:在JDBC编程中,应该捕获SQLException及其子类,处理...
1. 使用PreparedStatement代替Statement,减少SQL解析时间。 2. 使用批处理操作,通过`addBatch()`和`executeBatch()`提高效率。 3. 设置合适的fetch size,减少网络传输。 4. 开启数据库连接池,复用数据库连接。 5...
优化主要包括使用PreparedStatement代替Statement,以及使用数据库连接池管理数据库连接。 【数据库连接池】 数据库连接池是管理数据库连接的组件,如Apache的Commons DBCP、C3P0、HikariCP等,它们可以提高性能,...
- 使用PreparedStatement代替Statement,以防止SQL注入攻击,并提高性能(因为预编译的SQL语句可以被多次执行)。 - 在可能的情况下,使用批处理执行多条SQL语句,以提升效率。 - 注意异常处理,确保在出现错误时...
- 使用PreparedStatement代替Statement以防止SQL注入。 - 适当使用批处理,优化大量数据的插入和更新。 - 使用连接池管理数据库连接,提高系统性能。 - 在处理完结果集后立即关闭,避免内存泄漏。 - 使用try-with-...
1. 使用PreparedStatement代替Statement,提高效率并防止SQL注入。 2. 合理设置批处理大小,平衡网络传输和内存占用。 3. 使用连接池,控制并发和连接生命周期。 4. 使用预编译和参数化查询,提升查询速度。 5. 适当...