`

PreparedStatement预编译

 
阅读更多
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对象,所以数据库还是要编译两次的。如果你希望ConnectionprepareStatement()方法在sql相同时,返回相同的对象,即返回同一个PreparedStatement,那么就需要缓存PreparedStatement对象。

  设置cachePrepStmtstrue,表示缓存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-->
分享到:
评论

相关推荐

    spring自带的jdbcTemplate查询、插入预编译使用

    首先,`jdbcTemplate`的核心功能是通过预编译的SQL语句(PreparedStatement)来执行数据库操作。预编译SQL可以有效防止SQL注入,提高代码的可读性和执行效率。在使用`jdbcTemplate`进行预编译查询时,我们通常会使用...

    MySQL预编译功能

    使用 PreparedStatement 也可以实现预编译功能,例如: Connection con = JdbcUtils.getConnection(); String sql = "select * from t_book where bid=?"; PreparedStatement pstmt = con.prepareStatement(sql); ...

    SQL.预编译.docx

    预编译语句,即PreparedStatement,是Java.sql包中的一个接口,它是Statement接口的子接口。与普通的Statement对象不同,PreparedStatement在创建时就需要提供SQL语句,并立即发送到数据库进行编译。当执行时,...

    JAVA预编译示例代码

    本文提供了一个 JAVA 预编译示例代码,涵盖了预编译中使用 like、javaSQL 预编译异常、预编译语句支持 in 方式等多个方面的知识点。 1. 预编译中使用 like 在预编译中使用 like 时,需要在值的地方加 % 号,以便...

    PreparedStatement 马克-to-win java视频

    PreparedStatement 预编译statement 的详细介绍java视频 马克java社区 马克-to-win

    MySQL 事务预编译查询和Perl DBI简化

    预编译查询是MySQL提供的一种优化机制,通过PreparedStatement接口实现。预编译查询可以提高性能,因为它允许数据库解析SQL语句一次,然后多次执行该语句,只需改变参数即可。这减少了解析时间,并且可以防止SQL注入...

    数据库连接

    这是因为PreparedStatement预编译SQL语句,使得数据库可以提前解析和优化,从而提高性能。对于异构的SQL(结构不同的查询),Statement的执行效率可能较高,因为它没有预编译过程。 4. **参数绑定** ...

    java_JDBC预编译相关知识点参照.pdf

    预编译语句(PreparedStatement)是Java编程语言中用于与数据库交互的一个重要概念,它是java.sql包中的一个接口,是Statement接口的子接口。预编译语句的设计旨在提高SQL语句的执行效率和安全性,尤其是在需要频繁...

    JAVA-Web阶段重点及面试题汇总.pdf

    - PreparedStatement预编译SQL语句,适用于执行多次的SQL操作,提升效率,且有防止SQL注入的安全性。 - 防SQL注入:PreparedStatement将参数作为值处理,而非字符串拼接,避免恶意输入破坏SQL结构。 - 可读性好:...

    JDBC之PreparedStatement类中预编译的综合应用解析

    PreparedStatement是Java JDBC中用于执行预编译SQL语句的接口,它是Statement的子接口。预编译的SQL语句可以提高数据库操作的性能和安全性。在数据库系统中,预编译意味着SQL语句在首次执行前已经过编译,形成一个...

    Java之JDBC连接MySQL数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement)

    Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement) 配置文件 db.properties(保存数据库账号和密码等) 工具类 JDBCUtil.java(抽取公共部分,解决硬...

    基于servlet+jsp+jdbc的在线考试管理系统 .zip

    为了优化数据库操作,通常会使用PreparedStatement预编译SQL,减少SQL注入风险,并使用Connection池管理数据库连接。 **系统架构与流程** 1. 用户通过浏览器发送HTTP请求到Web服务器。 2. Web服务器接收到请求后,...

    MySQL数据库

    - PreparedStatement预编译的SQL执行对象 1. 可以避免SQL注入 因为在编译的时候已经把SQL的逻辑固定,不会因为替换进去的内容改变逻辑 2. 如果SQL中涉及变量 相比Statement的字符串拼接的方式,代码可读性提高,并且...

    分别使用JDBC、SQL Developer访问Oracle的一点区别

    PreparedStatement预编译SQL,更安全且性能更好;ResultSet存储查询结果。 - JDBC编程通常涉及加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL和关闭资源。 2. SQL Developer: - SQL ...

    一文搞懂MySQL预编译

    在Java中,可以使用PreparedStatement接口实现MySQL预编译。以下是一个简单的示例: ```java Connection con = JdbcUtils.getConnection(); String sql = "select * from t_book where bid=?"; PreparedStatement ...

    Java数据库技术详解 DOC简版

    6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate对象 6.4 Rowset行集合对象 6.5 JDBC的事务 6.6 本章小结 第7章 JDBC结合Servlet与JSP 的应用 7.1 Servlet概述...

    一点关于JDBC的内容

    2. **预编译SQL**:PreparedStatement预编译SQL语句,提升执行效率。 3. **连接池**:使用连接池(如C3P0、HikariCP)管理数据库连接,避免频繁创建和关闭连接。 4. **使用PreparedStatement代替Statement**:防止...

    《SQL预编译和批量提交对性能提升效果探索》测试代码

    例如,在Java的JDBC中,我们可以使用PreparedStatement对象来实现预编译,它的优点在于减少解析和编译SQL语句的时间,提升执行速度。 接着,我们来讨论批量提交。在传统的数据库操作中,每次插入、更新或删除操作...

    javaSE面试题

    - **性能**:PreparedStatement预编译SQL,执行效率更高,因为数据库只需要解析一次SQL,后续执行无需再编译。 - **代码可读性**:PreparedStatement使用占位符"?",使SQL与参数分离,便于维护和避免SQL注入。 3....

    java日期和查询数据库生成XML文件类

    - 避免硬编码SQL语句,使用PreparedStatement预编译SQL,提高安全性。 - 使用try-with-resources语句管理数据库连接,确保资源及时关闭。 - 对于大型XML文件,考虑使用SAX避免内存溢出。 - 将日期格式化逻辑封装...

Global site tag (gtag.js) - Google Analytics