3 什么叫预编译
预编译也就预处理,叫什么都行。它就是把SQL语句的模板生成一个函数,模板中的“?”就是函数的参数。当给“?”赋值之后,再执行SQL语句时,就是用参数来调用函数。
例如:SELECT * FROM tab_student WHERE s_number=?,这是一条SQL模板语句,当使用这个SQL模板获取PreparedStatement对象时,已经把这条SQL模板发送给了SQL服务器,这时SQL服务器会根据SQL模板生成一个函数一样的东西:详情讲看
functioin myfun(?) { … } |
当使用PreparedStatement为“?”设置了值后(pstmt.setString(1,”S_1001”),再去调用executeQuery()方法时,就是在使用参数调用函数一样:myfun(“S_1001”)。
4 预编译的好处
在没有使用预编译时,SQL服务器在执行每条SQL语句时都需要去查询SQL的语法是否正确,解析SQL语句,再去编译执行。其中执行的时间远远比不上查询语法、解析,以及编译要用的时间。
虽然在使用PreparedStatement时也需要做查询语法、解析,以及编译的工作,但是如果使用PreparedStatement执行多次的话,那么查询、解析,以及编译只会做一次。这就是它的好处。
所以,建议大家在今后的开发中,无论什么情况,都去需要PreparedStatement,而不是使用Statement。
5 MySQL默认预编译是关闭的(了解即可)
MySQL的驱动默认情况下是不会预编译SQL的,这需要我们把useServerPrepStmts参数设置为true,这样MySQL驱动就打开了预编译功能。可以在url中设置这个参数:
url=jdbc:mysql:///mydb1?useServerPrepStmts=true |
注意,当使用同一个PreparedStatement对象执行多次时,只需要编译一次。
String sql = “select * from tab_student where s_number=?”; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, “S_1001”); ResultSet rs = pstmt.executeQuery(); rs.close(); pstmt.clearParameters(); pstmt.setString(1, “S_1002”); rs = pstmt.executeQuery(); |
上面代码是多次使用同一个PreparedStatement对象执行操作,所以数据库只编译一次SQL模板,然后调用多次。看看下面代码是编译几次呢?
String sql = “select * from tab_student where s_number=?”; PreparedStatement pstmt1 = con.prepareStatement(sql); PreparedStatement pstmt2 = con.prepareStatement(sql); …… |
虽然使用的是相同的sql,但是返回的是两个不同的PreparedStatement对象,所以数据库还是要编译两次的。如果你希望Connection的prepareStatement()方法在sql相同时,返回相同的对象,即返回同一个PreparedStatement,那么就需要缓存PreparedStatement对象。
设置cachePrepStmts为true,表示缓存PreapredStatement。这时,就算多次获取PreparedStatement对象,但只要SQL模板相同,那么返回的就是相同的PreparedStatement对象,也就是不会再次编译SQL语句了。
String sql = “select * from tab_student where s_number=?”; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, “S_1001”); ResultSet rs = pstmt.executeQuery(); rs.close(); pstmt.close(); pstmt = con.prepareStatement(sql); pstmt.setString(1, “S_1002”); rs = pstmt.executeQuery(); |
使用prepStmtCacheSize变量来设置缓存PreparedStatement的上限。
例如prepStmtCacheSqlLimit变量来设置SQL模板的长度上限。
url=jdbc:mysql:///mydb1?useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=50&prepStmtCacheSqlLimit=300 |
<!--EndFragment-->
<!--EndFragment-->
相关推荐
首先,`jdbcTemplate`的核心功能是通过预编译的SQL语句(PreparedStatement)来执行数据库操作。预编译SQL可以有效防止SQL注入,提高代码的可读性和执行效率。在使用`jdbcTemplate`进行预编译查询时,我们通常会使用...
使用 PreparedStatement 也可以实现预编译功能,例如: Connection con = JdbcUtils.getConnection(); String sql = "select * from t_book where bid=?"; PreparedStatement pstmt = con.prepareStatement(sql); ...
预编译语句,即PreparedStatement,是Java.sql包中的一个接口,它是Statement接口的子接口。与普通的Statement对象不同,PreparedStatement在创建时就需要提供SQL语句,并立即发送到数据库进行编译。当执行时,...
本文提供了一个 JAVA 预编译示例代码,涵盖了预编译中使用 like、javaSQL 预编译异常、预编译语句支持 in 方式等多个方面的知识点。 1. 预编译中使用 like 在预编译中使用 like 时,需要在值的地方加 % 号,以便...
PreparedStatement 预编译statement 的详细介绍java视频 马克java社区 马克-to-win
预编译查询是MySQL提供的一种优化机制,通过PreparedStatement接口实现。预编译查询可以提高性能,因为它允许数据库解析SQL语句一次,然后多次执行该语句,只需改变参数即可。这减少了解析时间,并且可以防止SQL注入...
这是因为PreparedStatement预编译SQL语句,使得数据库可以提前解析和优化,从而提高性能。对于异构的SQL(结构不同的查询),Statement的执行效率可能较高,因为它没有预编译过程。 4. **参数绑定** ...
预编译语句(PreparedStatement)是Java编程语言中用于与数据库交互的一个重要概念,它是java.sql包中的一个接口,是Statement接口的子接口。预编译语句的设计旨在提高SQL语句的执行效率和安全性,尤其是在需要频繁...
- PreparedStatement预编译SQL语句,适用于执行多次的SQL操作,提升效率,且有防止SQL注入的安全性。 - 防SQL注入:PreparedStatement将参数作为值处理,而非字符串拼接,避免恶意输入破坏SQL结构。 - 可读性好:...
PreparedStatement是Java JDBC中用于执行预编译SQL语句的接口,它是Statement的子接口。预编译的SQL语句可以提高数据库操作的性能和安全性。在数据库系统中,预编译意味着SQL语句在首次执行前已经过编译,形成一个...
Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement) 配置文件 db.properties(保存数据库账号和密码等) 工具类 JDBCUtil.java(抽取公共部分,解决硬...
为了优化数据库操作,通常会使用PreparedStatement预编译SQL,减少SQL注入风险,并使用Connection池管理数据库连接。 **系统架构与流程** 1. 用户通过浏览器发送HTTP请求到Web服务器。 2. Web服务器接收到请求后,...
- PreparedStatement预编译的SQL执行对象 1. 可以避免SQL注入 因为在编译的时候已经把SQL的逻辑固定,不会因为替换进去的内容改变逻辑 2. 如果SQL中涉及变量 相比Statement的字符串拼接的方式,代码可读性提高,并且...
PreparedStatement预编译SQL,更安全且性能更好;ResultSet存储查询结果。 - JDBC编程通常涉及加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL和关闭资源。 2. SQL Developer: - SQL ...
在Java中,可以使用PreparedStatement接口实现MySQL预编译。以下是一个简单的示例: ```java Connection con = JdbcUtils.getConnection(); String sql = "select * from t_book where bid=?"; PreparedStatement ...
6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate对象 6.4 Rowset行集合对象 6.5 JDBC的事务 6.6 本章小结 第7章 JDBC结合Servlet与JSP 的应用 7.1 Servlet概述...
2. **预编译SQL**:PreparedStatement预编译SQL语句,提升执行效率。 3. **连接池**:使用连接池(如C3P0、HikariCP)管理数据库连接,避免频繁创建和关闭连接。 4. **使用PreparedStatement代替Statement**:防止...
例如,在Java的JDBC中,我们可以使用PreparedStatement对象来实现预编译,它的优点在于减少解析和编译SQL语句的时间,提升执行速度。 接着,我们来讨论批量提交。在传统的数据库操作中,每次插入、更新或删除操作...
- **性能**:PreparedStatement预编译SQL,执行效率更高,因为数据库只需要解析一次SQL,后续执行无需再编译。 - **代码可读性**:PreparedStatement使用占位符"?",使SQL与参数分离,便于维护和避免SQL注入。 3....
- 避免硬编码SQL语句,使用PreparedStatement预编译SQL,提高安全性。 - 使用try-with-resources语句管理数据库连接,确保资源及时关闭。 - 对于大型XML文件,考虑使用SAX避免内存溢出。 - 将日期格式化逻辑封装...