天天看点

JDBC接口

Statement接口:

Statement接口可以用于执行sql语句,Statement对象需要通过Connection对象调用createStatement();方法来获得,得到Statement对象后才能调用执行SQL语句的方法。SQL语句分为两大类一类是更新语句一类是查询语句也就是DML和DQL,通过Statement对象调用executeUpdate方法可以执行DML类的SQL语句(更新语句),调用executeQuery方法则可以执行DQL类的SQL语句也就是查询语句。

使用Statement对象调用executeUpdate方法执行数据库更新语句时,会有一个int类型的返回值,这个返回值表示的是SQL语句执行后所影响的行数,因为像update、insert、delete语句都会影响表格的行数,下面做一个小实验就能明白了。

表格的内容:

<a href="https://s2.51cto.com/oss/201710/28/984c9cd21a48e7949468f6dd6b0bd204.png" target="_blank"></a>

代码示例:

<a href="https://s1.51cto.com/oss/201710/28/880ae834bbf8e015775a9f12ac18ae72.png" target="_blank"></a>

运行结果:

<a href="https://s4.51cto.com/oss/201710/28/4d0e86702265a72dea5dd6159ca83188.png" target="_blank"></a>

从运行结果可以知道,insert语句影响了一行数据,update语句也影响了一行数据,最后delete语句删除了所有的数据,所以影响了11行数据。

最后表格的数据都被清空了:

<a href="https://s4.51cto.com/oss/201710/28/1350b2a91b254d5e0d9f44ff2427f327.png" target="_blank"></a>

Statement对象调用executeBatch();方法可以批量执行SQL语句,在调用executeBatch();方法前,需要调用addBatch();方法来累积SQL语句,最后调用clearBatch();方法来清空积累的SQL语句。

如果不使用批SQL执行的话,会来来回回的向数据库发送SQL,速度会稍微慢一些。使用批SQL执行的话,则是将SQL语句积累起来,然后一次性往数据库发送SQL语句,所以速度会稍微快一些。调用executeBatch();方法会返回一个int类型数组,因为是批量执行的SQL语句,所以影响得行数比较多。

  代码示例:

<a href="https://s4.51cto.com/oss/201710/28/8ab56d954524be5496d07993183aca2b.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/28/a03ba2b1709986db51443cf5c7cd2b89.png" target="_blank"></a>

批SQL处理思维导图:

<a href="https://s5.51cto.com/oss/201710/28/09e236872261231cebd41c47c4aa0cb1.png" target="_blank"></a>

使用Statement对象调用executeQuery方法执行数据库查询语句时,会返回一个ResultSet对象,这个对象是查询出来的记录集,因为查询的结果集数量可能很庞大,如果返回一个数组或者集合,就代表要一次性把查询到的数据都拿出来,这样的话不仅速度慢,而且拿取数据也不方便,并且让开发驱动的人员也没有优化的余地。

返回的是ResultSet对象的话,就能选择性的拿取数据,能让开发驱动的人员有优化的余地。

<a href="https://s4.51cto.com/oss/201710/28/38f9f16b5af01e45171b8b660c146096.png" target="_blank"></a>

<a href="https://s4.51cto.com/oss/201710/28/c66f4d639156bc9630b6616e0aeaa016.png" target="_blank"></a>

使用ResultSet对象调用next();方法会返回一个boolean值,返回值为true表示查询到了数据,如果是false则是没有查询到数据。

提醒:在编写SQL语句时,最好是在SQLYog工具或者其他数据库工具中执行一下,确保语句正确之后在拷贝过来,会剩下一些麻烦。

ResultSet接口:

从上面的介绍也知道ResultSet是从数据库里查询出来的记录集的一个封装对象,ResultSet对象是有一个取值光标的,这个取值光标的概念和游标的概念是差不多的,这个取值光标默认在数据的最前面,也就是第一行数据,next();方法可以移动光标取值,如果光标没有指向值的话,就返回false  有值就是true。

使用ResultSet对象调用beforeFirst();方法可以将取值光标移动到最前方,也就是第一行数据,此方法一般配合next方法使用。

<a href="https://s1.51cto.com/oss/201710/28/5d17e2ccd1c99c2f746d213c2b4a728e.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/28/b2fdb5adcd7b99d39850295ceb52e3a5.png" target="_blank"></a>

使用ResultSet对象调用afterLast();方法可以将取值光标移动到最后方,也就是最后一行数据。

<a href="https://s2.51cto.com/oss/201710/28/e317caae952703cfb77389c36f1975fc.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/28/4a9e467fcd888b3b480adc9ac79e7dde.png" target="_blank"></a>

ResultSet对象调用previous();方法可以从后至前的方式拿值,也即是和next();方法取值顺序相反,一般配合afterLast方法使用,如果使用beforeFirst方法的话会得不到数据。

  错误示例:

<a href="https://s2.51cto.com/oss/201710/28/3e01db8f7037be36fbc1ab492304fe42.png" target="_blank"></a>

运行结果会为空,什么都不会打印:

<a href="https://s5.51cto.com/oss/201710/28/c9d75b8a6bcb3923315498c91969dc93.png" target="_blank"></a>

取列值:

在上面我们也使用到了getInt方法来取tid列的值,取列值可以通过两个方式,一是通过序号,二是通过列名,在上面我是通过列名获得的tid列的值,我们也可以使用序号来获得。

  通过序号取列值代码示例:

<a href="https://s4.51cto.com/oss/201710/28/0c1e8619c93be062732497367d382bb6.png" target="_blank"></a>

<a href="https://s1.51cto.com/oss/201710/28/0bf746d36b26c50efd4b274eee079f6c.png" target="_blank"></a>

如何确定列的序号?通过表格列的从左到右顺序即可确定:

<a href="https://s1.51cto.com/oss/201710/28/bbdeeee9abaf3bb877982727bc55034e.png" target="_blank"></a>

通过序号取列值代码示例:

<a href="https://s1.51cto.com/oss/201710/28/8c2937d0117a3e17702740061e3c1209.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/28/ae6b6f4c260d7a1226cd16f422339b44.png" target="_blank"></a>

一些常用的取值方法对应的数据库中的数据类型介绍:

varchar类型 &gt;&gt;getString方法

int类型       &gt;&gt;   getInt();方法

boolean类型   &gt;&gt;   getBoolean();方法

datetime类型  &gt;&gt;getDate();方法

float类型 &gt;&gt;getFloat();方法

double类型 &gt;&gt;getDouble();方法

使用方法去取值时要注意能够确保精度、内存不会溢出,例如使用getFloat();方法就不能去取double类型的值,反过来使用getDouble();方法则可以去取float类型的值。这和Java里的类型转换原理是一样的,大转小会溢出,小转大则没问题,而且任何数据类型都可以转换为String类型。

注意:在记录集中拿数据时,是由你所写的SELECT语句来决定的,例如你写的是SELECT * FROM test,那么就是默认按表格序号来拿数据,如果你写的是SELECT tname FROM test,则是按tname为序号1来拿数据。

  SELECT * FROM test代码示例:

<a href="https://s1.51cto.com/oss/201710/28/94d26a38143a48a4c8c159e96f65e73f.png" target="_blank"></a>

<a href="https://s1.51cto.com/oss/201710/28/8a5f5bf3895686a2abf40e344335cd19.png" target="_blank"></a>

SELECT tname FROM test代码示例:

<a href="https://s1.51cto.com/oss/201710/28/1e4576d6d467355e273694cea1b4d193.png" target="_blank"></a>

<a href="https://s1.51cto.com/oss/201710/28/f67ec984f72c53c1a55c7bb92e631d38.png" target="_blank"></a>

还有一点要注意的是如果要将datatime类型的值保存到变量中,是使用Date类声明的变量来保存,但是这个Date类不是java.util包下的Date类,而是java.sql包下的Date类,不要使用错类了。

<a href="https://s1.51cto.com/oss/201710/28/ffd8f888155f5f40b2c8f866392c0d26.png" target="_blank"></a>

<a href="https://s5.51cto.com/oss/201710/28/c2ecb5d43014df0e4d495094d24eb3ff.png" target="_blank"></a>

从运行结果可以看出只打印了日期,时间没有打印,也就是说使用getDate方法只能获得日期,获得不了时间,如果想要获得时间和日期就得调用getTimestamp方法,这个方法会返回一个Timestamp对象。

<a href="https://s2.51cto.com/oss/201710/28/f707f6d4eee8ad7f422a73217ab6ecf7.png" target="_blank"></a>

<a href="https://s5.51cto.com/oss/201710/28/7c80d6b0ecd8bccfbd7fb74bff4baf24.png" target="_blank"></a>

ResultSetMetaData接口:

ResultSetMetaData接口主要是用于反馈查询出来的数据库中表结构信息对象的,ResultSetMetaData对象需要通过ResultSet对象调用getMetaData();方法来获得。但是要注意的一点就是ResultSetMetaData对象并不是完全的表结构封装对象,而仅是查询出来的数据结果集表结构封装对像,也就是说仅仅是通过查询语句所查询出来的那个表结构,不是完整存在数据库的表结构,通过这个对象可以调用有一些方法来获得表结构信息。

简单介绍几个方法的作用:

getColumnName();方法    得到列名

getColumnTypeName();方法 得到列的数据类型名称

getColumnDisplaySize();方法  获得列所定义的类型大小

getColumnCount();方法 得到表格中所有列的数量

isNullable();方法 判断这个列是否可以为null,返回值是一个int类型,只会返回0或1,0代表false,1代表true,也就是非0即真。

提示:以上提到的方法,除了getColumnCount();方法之外,其他方法都需要传递一个int类型的参数,这个数字是查询出来的表结构中列的序号。

<a href="https://s4.51cto.com/oss/201710/28/e90000481dcf8ce508870ecaf9e994c6.png" target="_blank"></a>

<a href="https://s5.51cto.com/oss/201710/28/21532ed19b792e4ddf0c9594a414a2e0.png" target="_blank"></a>

一般很少情况下会去获得表结构信息,因为没什么实际意义,所以ResultSetMetaData接口用得不多。

本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1977005,如需转载请自行联系原作者