版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
12.1JDBC简介12.2SQL语法简介12.3JDBC的经典用法12.4执行SQL语句的方式12.5管理结果集12.7事务处理12.10使用Jtable组件操作数据表第十二章Java与数据库操作
通过使用JDBCAPI,Java程序可以非常方便地操作各种主流数据库,而且由于Java语言的跨平台性,使其具有非常优秀的可移植性。JDBCAPI以统一的方式来连接不同的数据库,然后通过Statement对象来执行标准SQL语句,并可以获得SQL语句访问数据库的结果。第十二章Java与数据库操作JDBC的全称是JavaDataBaseConnectivity,是Java运行平台的核心类库中的一局部,提供了访问数据库的API,也就是Java连接数据库的标准〔标准〕,由一些类和接口组成。通过这些类和接口可以实现对数据库中表记录的查询、修改和删除等操作。12.1
JDBC简介使用JDBC完成以下操作:与数据库建立连接。执行SQL语句。获得SQL语句的执行结果。
先了解什么是ODBC。12.1
JDBC简介ODBC的全称是OpenDataBaseConnectivity,也就是开放数据库连接。ODBC允许应用程序可以通过一组通用的API访问不同的数据库管理系统,从而使ODBC的应用可以在不同的数据库之间切换。应该说JDBC是模仿了ODBC的设计。12.1
JDBC简介JDBC驱动程序的类型:第一种驱动:JDBC-ODBC桥。这种驱动是最早实现的JDBC驱动程序,主要目的是为了快速推广JDBC,可以方便的用于测试,不太适合产品的开发。这种驱动程序将JDBCAPI映射到ODBCAPI,不是多线程的,不适合在要求并行访问数据库的情况下使用。目前,不建议使用JDBC-ODBC桥。12.1
JDBC简介第二种驱动:是由局部Java程序和局部本地代码组成的,用于与数据库的客户端API进行通信。在使用这种驱动程序之前,不仅需要安装Java类库,还需要安装一些与平台相关的代码。12.1
JDBC简介第三种驱动:是纯Java类库,它使用一种与具体数据库无关的协议将数据库请求发送给效劳器构件〔中间件效劳器〕,然后该构件再将数据库请求翻译成特定的数据库协议。这种驱动支持三层结构的JDBC访问方式。主要用于Applet阶段,通过Applet访问数据库。12.1
JDBC简介12.1
JDBC简介第四种驱动:也是纯Java类库的,直接与数据库实例交互。这种驱动是智能的,它知道数据库使用的底层协议。这种驱动是目前最流行的JDBC驱动。12.1
JDBC简介JDBC驱动程序安装:JDBC-ODBC桥,不需要特别的设置,只需要有JDK就可以了,另外在Windows控制面板中设置ODBC数据源,在其中添加一个SystemDSN。12.1
JDBC简介DSN:DataSourceName〔数据源名称〕DSN为ODBC定义了一个确定的数据库和必须用到的ODBC驱动程序。每个ODBC驱动程序定义为该驱动程序支持的一个数据库创立DSN需要的信息。就是说安装ODBC驱动程序以及创立一个数据库之后,必须创立一个DSN。12.1
JDBC简介一个DSN中至少应该包含如下一些内容:关于数据库驱动程序的信息。数据库存放位置。文件型数据库〔如Access〕的存放位置为数据库文件的路径;非文件型数据库〔如SQLServer〕的存放位置是指效劳器的名称。数据库名称。在ODBC数据源管理器中,所有的DSN名称是不能重复的。12.1
JDBC简介1、数据库简介现在众多的数据库主要支持三种数据模型:层次模型、关系模型和网状模型。其中,关系模型目前的应用非常广泛。在许多数据库管理系统中都实现了关系模型或是提供了关系数据模型接口。关系数据库由三级模式:外模式、模式和内模式组成。目前,还出现了面向对象数据库,但是关系数据库开展的最成熟。12.2
SQL语法简介12.2
SQL语法简介外模式:也称为子模式或用户模式,是由数据用户看到的数据视图。模式:也称为逻辑模式,描述数据库中全体数据的逻辑结构和特性,是所有用户的公共数据视图。内模式:也称为存储模式,是数据在数据库内部的表示形式,也就是描述了数据的物理结构和存储方式。三级模式结构仅是对数据的三级抽象描述,具体的数据组织还是由数据库管理系统实现。12.2
SQL语法简介数据库根本操作:根本步骤和方法建立和关闭数据库连接创立数据库表插入数据查询数据更新数据库表删除数据12.2
SQL语法简介2、SQL〔StructuredQueryLanguage,结构化查询语言〕语句根底SQL本身不是一个数据库管理系统,也不是一个独立的产品。是操作和检索关系型数据库的标准语言,可用于操作任何关系型数据库。12.2
SQL语法简介使用SQL语言,程序员和数据库管理员〔DBA〕可以完成如下任务:在数据库中检索需要的信息;对数据库的信息进行更新;改变数据库的结构;更改系统的平安设置;〔DBA〕增加用户对数据库或表的许可权限。〔DBA〕12.2
SQL语法简介标准SQL语言通常可分为如下几种类型:查询语句:主要由select关键字完成,查询语句是SQL语句中最复杂,功能最丰富的语句。DML语句〔DataManipulationLanguage,数据操作语言〕:主要由insert、update和delete三个关键字完成。12.2
SQL语法简介DDL语句〔DataDefinitionLanguage,数据定义语言〕:主要由create、alter、drop和truncate四个关键字完成。DCL语句〔DataControlLanguage,数据控制语言〕:主要由grant和revoke两个关键字完成。事务控制语句:主要由commit、rollback和savepoint三个关键字完成。12.2
SQL语法简介关键字不区分大小写。DCL语句用于为数据库用户授权,或者回收指定用户的授权,通常无须程序员操作。我们不介绍。12.2
SQL语法简介SQL命令中的标识符,可用于定义表名,列名,变量。命名规那么如下:标识符通常必须以字母开头。标识符可包括字母、数字和三个特殊字符〔#,_,$〕。不要使用当前数据库系统的关键字、保存字。同一个模式〔外模式〕下的对象不应该同名。12.2
SQL语法简介3、DDL语句:包括创立create、修改alter、删除drop数据库对象。truncate比较特殊。常见的数据库对象:表table:表是存储数据的逻辑单元,以行和列的形式存在。〔数据库中最根本的对象。〕12.2
SQL语法简介约束〔constraint〕:执行数据校验的规那么,用于保证数据完整性的规那么。视图〔view〕:一个或者多个数据表里数据的逻辑显示。视图并不存储数据。索引〔index〕:用于提高查询性能。
使用关键字时,需要指定是对哪一个数据库对象操作。12.2
SQL语法简介创立表:createtable[模式名.]表名(--可以有多个列定义columnName1datatype[defaultexpr],……);例如:12.2
SQL语法简介createtabletest(--整型通常用inttest_idint,--小数点数test_pricedecimal,--普通长度文本,使用default指定默认值test_namevarchar(255)default’xxx’,--大文本类型test_desctext,--图片与日期类型test_imgblob,test_datedatetime);12.2
SQL语法简介②修改表:包括增加列定义、修改列定义、删除列、重命名列等操作。增加列定义:altertable表名add(--可以有多个列定义columnName1datatype[defaultexpr],……);12.2
SQL语法简介修改列定义:altertable表名modifycolumn_namedatatype[defaultexpr][first|aftercol_name]first或aftercol_name指定需要将目标修改到指定位置。修改的列名必须是原表中已存在的。这个语句每次只能修改一个列定义。例:altertablehehemodifybbbint;12.2
SQL语法简介修改列定义,非常容易失败,因为有可能修改的列定义规那么与原有的数据记录不符合。如果修改数据列的默认值,只会对以后的插入操作有作用,对以前已经存在的数据不会有任何影响。12.2
SQL语法简介删除列定义:altertable表名dropcolumn_name例:altertablehehedropaaa;通常删除列定义总是可以成功,删除列定义时将从每行删除掉该列的数据,并释放该列在数据块中占用的空间。因此删除大表中的字段需要比较长的时间。12.2
SQL语法简介重命名数据表:〔MySQL特有的〕altertable表名renameto新表名;完全改变列定义:〔MySQL特有的〕altertable表名changeold_colnamenew_colnametype[defaultexpr][first|aftercol_name];删除表:droptable表名;12.2
SQL语法简介约束概述:约束是在表上强制执行的数据校验规那么,约束主要用于保证数据库里数据的完整性。除此之外,当表中的数据存在相互依赖时,可以保护相关的数据不被删除。大局部数据库支持下面五类完整性约束:12.2
SQL语法简介NOTNULL:非空约束,指定某列不能为空。UNIQUE:唯一约束,指定某列或者几列组合不能重复。PRIMARYKEY:主键,指定该列的值可以唯一地标识该条记录。FOREIGNKEY:外键,指定该行记录附属于主表中的一条记录,主要用于保证参照完整性。12.2
SQL语法简介CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。其中,MySQL不支持这个约束,虽然在MySQL中可以使用这个CHECK约束,但这个约束不会起任何作用。根据约束对数据列限制,可以分为:单列约束:每个约束只约束一列。多列约束:每个约束约束多个数据列。12.2
SQL语法简介为数据表指定约束有两个时机:在建表的同时为相应的数据列指定约束。建表后创立,以修改表的方式来增加约束。下面依次简要介绍一下约束的建立和删除。〔约束通常不能修改。〕12.2
SQL语法简介①NOTNULL约束:这个约束比较特殊,它只能作为列级约束使用。null数值不区分大小写。与Java类似的是,空字符串不是null,0也不等于null。例如:createtablehehe(hehe_idintnotnull,hehe_namevarchar(255)default’xyz’notnull,hehe_gendervarchar(2)null);12.2
SQL语法简介增加非空约束altertablehehemodifyhehe_gendervarchar(2)notnull;取消非空约束altertablehehemodifyhehe_namevarchar(255)null;取消非空约束,并指定默认值altertablehehemodifyhehe_namevarchar(255)default’abc’null;12.2
SQL语法简介②UNIQUE约束:唯一性约束用于保证指定列或指定列组合不允许出现重复值,但可以出现多个null值。同一张表内可建多个唯一约束,唯一约束可由多列组合而成。当为某列创立唯一约束时,MySQL会为该列创立唯一索引。如果不给唯一约束起名,该唯一约束默认与列名相同。12.2
SQL语法简介唯一约束既可以使用列级约束语法建立,也可以使用表级约束语法建立。如果需要为多列建立组合约束,或者需要为唯一约束指定约束名,那么只能使用表级约束语法。列级约束语法:createtablehehe(hehe_idintnotnull,hehe_namevarchar(255)unique);12.2
SQL语法简介表级约束语法格式:[constraint约束名]约束定义例如:--两列都不能出现重复createtablehehe1(unique(hehe_name),--使用表级约束语法建立唯一约束,指定约束名constrainttest1_ukunique(hehe_pass));12.2
SQL语法简介--两列值的组合不能出现重复createtablehehe2(--指定两列组合constrainttest2_ukunique(hehe_pass,hehe_name));--添加唯一约束altertablehehe2addunique(hehe_pass,hehe_name)12.2
SQL语法简介--增加唯一约束altertablehehe2modifytest_namevarchar(255)unique;--删除唯一约束altertablehehe2dropindextest2_uk;12.2
SQL语法简介③PRIMARYKEY约束:主键约束相当于非空约束和唯一约束,也就是主键上约束的列既不允许为空,也不允许出现重复值;每一个表中最多允许一个主键,但这个主键可由多个数据列组合而成,那么多列里包含的每一列都不能为空,但只要求这些列组合不能重复。12.2
SQL语法简介建立主键约束既可以列级,也可以用表级约束语法。如需要对多个字段建立组合主键约束,那么只能用表级约束语法。当使用表级约束语法时,可以为该约束指定约束名。但不管用户是否为该主键约束指定约束名,MySQL总是将所有主键约束命名为PRIMARY。12.2
SQL语法简介列级约束语法:createtablehehe(hehe_idintprimarykey,hehe_namevarchar(255));12.2
SQL语法简介表级约束语法:createtabletest(constrainttest2_pkprimarykey(test_id));createtabletest(primarykey(test_id,test_name));12.2
SQL语法简介--删除主键约束:altertabletestdropprimarykey;--添加主键约束:altertabletestaddprimarykey(test_name,test_pass);--列级语法添加主键约束:altertabletestmodifytest_namevarchar(255)primarykey;12.2
SQL语法简介④FOREIGNKEY约束:外键约束主要用于保证一个或两个数据表之间的参照完整性,外键是构建于一个表的两个字段或两个表的两个字段之间的参照关系。外键确保了相关的两个字段的参照关系:子〔从〕表外键列的值必须在主表被参照列的值范围之内。12.2
SQL语法简介
在使用中,当主表的记录被从表参照时,主表记录不允许删除,必须把从表参照该记录的所有记录全部删除后,才可以删除主表的该记录。还有一种方式,删除主表记录时级联删除从表中所有参照该记录的从表记录。
从表外键参照的只能是主表主键列或者唯一键列。同一个表内可以拥有多个外键。12.2
SQL语法简介
建立外键约束时,MySQL也会为该列建立索引。
外键约束通常用于定义两个实体之间的一对多、一对一关联关系。
建立外键同样可以采用列级和表级约束语法。
例如:12.2
SQL语法简介--先建主表createtableteacher_table(--auto_increment:代表所有数据库自动编号策略。teacher_idintauto_increment,teacher_namevarchar(255),primarykey(teacher_id));12.2
SQL语法简介--再建从表createtablestudent_table(student_idintauto_incrementprimarykey,student_namevarchar(255),java_teacherintreferencesteacher_table(teacher_id));12.2
SQL语法简介在MySQL中,虽然支持这种列级约束语法来建立外键约束,但这种列级约束语法建立的外键约束不会生效,应使用表级约束语法。MySQL提供这种列级语法仅仅是为了和标准SQL保持良好的兼容性。12.2
SQL语法简介--表级语法。再建从表createtablestudent_table(student_idintauto_incrementprimarykey,student_namevarchar(255),java_teacherint,foreignkey(java_teacher)referencesteacher_table(teacher_id));12.2
SQL语法简介如果创立外键约束没有指定约束名,那么MySQL会为该外键约束命名为table_name_ibfk_n,其中,table_name是从表的表名,而n是从1开始的整数。12.2
SQL语法简介--使用表级语法指定外键约束名createtablestudent_table2(student_idintauto_incrementprimarykey,student_namevarchar(255),java_teacherint,constraintstudent_teacher_fkforeignkey(java_teacher)referencesteacher_table(teacher_id));12.2
SQL语法简介使用表级语法,建立多列组合的外键约束。--先建主表createtableteacher_table3(teacher_namevarchar(255),teacher_passvarchar(255),primarykey(teacher_name,teacher_pass));12.2
SQL语法简介--再建从表createtablestudent_table3(student_idintauto_incrementprimarykey,student_namevarchar(255),java_teacher_namevarchar(255),java_teacher_passvarchar(255),foreignkey(java_teacher_name,java_teacher_pass)referencesteacher_table3(teacher_name,teacher_pass));12.2
SQL语法简介--删除外键约束altertablestudent_table3(dropforeignkey(student_table3_ibfk_1));12.2
SQL语法简介如果想定义当删除主表时,从表记录也会随之删除,那么需要在建立外键约束后添加:ondeletecascade:删除主表记录时,把参照该主表记录的从表记录全部级联删除。ondeletesetnull:删除主表记录时,把参照该主表记录的从表记录的外键设为null。12.2
SQL语法简介--主表createtableteacher_table4(teacher_idintauto_increment,teacher_namevarchar(255),primarykey(teacher_id));12.2
SQL语法简介--从表createtablestudent_table4(student_idintauto_incrementprimarykey,student_namevarchar(255),foreignkey(java_teacher)intreferencesteacher_table4(teacher_id)ondeletecascade);12.2
SQL语法简介4、DML语法
使用DML语法可以完成如下三个任务:insertinto:插入新数据;update:修改已有数据;deletefrom:删除不需要的数据。12.2
SQL语法简介insertinto语法格式如下:insertintotable_name[(column[,column…])]values(value[,value…]);column要插入的列名,value要插入的值。
如果省略表名后的列名,默认将会为所有列都插入值,但又无法确定插入的值是多少,就可以分配为null。例如:12.2
SQL语法简介insertintoteacher_table2(table_name)values(’xyz’);或者是:insertintoteacher_table2(table_name)values(null,’abc’);还可以:--同时插入多个值insertintoteacher_table2values(null,’yeeku’),(null,’shar’);12.2
SQL语法简介--带子查询的插入insertintostudent_table2(student_name)selectteacher_namefromteacher_table2;不要求源表与目的表不是同一个。只要求选择出来的数据列和插入目的表中的数据列个数相等,数据类型匹配即可。注意:外键约束保证被参照的记录必须存在,但并不保证必须有被参照记录,即外键列可以为null。但如果想保证每条从表记录必须存在对应的主表记录,那么应使用非空、外键两个约束。12.2
SQL语法简介update语法此语句用于修改数据库记录,每次修改可以修改多条记录,可通过使用where子句限定修改哪些记录。其中where子句是一个条件表达式。格式如下:updatetable_namesetcolumn1=value1[,column2=value2…])][WHERE
condition];例如:12.2
SQL语法简介updateteacher_table1setteacher_name=’猪八戒’whereteacher_id>1;12.2
SQL语法简介deletefrom语法此语句用于删除指定数据表中的记录,删除时不需要指定列名,因为是整行整行的删除。可以一次删除多行,也可以用where子句限定。格式如下:deletefromtable_name[WHERE
condition];例如:deletefromteacher_table2whereteacher_id>2;12.2
SQL语法简介5、select语句select语句的功能就是查询数据,不仅可以执行单表查询,还可以执行多表查询,还可以进行子查询,用于从一个或多个数据表中选出特定行、特定列的交集。最简单功能如下:selectcolumn1,column2……from数据源[WHERE
condition];可以使用*代表所有列。12.2
SQL语法简介例如:select*fromteacher_table;12.2
SQL语法简介select语句还可以使用算术运算符〔+、-、*、/〕。规那么:对数值型数据列、变量、常量可以使用算术运算符创立表达式。对日期型数据列、变量、常量可以使用局部算术运算符〔+、-〕,在两个日期之间进行减法运算,日期和数值之间可以进行加减运算。运算符不仅可以用于列、变量和常量之间,还可以用在两列之间进行运算。12.2
SQL语法简介例如:selectteacher_id+5fromteacher_table;或者,select*fromteacher_tablewhereteacher_id*3>4;或者,selectconcat(teacher_name,’xx’)fromteacher_table;concat函数表示字符串连接运算12.2
SQL语法简介如果在算术表达式中使用null,将会导致整个算术表达式的返回值为null;如果在字符串连接运算符中出现null,会导致连接后的结果也是null。12.2
SQL语法简介--给数据列起别名selectteacher_id+5asMY_IDfromteacher_table;--给多个数据列起别名selectteacher_id+5MY_ID,teacher_name老师名fromteacher_table;--给数据表起别名selectteacher_id+5asMY_IDfromteacher_tablet;12.2
SQL语法简介--运算符的使用selectteacher_id+5MY_ID,concat(teacher_name,teacher_id)teacher_namefromteacher_tablewhereteacher_id*2>3;--选出所有记录,包括重复行selectstudent_name,java_teacherfromstudent_table;12.2
SQL语法简介--去除重复行selectdistinctstudent_name,java_teacherfromstudent_table;使用distinct去除重复行时,是去除后面字段组合的重复值,而不会管对应记录在数据库里是否重复。例如:1,’a’,’b’和2,’a’,’b’,两条记录在数据库里不重复的,但如果仅选择后面两列时,distinct会认为是重复的。12.2
SQL语法简介SQL中判断两个值是否相等的比较运算符是一个等号,不等号是<>,赋值是:=。还有特殊的比较运算符:betweenval1andval2:大于等于val1,小于等于val2。in(list):等于括号里多个值的任意之一。like:字符串匹配,like后的字符串支持通配符〔_,%〕。isnull:要求指定值为null。12.2
SQL语法简介--选出java_teacher<=2和student_id>=2的所有记录。select*fromteacher_namewhere2betweenjava_teacherandstudent_id;--选出java_teacher=2和student_id=2的所有记录。select*fromteacher_namewhere2in(student_id,java_teacher);--模糊查询select*fromstudent_namewherestudent_namelike’孙%’;12.2
SQL语法简介--and〔3〕、or〔4〕的使用select*fromstudent_tablewherestudent_namelike’_’andstudent_id>3;--not〔2〕的使用,所有比较运算符是〔1〕。select*fromstudent_tablewherenotstudent_namelike’\_%’;12.2
SQL语法简介--MySQL下的转义字符select*fromstudent_tablewherestudent_namelike’\_%’;--标准SQL语句中的转义字符select*fromstudent_tablewherestudent_namelike’\_%’escape’\’;--判断是否为空select*fromstudent_namewherestudent_nameisnull;12.2
SQL语法简介执行查询后的查询结果,默认是按插入顺序排列的。如果需要查询结果按某列值的大小进行排列,那么可以使用orderby子句。默认是升序排列〔关键字asc〕。语法如下:orderbycolumn_name1[desc],column_name2…12.2
SQL语法简介如果需要按多列排序,每列的asc、desc必须单独设定。如果指定了多个排序列,那么第一个排序列是首要排序列,只有当第一列中存在多个相同的值时,第二排序列才会起作用。12.2
SQL语法简介--升序排序select*fromstudent_tableorderbyjava_teacher;--多列排序select*fromstudent_tableorderbyjava_teacherdesc,student_name;12.2
SQL语法简介1、JDBC常用的接口和类
支持JDBCAPI的类和主要接口封装在java.sql包和javax.sql包中。
几个主要的类和接口如下:接口类接口接口接口类12.3
JDBC的经典用法Driver接口:每个驱动程序类必须实现的接口。DriverManager会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标URL。12.3
JDBC的经典用法DriverManager类:用于管理JDBC驱动的效劳类。程序中使用这个类的主要功能是获取Connection对象,这个包含以下方法,用来获得url对应数据库的连接:12.3
JDBC的经典用法publicstaticsynchronizedConnectiongetConnection(String
url,String
user,String
password)throwsSQLExceptionurl-jdbc:subprotocol:subname形式的数据库url;user-数据库用户,连接是为该用户建立的;password-用户的密码12.3
JDBC的经典用法Connection接口:代表数据库连接对象,每个Connection代表一个物理连接会话。要想访问数据库,必须先获得数据库连接。这个接口中的常用方法:StatementcreateStatement()throwsSQLException创立一个Statement对象来将SQL语句发送到数据库。12.3
JDBC的经典用法PreparedStatementprepareStatement(String
sql)throwsSQLException创立一个PreparedStatement对象来将参数化的SQL语句发送到数据库进行预编译。CallableStatementprepareCall(String
sql)throwsSQLException创立一个CallableStatement对象来调用数据库存储过程。12.3
JDBC的经典用法上面三个方法都是返回用于执行SQL语句的Statement对象,PreparedStatement、CallableStatement是Statement的子接口。只有获得了Statement之后才可以执行SQL语句。除些之外,Connection还有几个用于控制事务的方法:SavepointsetSavepoint():在当前事务中创立一个未命名的保存点(savepoint),并返回表示它的新Savepoint对象。12.3
JDBC的经典用法SavepointsetSavepoint(String
name):在当前事务中创立一个具有给定名称的保存点,并返回表示它的新Savepoint对象。voidsetTransactionIsolation(int
level):将此Connection对象的事务隔离级别更改为给定的级别。voidrollback():取消在当前事务中进行的所有更改〔回滚事务〕,并释放此Connection对象当前持有的所有数据库锁。12.3
JDBC的经典用法voidrollback(Savepoint
savepoint):取消所有设置给定Savepoint对象之后进行的更改。voidsetAutoCommit(boolean
autoCommit):关闭自动提交,翻开事务。voidcommit():提交事务。12.3
JDBC的经典用法Statement接口:
用于执行SQL语句的接口。其对象既可以执行DDL、DCL语句,也可以用于执行DML语句,还可用于执行SQL查询。当执行SQL查询时,返回查询到的结果集。这个接口中的常用方法:ResultSetexecuteQuery(String
sql)throwsSQLException:执行给定的SQL查询语句,该语句返回单个ResultSet对象。只能用于查询。12.3
JDBC的经典用法intexecuteUpdate(String
sql)throwsSQLException:这个方法用于执行DML语句,并返回受影响的行数;也可用于执行DDL,执行DDL时返回0。12.3
JDBC的经典用法booleanexecute(String
sql)throwsSQLException:这个方法可执行任何SQL语句。如果执行后第一个结果为ResultSet对象,那么返回true;如果返回执行后第一个结果为受影响的行数或没有任何结果,那么返回false。12.3
JDBC的经典用法PreparedStatement接口:表示预编译的SQL语句的对象。它允许数据库预编译SQL语句〔通常这些SQL语句带有参数〕,以后每次只改变SQL命令的参数,防止数据库每次都需要编译SQL语句,因此性能更好。使用PreparedStatement执行SQL语句,只需为预编译的SQL语句传入参数即可,所以它比Statement多了下面的方法:12.3
JDBC的经典用法voidsetXXX(int
parameterIndex,XXX
value):该方法根据传入的参数类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句中指定位置的参数。这个接口同样有execute、executeQuery和executeUpdate方法,只是这三个方法无须接收SQL字符串,因为已经预编译了SQL命令。
12.3
JDBC的经典用法ResultSet接口:结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。它的常用方法如下:voidclose():释放ResultSet对象。booleanabsolute(introw):将结果集的记录指针移动到第row行,如果row是负数,那么移动到末尾的绝对行位置。例如,调用方法absolute(-1)将光标置于最后一行。12.3
JDBC的经典用法voidbeforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态。booleanfirst():将ResultSet的记录指针定位到首行。如果移动后的记录指针指向一条有效记录,那么该方法返回true。booleanprevious():将ResultSet的记录指针定位到上一行。如果移动后的记录指针指向一条有效记录,那么该方法返回true。12.3
JDBC的经典用法booleannext():将ResultSet的记录指针定位到下一行。如果移动后的记录指针指向一条有效记录,那么该方法返回true。booleanlast():将ResultSet的记录指针定位到最后行。如果移动后的记录指针指向一条有效记录,那么该方法返回true。voidafterLast():将ResultSet的记录指针定位到最后一行之后。12.3
JDBC的经典用法2、JDBC编程步骤〔1〕加载驱动程序。通常使用Class类下的静态方法forName来加载驱动。格式如下面的代码://加载驱动程序Class.forName(driverClass);//driverClass就是数据库驱动类所对应的字符串。12.3
JDBC的经典用法//加载MySQL驱动Class.forName("com.mysql.jdbc.Driver");//加载jdbc-odbc桥接器驱动Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");12.3
JDBC的经典用法〔2〕通过DriverManager获取数据库连接。格式如下://获取数据库连接DriverManager.getConnection(Stringurl,Stringuser,Stringpass);上面的三个参数分别指的是:数据库的url,登录数据库的用户名和密码〔通常由DBA分配〕,而且该用户还应该具有相应的权限,才能执行相应的SQL语句。12.3
JDBC的经典用法数据库url通常遵守如下写法:jdbc:subprotocol:otherstuff其中jdbc是固定的,subprotocol指定连接到特定数据库的驱动程序,后面的other和stuff不是固定的,也没有较强的规律,不同的数据库的URL写法可能存在较大的差异。12.3
JDBC的经典用法MySQL数据库URL的写法:jdbc:mysql://hostname:port/databasenameAccess数据库URL的写法:jdbc:odbc:数据源名称,用户名,密码12.3
JDBC的经典用法〔3〕通过Connection对象创立Statement对象。方法有三个:createStatement():创立根本的Statement对象。prepareStatement(Stringsql):根据传入的SQL语句创立预编译的Statement对象。prepareCall(Stringsql):根据传入的SQL语句创立CallableStatement对象。12.3
JDBC的经典用法〔4〕使用Statement对象执行SQL语句。所有Statement对象都有以下三个方法:execute():可以执行任何SQL语句,但是比较麻烦。executeUpdate():主要用于执行DML和DDL语句。执行DML语句返回受SQL语句影响的行数。执行DDL语句返回0。executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象。12.3
JDBC的经典用法〔5〕操作结果集。如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象来取出查询结果。ResultSet对象主要提供了两类方法:next(),previous(),first(),last(),beforeFirst(),afterLast,absolute()等移动记录指针的方法。12.3
JDBC的经典用法getXXX(参数):获取记录指针指向行,特定列的值。该方法既可以使用列索引作为参数,也可以使用列名作为参数。使用列索引作为参数性能更好,使用列名作为参数可读比较好。ResultSet对象的实质是一个查询结果集,在逻辑结构上非常类似于一个表。12.3
JDBC的经典用法〔6〕回收数据库资源,包括关闭ResultSet,Statement和Connection资源。下面看一个最简单的例子,获得查询结果集的过程。12.3
JDBC的经典用法importjava.sql.*;publicclassConnMySql1{publicstaticvoidmain(String[]args)throwsException{Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection("jdbc:mysql://:3306/yy","root","123");//3.使用Connection来创立一个Statment对象Statementstmt=conn.createStatement();12.3
JDBC的经典用法//4.执行SQL语句。ResultSetrs=stmt.executeQuery("select*fromScores"); while(rs.next()){System.out.println(rs.getString(1)+"\t" +rs.getString(2)+"\t" +rs.getDate(3)+"\t" +rs.getInt(4)+"\t" +rs.getInt(5)); }12.3
JDBC的经典用法 if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } }}12.3
JDBC的经典用法importjava.sql.*;publicclassConnAccess{publicstaticvoidmain(String[]args)throwsException{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectionconn=DriverManager.getConnection("jdbc:odbc:yy","","");Statementstmt=conn.createStatement();12.3
JDBC的经典用法ResultSetrs=stmt.executeQuery("select*fromScores"); while(rs.next()){System.out.println(rs.getString(1)+"\t" +rs.getString(2)+"\t" +rs.getDate(3)+"\t" +rs.getInt(4)+"\t" +rs.getInt(5)); }12.3
JDBC的经典用法 if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } }}12.3
JDBC的经典用法importjava.sql.*;publicclassConnSqlSv{publicstaticvoidmain(String[]args)throwsException{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");Connectionconn=DriverManager.getConnection("jdbc:sqlserver://:1433;DatabaseName=yy","sa","123");Statementstmt=conn.createStatement();12.3
JDBC的经典用法ResultSetrs=stmt.executeQuery("select*fromScores"); while(rs.next()){ System.out.println(rs.getString(1) +rs.getString(2) +rs.getDate(3)+"\t" +rs.getInt(4)+"\t" +rs.getInt(5)); }12.3
JDBC的经典用法 if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } }}12.3
JDBC的经典用法1、使用executeUpdate()执行DDL和DML语句Statement提供了3个方法来执行SQL语句,上面的例子已经介绍了使用executeQuery()来执行查询语句。下面介绍使用executeUpdate()执行DDL和DML语句。其执行步骤与普通查询根本相似,区别在于执行了DDL语句以后返回0,执行DML语句以后返回受影响的记录条数。12.4执行SQL语句的方式
下面例子中对表进行更新和插入操作。12.4执行SQL语句的方式importjava.sql.*;publicclassExample12_3{publicstaticvoidmain(Stringargs[]){Connectioncon;Statementsql;ResultSetrs;try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}12.4执行SQL语句的方式catch(ClassNotFoundExceptione){System.out.println(""+e);}try{con=DriverManager.getConnection("jdbc:odbc:yy","","");sql=con.createStatement();intok=sql.executeUpdate("INSERTINTOscoreVALUES('2010006','将林','1988-12-20',78,90)");12.4执行SQL语句的方式sql.executeUpdate("UPDATEscoreSETenglishscore=60WHEREstuId='2010001'");rs=sql.executeQuery("SELECT*FROMscore");while(rs.next()){Stringnumber=rs.getString(1);Stringname=rs.getString(2);Datebirth=rs.getDate(3);doublees=rs.getInt(4);doublecs=rs.getInt(5);12.4执行SQL语句的方式System.out.println(number+","+name+","+birth+","+es+","+cs);}con.close();}catch(SQLExceptione){System.out.println(e);}}}12.4执行SQL语句的方式下面程序中使用executeUpdate()方法创立数据表,下面程序中并没有直接把数据库连接信息写在程序里,而是使用了一个mysql.ini文件来保存数据库连接信息,当需要把应用程序从开发环境移植到生产环境的时候,无须修改源代码,只需要修改相应的mysql.ini配置文件即可。12.4执行SQL语句的方式除此以外,还有一个小小的问题,在最后关闭数据库资源ResultSet、Statement和Connection,但执行这些代码的前提是前面所有的代码没有出现任何异常,否那么这些代码将得不到执行,这会导致数据库的资源泄露。使用try…finally块,把正常的代码放在try块里执行,把关闭数据库资源的代码放在finally块里执行。12.4执行SQL语句的方式importjava.sql.*;importjava.util.*;importjava.io.*;publicclassExecuteDDL{ privateStringdriver; privateStringurl; privateStringuser; privateStringpass; Connectionconn; Statementstmt;12.4执行SQL语句的方式publicvoidinitParam(StringparamFile)throwsException{//使用Properties类来加载属性文件Propertiesprops=newProperties();props.load(newFileInputStream(paramFile));driver=props.getProperty("driver"); url=props.getProperty("url"); user=props.getProperty("user"); pass=props.getProperty("pass"); }12.4执行SQL语句的方式publicvoidcreateTable(Stringsql)throwsException{ try{ //加载驱动 Class.forName(driver); //获取数据库连接conn=DriverManager.getConnection(url,user,pass);//使用Connection来创立一个Statment对象stmt=conn.createStatement();//执行DDL,创立数据表stmt.executeUpdate(sql); }12.4执行SQL语句的方式 //使用finally块来关闭数据库资源
finally{ if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } } }12.4执行SQL语句的方式publicstaticvoidmain(String[]args)throwsException{ExecuteDDLed=newExecuteDDL();ed.initParam("mysql.ini");ed.createTable("createtablejdbc_test"+"(jdbc_idintauto_incrementprimarykey,"+"jdbc_namevarchar(255)," +"jdbc_desctext);");System.out.println("---------建表成功--------"); }}12.4执行SQL语句的方式使用executeUpdate()执行DML与执行DDL根本相似,区别只是执行DDL时返回0,执行DML时返回受影响的记录条数。下面这个例子中执行一条insert语句,向刚刚程序中新建的表中插入几条记录。12.4执行SQL语句的方式importjava.sql.*;importjava.util.*;importjava.io.*;publicclassExecuteDML{ privateStringdriver; privateStringurl; privateStringuser; privateStringpass; Connectionconn; Statementstmt;12.4执行SQL语句的方式publicvoidinitParam(StringparamFile)throwsException{//使用Properties类来加载属性文件Propertiesprops=newProperties();props.load(newFileInputStream(paramFile));driver=props.getProperty("driver"); url=props.getProperty("url"); user=props.getProperty("user"); pass=props.getProperty("pass"); }12.4执行SQL语句的方式publicintinsertData(Stringsql)throwsException{ try{Class.forName(driver);//加载驱动 //获取数据库连接conn=DriverManager.getConnection(url,user,pass);//使用Connection来创立一个Statment对象stmt=conn.createStatement();//执行DML,返回受影响的记录条数returnstmt.executeUpdate(sql); }12.4执行SQL语句的方式 //使用finally块来关闭数据库资源
finally{ if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } } }12.4执行SQL语句的方式publicstaticvoidmain(String[]args)throwsException{ExecuteDMLed=newExecuteDML(); ed.initParam("mysql.ini");intresult=ed.insertData("insertintojdbc_test(jdbc_id,jdbc_name)"+"selectStuId,StuName"+"fromscores;");System.out.println("------系统中共有"+result+"条记录受影响------"); }}12.4执行SQL语句的方式2、使用execute()执行SQL语句Statement的execute()方法几乎可以执行任何SQL语句,但它执行SQL语句时比较麻烦,通常没有必要使用这个方法来执行SQL语句。但如果实在不清楚SQL语句的类型时,只能使用这个方法来执行该SQL语句了。12.4执行SQL语句的方式当使用execute()方法执行了SQL语句后的返回值只是boolean值,说明执行该SQL语句是否返回了ResultSet对象。那么如何来获取执行了SQL语句后得到的ResultSet对象呢?Statement提供了下面两个方法来获取:getResultSet():获取该Statement执行查询语句返回的ResultSet对象。getUpdateCount():获取该Statement执行DML语句所影响的ResultSet对象。12.4执行SQL语句的方式
下面的例子使用Statement的execute()方法来执行任意的SQL语句,执行不同的SQL语句时产生不同的输出。12.4执行SQL语句的方式importjava.sql.*;importjava.util.*;importjava.io.*;publicclassExecuteSQL{ privateStringdriver; privateStringurl; privateStringuser; privateStringpass; Connectionconn; Statementstmt; ResultSetrs;12.4执行SQL语句的方式publicvoidinitParam(StringparamFile)throwsException{//使用Properties类来加载属性文件Propertiesprops=newProperties();props.load(newFileInputStream(paramFile));driver=props.getProperty("driver"); url=props.getProperty("url"); user=props.getProperty("user"); pass=props.getProperty("pass"); }12.4执行SQL语句的方式publicvoidexecuteSql(Stringsql)throwsException{ try{Class.forName(driver);//加载驱动conn=DriverManager.getConnection(url,user,pass);//获取数据库连接stmt=conn.createStatement();//使用Connection来创立一个Statment对象booleanhasResultSet=stmt.execute(sql);//执行SQL,返回boolean值表示是否包含ResultSet12.4执行SQL语句的方式 //如果执行后有ResultSet结果集if(hasResultSet){rs=stmt.getResultSet();//获取结果集ResultSetMetaDatarsmd=rs.getMetaData();//ResultSetMetaData是用于分析结果集的元数据接口intcolumnCount=rsmd.getColumnCount();12.4执行SQL语句的方式//迭代输出ResultSet对象while(rs.next()){//依次输出每列的值for(inti=0;i<columnCount;i++){Sys
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2182-2024农灌机井取水量计量监测方法
- JJF 2165-2024实验室振动式液体密度仪校准规范
- 2024年度网络游戏虚拟物品交易合同
- 2024年度建筑工程施工承包合同标的明细
- 2024城市地下综合管廊建设项目融资合同
- 2024年度放心签建材销售合同模板
- 2024年工程质量检测与环保评估合同
- 2024年度广告发布合同标的广告内容与投放时间
- 2024小产权房买卖合同纠纷
- 地理教学课件教学课件
- 2024年入团知识考试题库及答案
- 肿瘤化疗导致的中性粒细胞减少诊治中国专家共识(2023版)解读
- 《新能源汽车概论》课件-6新能源汽车空调系统结构及工作原理
- 2024年共青团入团考试题库(附答案)
- 田径运动会各种记录表格
- 产科新生儿疫苗接种课件
- 企业信息管理概述课件
- 室外健身器材投标方案(技术方案)
- 足浴店店长聘用合同范本
- tubeless胸科手术麻醉
- 电商免责声明范本
评论
0/150
提交评论