`

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-->
分享到:
评论

相关推荐

    PreparedStatement 马克-to-win java视频

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

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

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

    MySQL数据库

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

    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之PreparedStatement类中预编译的综合应用解析

    SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句

    MySQL预编译功能详解

     大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?  当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译...

    PreparedStatement接口

    NULL 博文链接:https://chaoyi.iteye.com/blog/2088080

    jdbc 增删改查事物处理, 批处理,以及预编译示例代码

    内容为JDBC增删改查 ,事物处理, 批处理,以及预编译示例代码

    使用PreparedStatement访问数据库

     PrepatredStatement实例包含已编译的SQL语句,由于PreparedStatement对象已预编译过哦哦,所以执行速度快于Statement对象。  包含于PreparedStatement对象中的SQL语句具有一个或多个IN参数。IN参数的值在SQL...

    JSP中的PreparedStatement对象操作数据库的使用教程

    PreparedStatement接口继承Statement,并与之在两方面有所不同: PreparedStatement 实例包含已编译...由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。

    如何防止SQL注入.pdf

    通过使用预编译语句(例如,在Java中使用PreparedStatement),可以确保用户输入被当作参数处理,而不是SQL语句的一部分。 2. 检验和清洗用户输入 对用户输入进行验证,确保它符合预期的格式。例如,如果你期待一个...

    每天十道面试题(五)——JDBC数据库编程部分

    1)性能方面,PreparedStatement有预编译过程,一旦绑定SQL语句就可以执行多次,Statement执行多少次就要编译多少次SQL语句。PreparedStatement用来执行动态的SQL语句,即包含参数的SQL语句,而Statement用

    JDBC版本的增删改查

    这次写的还是对单表的增 删 改 查 ,与version1.0版本不同的是PreparedStatement 接口,它是预编译的Sql语句对象,与 Statement 不同的是 PreparedStatement ...

    JDBC连接MySQL数据库实现增删改查(Dao层实现 解决硬编码 配置连接池获得连接对象 )

    实现类 UserDaoImpl.java(实现增删改查功能 使用预编译对象PreparedStatement 安全、便捷不需要我们去拼接字符串,特别是字段很多的时候 同时效率比Statement更高 ) 测试类 UserDaoTest.java(做测试增删改查功能...

    java面向对象核心知识点,独门大法

    每一个知识点的讲解,都会包含语法,语法个数如何定义,然后语法下面就是使用方式,能够起到活学活用的帮助,比如在讲解jdbc的时候我会列举出来 Statement(执行简单的sql语句,不支持预编译) PreparedStatement...

    JDBC的常用方法

    在上一篇文章我们讲了一些基本使用JDBC-DBCP-MYBATIS。 1.防止SQL注入 我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的...//使用预编译对象进行预编译,就不使用原始的Statement对象 PreparedStatement pr

    java实训题库(盗版必究)

    preparedstatement:叫做预编译的对象,在语句执行之前,向数据库发送类似于公式一样的模板,其中使用了替换变量,从而提高了数据存储的安全性,但这个数据操作对象不是效率最高的。可以应用于绝大多数数据库。 ...

    PreparedStatementCRUD操作mysql数据库

    预编译对象 PreparedStatement的CRUD操作 crud是指在做计算处理时的增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete)--六祎大王家贡献

    jdbc连接数据库的方式2

    在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端...

Global site tag (gtag.js) - Google Analytics