statement

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的话效率必然降低,但是

golang操作mysql使用总结

懵懂的女人 提交于 2019-11-30 02:43:08
sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作. sql.DB 为我们管理数据库连接池 需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。 操作mysql 1.导入mysql数据库驱动 1 2 3 4 import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) 通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用 sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了. 2.连接数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 type DbWorker struct { //mysql data source name Dsn string } func main() { dbw := DbWorker{ Dsn:

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.在性能方面: 每种数据库都会对预编译的语句提供最大的性能优化,因为有些编译语句会被重复调用,所以就把被数据库编译后的执行代码缓存起来,当下次调用只要是相同的预编译语句就不需要编译,只要将参数传入预编译的语句执行代码