Statement接口:

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

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

表格的内容:

984c9cd21a48e7949468f6dd6b0bd204.png


代码示例:

880ae834bbf8e015775a9f12ac18ae72.png


运行结果:

4d0e86702265a72dea5dd6159ca83188.png


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

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

1350b2a91b254d5e0d9f44ff2427f327.png


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

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

  代码示例:

8ab56d954524be5496d07993183aca2b.png


运行结果:

a03ba2b1709986db51443cf5c7cd2b89.png



SQL处理思维导图:

09e236872261231cebd41c47c4aa0cb1.png



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

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

代码示例:

38f9f16b5af01e45171b8b660c146096.png


运行结果:

c66f4d639156bc9630b6616e0aeaa016.png

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

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



ResultSet接口:

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

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

代码示例:

5d17e2ccd1c99c2f746d213c2b4a728e.png


运行结果:

b2fdb5adcd7b99d39850295ceb52e3a5.png



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

  代码示例:

e317caae952703cfb77389c36f1975fc.png


运行结果:

4a9e467fcd888b3b480adc9ac79e7dde.png



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

  错误示例:

3e01db8f7037be36fbc1ab492304fe42.png


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

c9d75b8a6bcb3923315498c91969dc93.png



取列值:

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

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

0c1e8619c93be062732497367d382bb6.png


运行结果:

0bf746d36b26c50efd4b274eee079f6c.png


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

bbdeeee9abaf3bb877982727bc55034e.png


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

8c2937d0117a3e17702740061e3c1209.png


运行结果:

ae6b6f4c260d7a1226cd16f422339b44.png



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

varchar类型 >>getString方法

int类型       >>   getInt();方法

boolean类型   >>   getBoolean();方法

datetime类型  >>getDate();方法

float类型 >>getFloat();方法

double类型 >>getDouble();方法

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

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

  SELECT * FROM test代码示例:

94d26a38143a48a4c8c159e96f65e73f.png


运行结果:

8a5f5bf3895686a2abf40e344335cd19.png



SELECT tname FROM test代码示例:

1e4576d6d467355e273694cea1b4d193.png


运行结果:

f67ec984f72c53c1a55c7bb92e631d38.png



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

  代码示例:

ffd8f888155f5f40b2c8f866392c0d26.png


运行结果:

c2ecb5d43014df0e4d495094d24eb3ff.png



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

  代码示例:

f707f6d4eee8ad7f422a73217ab6ecf7.png


运行结果:

7c80d6b0ecd8bccfbd7fb74bff4baf24.png




ResultSetMetaData接口:

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

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

getColumnName();方法    得到列名

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

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

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

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

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

  代码示例:

e90000481dcf8ce508870ecaf9e994c6.png


运行结果:

21532ed19b792e4ddf0c9594a414a2e0.png

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