createStatement参数详解,带参数与不带参数的区别

Connection接口的createStatement方法,可用来创建向数据库发送SQL语句的对象,用于执行SQL语句。

常用代码:

Statement stmt = con.createStatement();

Statement stmt = con.createStatement (int resultSetType,int resultSetConcurrency);

createStatement参数详解

resultSetType:结果集的类型

TYPE_FORWARD_ONLY告诉系统读取资料列时只向前卷动。

TYPE_SCROLL_SENSITIVE修改後马上反映在ResultSet中。

TYPE_SCROLL_INSENSITIVE修改後不反映在ResultSet中。

ResultSet包含一个指向数据当前行的指针,在最初得到ResultSet的时候,这个指针指向第一条数据之前,next方法会将指针移动至下一条记录。

TYPE_FORWARD_ONLY告诉系统读取资料列时只向前卷动,如有列id name sex age。在取得name列之后,将不能再返回获取id列的值;

TYPE_SCROLL_INSENSITIVE,ResultSet指针可以前后移动,表示不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反映出来;

案例:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);   
ResultSet rs = stmt.executeQuery("select id, name from table1");   
rs.last(); //移动到最后一行   
int rownum = rs.getRow(); //获得当前行的行号,即记录的条数   
rs.absolute(1);   //将指针返回至第一条记录 

int resultSetConcurrency:结果集的同步类型

CONCUR_READ_ONLY:当前ResultSet对象只读,不能更新;

CONCUR_UPDATABLE:当前ResultSet可以更新。

在实际开发中,可以利用CONCUR_UPDATABLE参数来实时更新ResultSet中的数据如:

rs.absolute(5); // 移动rs指针至第5行数据
rs.updateString("NAME", "张军"); // 将该行name的值改为张军
rs.updateRow(); //更新数据源的数据

带三个参数的createStatement语句

createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)

其中resultSetHoldability可选值是:

1、ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交时,不关闭ResultSet的游标
2、ResultSet.CLOSE_CURSORS_AT_COMMIT  表示修改提交时,关闭ResultSet的游标

对于查询操作,不带参数的方法createStatement(),

等同于第二种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY),

等同于第三种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT)

Statement stmt = Conn.createStatement(1004,1007);

这些参数名称都对应一个整数值:
TYPE_FORWARD_ONLY=1003
TYPE_SCROLL_INSENSITIVE=1004
TYPE_SCROLL_SENSITIVE=1005
CONCUR_READ_ONLY=1007
CONCUR_UPDATABLE=1008

createStatement带参数与不带参数的性能比较

对于一个比较复杂的sql语句,createStatement加不加参数需要的时间到底是多少呢?

st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

开始时间:Sat Jun 28 15:33:47 CST 2014
结束时间:Sat Jun 28 15:33:53 CST 2014   ps:7秒左右,数据大概120条

st = conn.createStatement();

开始时间:Sat Jun 28 15:36:21 CST 2014
结束时间:Sat Jun 28 15:36:22 CST 2014

开始时间:Sat Jun 28 15:36:30 CST 2014
结束时间:Sat Jun 28 15:36:30 CST 2014  ps:1秒不到,数据120条

看到这里,我果断去掉了参数。

125jz网原创文章。发布者:江山如画,转载请注明出处:http://www.125jz.com/2812.html

(2)
江山如画的头像江山如画管理团队
上一篇 2018年10月23日 下午1:21
下一篇 2018年10月24日 上午9:02

99%的人还看了以下文章

  • python 字典的使用案例二:求平均分,并按平均分由高到低输出选手编号和最后得分

    校园好声音大赛,三位选手得分,由8位评委给出。 请根据评分表,将每们选手的得分去掉一个最高分和一个最低分后求平均分,并按照平均分由高到低输出选手编号和最后得分。 dicScores = {‘012’: [90, 94, 97, 86, 85, 89, 88, 85], ‘005’: [91, 91, 92, 98, 90, 96, 90, 95], ‘108…

    2020年1月22日
    12.0K0
  • 手机上可以python编程吗,手机如何开发python

    想在手机上编写python代码? python语言应用很广泛,很多小伙伴想利用空闲时间学习Python,但是有时候身边没有电脑,今天就给大家分享两种手机编写运行python的方法,让你可以直接在自己的手机上做python开发学习。 一、直接在线编写运行(免安装) 手机通过浏览器打开 https://c.runoob.com/compile/9/ 推荐:★★★…

    2022年3月16日 编程开发
    8.3K0
  • String、StringBuffer、StringBuilder的区别?

    String在实例化之后,其内存空间的内容大小是不能够被修改的;而StringBuffer是一个线程安全的可变字符序列,在实例化之后可以动态的修改堆内存中的内容,所以内存长度和大小是可变的;StringBuilder实例化之后内存大小长度也是可变的,不同之处在于StringBuilder不是线程同步,因此操作起来必然比StringBuffer更加高效。

    2018年10月24日
    2.0K0
  • Java GUI编程高级实例一:给应用程序添加菜单

    一、给GUI应用程序添加菜单 菜单的作用:给应用程序设置操作菜单。 菜单组成 JMenuItem—菜单项,直接指向一个具体的操作 JMenu—菜单,其中可加入菜单项(JMenuItem)和菜单(Jmenu) JMenuBar—-菜单栏,在其中可以加入菜单(JMenu) 菜单的创建 JMenu、JMenuBar和JMenuI…

    2020年1月22日
    4.8K0
  • java两个窗体Form1和Form2之间怎么传递参数?

    开发java图形界面程序时,会遇到一个窗体向另外一个窗体传递参数的问题,好多初学者很是迷茫。中国网页设计特别编写了一个简单程序用于演示两个窗体之间如何传递参数,代码如下:Form1.java代码: import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.Acti…

    2021年11月25日
    2.4K0
  • dao service view pojo utils tools都放什么? jsp的(MVC)三层架构入门

    java的(MVC)三层架构(dao、service、view) Java EE典型架构,分层的目的:高内聚,低耦合。 一般java都是三层架构   (还可加一个:工具类:util比如处理多语言功能,网站非法信息过滤等等功能的代码集); 三层架构体系,是逻辑上的三层,按照完成功能不同,所做事宜不同,将项目分为三个层次 1:数据访问层(dao) 2:业务逻辑层…

    2020年10月24日
    5.5K0

发表回复

登录后才能评论