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语句都会影响表格的行数,下面做一个小实验就能明白了。
表格的内容:
代码示例:
运行结果:
从运行结果可以知道,insert语句影响了一行数据,update语句也影响了一行数据,最后delete语句删除了所有的数据,所以影响了11行数据。
最后表格的数据都被清空了:
Statement对象调用executeBatch();方法可以批量执行SQL语句,在调用executeBatch();方法前,需要调用addBatch();方法来累积SQL语句,最后调用clearBatch();方法来清空积累的SQL语句。
如果不使用批SQL执行的话,会来来回回的向数据库发送SQL,速度会稍微慢一些。使用批SQL执行的话,则是将SQL语句积累起来,然后一次性往数据库发送SQL语句,所以速度会稍微快一些。调用executeBatch();方法会返回一个int类型数组,因为是批量执行的SQL语句,所以影响得行数比较多。
代码示例:
运行结果:
批SQL处理思维导图:
使用Statement对象调用executeQuery方法执行数据库查询语句时,会返回一个ResultSet对象,这个对象是查询出来的记录集,因为查询的结果集数量可能很庞大,如果返回一个数组或者集合,就代表要一次性把查询到的数据都拿出来,这样的话不仅速度慢,而且拿取数据也不方便,并且让开发驱动的人员也没有优化的余地。
返回的是ResultSet对象的话,就能选择性的拿取数据,能让开发驱动的人员有优化的余地。
代码示例:
运行结果:
使用ResultSet对象调用next();方法会返回一个boolean值,返回值为true表示查询到了数据,如果是false则是没有查询到数据。
提醒:在编写SQL语句时,最好是在SQLYog工具或者其他数据库工具中执行一下,确保语句正确之后在拷贝过来,会剩下一些麻烦。
ResultSet接口:
从上面的介绍也知道ResultSet是从数据库里查询出来的记录集的一个封装对象,ResultSet对象是有一个取值光标的,这个取值光标的概念和游标的概念是差不多的,这个取值光标默认在数据的最前面,也就是第一行数据,next();方法可以移动光标取值,如果光标没有指向值的话,就返回false 有值就是true。
使用ResultSet对象调用beforeFirst();方法可以将取值光标移动到最前方,也就是第一行数据,此方法一般配合next方法使用。
代码示例:
运行结果:
使用ResultSet对象调用afterLast();方法可以将取值光标移动到最后方,也就是最后一行数据。
代码示例:
运行结果:
ResultSet对象调用previous();方法可以从后至前的方式拿值,也即是和next();方法取值顺序相反,一般配合afterLast方法使用,如果使用beforeFirst方法的话会得不到数据。
错误示例:
运行结果会为空,什么都不会打印:
取列值:
在上面我们也使用到了getInt方法来取tid列的值,取列值可以通过两个方式,一是通过序号,二是通过列名,在上面我是通过列名获得的tid列的值,我们也可以使用序号来获得。
通过序号取列值代码示例:
运行结果:
如何确定列的序号?通过表格列的从左到右顺序即可确定:
通过序号取列值代码示例:
运行结果:
一些常用的取值方法对应的数据库中的数据类型介绍:
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代码示例:
运行结果:
SELECT tname FROM test代码示例:
运行结果:
还有一点要注意的是如果要将datatime类型的值保存到变量中,是使用Date类声明的变量来保存,但是这个Date类不是java.util包下的Date类,而是java.sql包下的Date类,不要使用错类了。
代码示例:
运行结果:
从运行结果可以看出只打印了日期,时间没有打印,也就是说使用getDate方法只能获得日期,获得不了时间,如果想要获得时间和日期就得调用getTimestamp方法,这个方法会返回一个Timestamp对象。
代码示例:
运行结果:
ResultSetMetaData接口:
ResultSetMetaData接口主要是用于反馈查询出来的数据库中表结构信息对象的,ResultSetMetaData对象需要通过ResultSet对象调用getMetaData();方法来获得。但是要注意的一点就是ResultSetMetaData对象并不是完全的表结构封装对象,而仅是查询出来的数据结果集表结构封装对像,也就是说仅仅是通过查询语句所查询出来的那个表结构,不是完整存在数据库的表结构,通过这个对象可以调用有一些方法来获得表结构信息。
简单介绍几个方法的作用:
getColumnName();方法 得到列名
getColumnTypeName();方法 得到列的数据类型名称
getColumnDisplaySize();方法 获得列所定义的类型大小
getColumnCount();方法 得到表格中所有列的数量
isNullable();方法 判断这个列是否可以为null,返回值是一个int类型,只会返回0或1,0代表false,1代表true,也就是非0即真。
提示:以上提到的方法,除了getColumnCount();方法之外,其他方法都需要传递一个int类型的参数,这个数字是查询出来的表结构中列的序号。
代码示例:
运行结果:
一般很少情况下会去获得表结构信息,因为没什么实际意义,所以ResultSetMetaData接口用得不多。