preparedstatement

JDBC Statement PreparedStatement CallableStatement

不羁岁月 提交于 2020-04-06 22:43:28
在 JDBC 应用程序中,JDBC 语句对象用于将 SQL 语句发送到数据库服务器。一个语句对象与一个连接相关联,应用程序与数据库服务器之间的通信由语句对象来处理。 JDBC 中有三种类型的语句对象: 1. 常规语句(General statement) 2. 预置语句(Prepared statement) 3. 可调用语句(Callable statement) 语句对象与一个连接相关联,所以要创建一个语句对象,首先应该建立一个数据库连接。连接的获取见上一篇博客。 关于这三种语句,个人觉得最有价值的就是 预置语句,下面说说为什么 1) 预置语句 可以避免sql参数注入。如果使用常规的statement,那么用户可以注入sql语句,把一个本应该是传入参数的变量变成了SQL注入变量。然而,如果使用预置语句,那么变量的值是不可能传入SQL的。这个在查询的时候如果你把条件设为 or 1=1 得到体现。 2) 预置语句 可以高效操作,原因是语句只要编译一次。对于一条模板SQL,我们可能需要执行多次,每次只是传入的参数不一样,那么如果我们使用常规语句则会每次执行时在数据库编译一次,然而,如果采用预置语句,则只会编译一次,这样效率大大提高。 3) 预置语句 可以批量操作。对于一些特殊的业务逻辑处理,我们可能会一次更新多条数据,然而如果我们每次都去获取语句执行SQL的话效率必然降低,但是

JDBC PreparedStatement 预编译语句 动态添加条件-SQL参数不定

谁说胖子不能爱 提交于 2020-03-02 03:23:28
我是看这个帖子来做的,我只是把过程写的更小白一点。 JDBC查询动态封装 实现的效果是:动态添加xx=?这些条件 SELECT id FROM t_table WHERE id=? AND sex = ? 拼接预编译语句 开始我们要用到两个Vector来存储 参数值和参数类型 Vector<Object> vParamValue = new Vector<Object>(); Vector<String> vParamType = new Vector<String>(); 接着声明一个带初始条件的SQL字符串,目的是之后拼接条件时,就不用考虑是否加AND的问题 String sql = "SELECT id FROM t_table WHERE id > 0 "; 接着判断条件参数是否获取到,以决定是否拼接该条件 if(!name.equals("")) { sql += " AND name=? "; vParamValue.add(name); vParamType.add("String"); conditionCount++;//用来统计拼接的条件个数,方便后面给预编译语句的条件参数遍历赋值 } 再接着是给语句对象参数赋值 (之前不明白这里怎么把参数一一对应起来的。 后来想了下,其实很简单。 因为SQL条件位置与放在Vector中的参数值,参数类型,三者是一一一对应的。)

statement和preparestatement

孤街浪徒 提交于 2019-11-27 17:39:20
一直都不是蛮清楚这二者的区别联系,今天就开一贴来详细的分析一下主要是从可读性,性能和效率上面来加以分析 在可读性方面来说: //Statement编写语句方法: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); //PreparedStatement: pstmt = con.prepareStatement("insert into tb_name(col1,col2,col2,col4) values (?,?,?,?)"); pstmt.setString(1,var1); pstmt.setString(2,var2); pstmt.setString(3,var3); pstmt.setString(4,var4); pstmt.executeUpdate(); statement 显得比较乱而且因为引号的原因比较容易出错,而preparedment则比较直观简洁 2.在性能方面: 每种数据库都会对预编译的语句提供最大的性能优化,因为有些编译语句会被重复调用,所以就把被数据库编译后的执行代码缓存起来,当下次调用只要是相同的预编译语句就不需要编译,只要将参数传入预编译的语句执行代码