JAVAJDBC,数据库JDBC
Java - JDBC数据库开发
JDBC是实现Java与各种数据库连接的关键。它提供了一个连接Java和数据库的程序接口,用户可以用SQL的形式编写访问请求,然后发送给数据库,结果会由这个接口返回。JDBC也是扩展Java的一个主要角色,这使得程序员可以很容易地使用Java语言来连接数据库。
1.通过JDBC访问数据库
JDBC是Java数据库连接的缩写,它提供了一种执行SQL语句和访问关系数据库的方法。JDBC由用Java编程语言编写的类和接口组成。同时还提供了一套JDBCAPI供程序开发人员访问数据库,并支持SQL语言。JDBC可以用来将Java代码连接到Oracle、DB2、SQLServer、MySQL等数据库,从而对数据库中的数据进行操作。
JDBC类似于微软的ODBC,但JDBC是Java操作数据库的方法,而ODBC使用C语言接口。使用JDBC,程序员可以很容易地将SQL语句转移到任何类型的数据库。也就是说,程序员不需要编写对应不同数据库的多个程序。用JDBC编写的程序可以自动将SQL语句发送到相应的数据库管理系统(DBMS)。
这里就不详细解释数据库了。这里只说数据库语言及其操作。SQL是结构化查询语言的缩写。它是一种介于关系代数和关系盐酸之间的结构化查询语言。它是一种定义和查询许多关系数据库数据的语言。Java是一种过程化语言,而SQL是一种高度非过程化的语言。SQL的本质是,无论多复杂的操作,都只有一句话。只要它告诉系统做什么,系统就会去做,而不是告诉系统怎么做。对数据库的操作可以概括为四个字,给予、删除、修改、搜索。
1)、建立表格
SQL语言使用CREATE TABLE语句定义基本表,其一般格式为:
创建表名(
1字段类型约束,
2字段类型约束,
);
再看学生表的建立,其中定义和列出了学号、姓名、年龄和性别:
创建表学生(
ID varchar(10)不为空,
名称varchar(10),
Age varchar(3),
Sex varchar(1)
);
系统执行CREATE语句后,将在数据库中建立一个新表。关于数据类型,每个数据库的数据类型都有一些不同。你只需要看使用哪个数据库。
2)插入数据
建立表后,可以插入数据。插入数据的基本格式是:
插入表名(字段1,字段2.)
值(值1,值2.);
如果在每个域名下插入数据,其中的域名将变成:
插入到表名
值(值1,值2.);
使用前面建立的学生表,举一个插入数据的例子:
插入学生(ID,姓名,性别)
价值观( 41009160 ,小吴玲玲,男);
以上是一个年龄不详的学生的信息。我们来看一个完整的学生信息:
插入学生
值( 41009161 ,小龙, 23 ,男);
在插入数据时,我们经常会遇到数据无法插入的问题。这时,我们必须检查数据是否违反了表建立中指定的约束。如果创建表时规定学号不能为空,插入数据时不插入学号,则会报错。
3)检查数据。
插入数据后,通常需要查看数据是否实际添加到了数据库中,然后需要查看数据命令。查询语句是:
选择[全部着色]字段名[字段名列表表达式]
从表名
[WHERE条件表达式]
[按字段名1分组[有条件表达式]]
[按字段名称2排序[ASCDESC]]
查看数据意味着根据给定的约束从数据库中提取所需的数据。其中[GROUP BY field name 1[HAVING conditional expression]]是指根据字段1的条件表达式对数据进行分组。[ORDER BY字段名2 [ASCDESC]]是指字段名3的升序或降序排序。
如果查询所有数据,还有一个简单的格式:
SELECT * FROM表名;
例如,查询先前建立的表中的所有数据:
SELECT * FROM student
有时,只有当您关心学生编号和姓名时,才可以使用指定字段名称的查询语句,例如:
从学生中选择ID、姓名;
还有人想看谁比他的年龄大(假设他的年龄是20),数据库也提供了相应的查询方法。此时将使用[WHERE条件表达式],其查询语句为:
从学生中选择姓名,年龄
或者有人可能想直接看到其他人有多年轻,然后就会用到[字段列表表达式]。其查询语句如下:
从studentWHERE Age 20中选择Name,Age-20;
还有一个很特殊的情况。如果查询年龄为20岁且学号大于41009100的数据,将使用条件运算符。下表显示了WHERE子句的所有条件运算符:
应用条件运算符后,其查询语句为:
SELECT姓名、年龄、ID from学生,其中年龄=20,ID 41009160。
3.JDBC编程步骤
JDBC编程的基本步骤是设置数据源、加载JDBC驱动、指定数据库、打开数据库连接、提交查询、处理查询结果等。在讲解编程的步骤时,先看一段代码,一边学习代码,一边再学习成步骤。
公共类测试{
公共静态void main(String[] args){
尝试{
//加载驱动程序
class . forname( sun . JDBC . odbc . jdbcodbc driver );
//打开数据库连接,aaa是数据源名称。
connection con=driver manager . get connection( JDBC:odbc:AAA ,, );
//提交查询
语句ST=con . create statement();
//将记录插入数据库
ST . Execute Update( insert into student values( 41009160 ,小五菱, 22 ,男);
//获取查询结果
ResultSet RS=ST . execute query(" select * from student ");
//检查结果
system . out . println( ID/姓名/年龄/性别);
while (rs.next()) {
string ID=RS . getstring( ID );
string Name=RS . getstring( Name );
string Age=RS . getstring( Age );
string Sex=RS . getstring( Sex );
System.out.println(ID /姓名/年龄/性别);
RS . close();//关闭RsultSet对象
ST . close();//关闭语句对象
con . close();//关闭连接对象
} catch(异常e) {
e . printstacktrace();
}
在上面的程序中,连接数据库,使用数据源,建立数据库,最后输出它的数据库名。
1)创建一个数据源。
当编程JDBC时,您必须首先建立一个ODBC数据源。使用的操作系统和数据库可能不同,但具体步骤不会变。
(1) Windows桌面开始控制面板管理工具数据源(ODBC),弹出ODBC数据管理器对话框;
(2)、添加创建新数据源对话框根据使用的数据库选择。这里以Access为例选择Access选项完成;
(3)、弹出“OBDC MicrosoftAccess安装”对话框,在“数据源名称”文本框中根据自己的需要命名,输入aaa这里;
(4)单击“确定”按钮,您可以看到一个名为aaa的附加数据源。
2)加载驱动程序。
您可以通过调用方法Class.forName来加载驱动程序,加载驱动程序只需要一行代码。以JDBC-ODBC桥、Oracle连接和MySQL连接为例检查它们的驱动程序:
JDBC-ODBC桥:sun . JDBC . ODBC . jdbcodbc driver;
Oracle连接:Oracle . JDBC . driver . Oracle driver;
MySQL: org.gjt.mm.mysql.Driver .
当使用Oracle和MySQL连接相应的数据源时,需要在类路径中添加相应的配置。
3)指定数据库。
JDBC提供了一个徽标专用的驱动程序,它可以使相应的驱动程序识别数据库并与之建立连接。因为JDBC URL将用于不同的驱动程序,所以它的惯例很少。首先,它允许不同的驱动程序使用不同的方案来命名数据库。其次,JDBC URL允许驱动程序将所有需要的信息编译到其中。这样,想要与给定数据库对话的applet就可以打开数据库连接,而不需要用户做任何系统管理工作。第三,JDBC URL应该允许某个程序的间接访问。也就是说,JDBC URL可以指向一个逻辑主机或数据库名称,而这个逻辑主机或数据库名称会被网络命名系统动态转换成一个实际的名称。
JDBC的标准语法如下。它由3部分组成,用冒号分隔:
Jdbc:子协议:子名称
在JDBC编程中,JDBC URL中的协议始终是JDBC,而JDBC永远不会改变。子协议是指驱动程序或数据库连接机制的名称。子名称是标识数据库的一种方式。这里以JDBC-ODBC桥、Oracle连接和MySQL连接为例。它们是:
Jdbc:odbc:数据源名称
Jdbc:oracle:thin:@数据库服务器主机名:1521:SID
JDBC:MySQL://本地主机/数据库名称
4)打开数据库连接。
Connection对象表示与数据库的连接。连接过程包括执行的SQL语句和连接返回的结果。一个应用程序可以有一个或多个到单个数据库的连接,也可以有多个到多个数据库的连接。打开数据库连接就是用合适的驱动程序建立与数据管理系统的连接。DriverManager类是JDBC的管理层,作用于用户和驱动之间。它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。在DriverManager类中加载并注册了驱动程序之后,就可以建立与数据库的连接了。当调用DriverManager.getConnection方法进行连接请求时,DriverManager将验证每个驱动程序,看它是否可以建立连接。使用用户名和密码打开数据库连接的基本代码是:
connection con=driver manager . get connection(URL,“用户”,“密码”);
这段代码看起来很简单,但实际上包含了如何提供URL的难度,所以有时会分成两个部分:
string URL=" JDBC:odbc:AAA ";
connection con=driver manager . get connection(URL,“用户”,“密码”);
DriverManager类包含一系列驱动程序类,这些驱动程序类通过调用DriverManager.registerDriver方法来注册自己。在驱动程序类被加载并在DriverManager类中注册后,它们可用于建立与数据库的连接。当调用DriverManager.getConnection方法进行连接请求时,DriverManager会检查每个驱动程序,看是否可以建立连接。
5)提交查询。
与数据源建立连接后,可以将SQL语句发送到其关联的数据库。JDBC可以发送的SQL语句的类型没有限制。
语句对象用于向数据库发送SQL语句。3中有Statement对象,它们都作为在给定连接上执行SQL语句的包容器:Statement、PreparedStatement(继承自Statement)和CallableStatement(继承自PreparedStatement)。它们都专用于发送特定类型的SQL语句:语句对象用于执行不带参数的简单SQL语句;PreparedStatement对象用于执行带或不带IN参数的预编译SQL语句;CallebelStatement对象用于执行对数据库存储过程的调用。
查询应用程序语句对象的代码如下。语句是连接接口的公共对象,它是由creatStatement方法创建的。语句专门用于发送SQL语句。提交的代码是:
statement stmt=con . create statement();
6)获取查询结果。
SQL对象编写完成后,可以用来调用相应的方法查询和修改数据库。并将查询结果放在ResultSet类声明的对象中,SQL语句对数据库的查询操作会返回一个ResultSet对象。它的代码是:
resultsets=stmt . exce query(" select * from table name ");
作为一组行,查询也可以说是存储在ResultSet对象中的表。结果集包含满足SQL语句中条件的所有行。ResultSet.net()方法用于移动到结果集中的下一行,使下一行成为当前行,并返回一个布尔值来指示该行是否是最后一行。ResultSet保持光标指向其当前数据行。光标最初位于第一行之前,因此第一次调用next()会将光标放在第一行。每次调用next()方法时,光标向下移动一行。当光标移动到最后一行时,next()方法返回false。
ResultSet包含满足SQL语句中条件的所有行,它通过一组get()方法提供对这些行中数据的访问方法。Get()提供了一种获取当前行中某一列的值的方法。您可以在每一行中从左到右获取列值。列名或列号可用于标识要从中获取数据的列。有许多get()方法,如下表所示:
4.使用PreparedStatement进行预编译。
创建语句对象时,它提供了创建SQL查询、执行查询和检索返回结果的功能。PreparedStatement的接口继承自语句,与语句相比,PreparedStatement增加了在执行SQL调用之前将输入参数绑定到SQL调用的能力。它用于执行带或不带输入参数的预编译SQL语句。因为编译了PreparedStatement对象,所以执行速度比语句爱用的那个快。因此,当需要多次调用SQL语句时,可以考虑使用PreparedStatement接口。
PreparedStatement接口继承了所有语句方法,添加了一些方法,并更改了三个重要的方法,它们是:
setXXX();
execute query();
execute update();
其中setXXX()方法中的XXX表示参数对应类型。例如,如果参数的类型为String,则方法为SetString()。SetXXX()方法有两个参数,第一个参数指的是要设置参数的位置,第二个参数指的是要设置的具体参数。比如PS。SET INT(12000);
如果基本数据库和驱动程序在提交语句后保持这些语句打开,则同一个PreparedStatement可以执行多次。如果不是这样,那么尝试使用PreparedStatement对象而不是Statement对象来提高性能是没有意义的。
以下是使用PreparedStatement的一段代码:
公共类测试{
公共静态void main(String[] args){
尝试{
//加载驱动程序
class . forname( JDBC . odbc . JDBC odbc driver );
//打开数据库连接,aaa是数据源名称。
connection con=driver manager . get connection( JDBC:odbc:AAA ,, );
//提交查询
prepared statement PS=con . prepare statement( select * from student where Age
ps.setString(1, 23 );
ResultSet RS=PS . execute query();
//检查结果
system . out . println( ID/姓名/年龄/性别);
while (rs.next()) {
string ID=RS . getstring(1);
string Name=RS . getstring(2);
string Age=RS . getstring(3);
string Sex=RS . getstring(4);
System.out.println(ID /姓名/年龄/性别);
RS . close();
PS . close();
con . close();
} catch(异常e) {
e . printstacktrace();
}
5.[计]元数据
元数据用于描述数据库或数据库的一部分的数据。这是关于数据的数据。元数据用于动态调整数据库的内容和结果集。可以分为两类:数据库和结果集。
1)、数据库的数据库元数据
DatabaseMetaData对象可以提供有关特定数据库结果的信息。数据库元数据对象是通过数据库的连接获得的,如下:
database metadata DMD=con . get metadata();
DatabaseMetaData对象提供了许多方法。根据返回结果的类型,这些方法可以分为四类。它们是分别返回字符串、整数、布尔和结果集的方法。例如,以下方法返回一个结果集:
getTables(String catalog,String checmaPattern,String tableNamePattern,String types[]);
2)结果集的结果集元数据元数据
ResultSetMetaData是关于结果集的元数据。它可以通过getMetaData()方法从结果集中获取元数据:
resultset metadata esmd=RS . get metadata();
ResultSetMetaData有很多方法,例如getColumnCount()方法,用于返回ResultSet对象中的列数:
公共类测试{
公共静态void main(String[] args){
尝试{
class . forname( JDBC . odbc . JDBC odbc driver );
connection con=driver manager . get connection( JDBC:odbc:AAA ,, );
//定义DatabaseMetaData对象
database metadata DMD=con . get metadata();
//检索可在给定类别中使用的表的描述
ResultSet rs=dmd.getTables(null,null,null,new String[]{ table });
//定义ResultSetMetaData对象
resultset metadata rsmd=RS . get metadata();
//返回辅助结果集对象中的列数
int cols=rsmd . get column count();
for(int I=0;i colsi ) {
//获取指定页面的名称。
system . out . print(rsmd . get column name(I) \ t );
system . out . println();
while (rs.next()) {
for(int I=0;i colsi ) {
system . out . println(RS . getstring(I) \ t );
system . out . println();
} catch(异常e) {
e . printstacktrace();
}
6.结果集处理
在前面的示例中,假设结果集是只读的。结果集的处理可以分为可滚动和可更新。滚动是指显示的结果集的光标所在的行,可以向前或向后移动,或者移动到指定的特定行。更新是指允许客户端程序修改结果集中的数据。
1)可滚动的结果集
JDBC驱动程序是否支持可滚动结果集由DatabaseMetaData对象决定。在DatabaseMetaData接口中定义了一个supportsResultSetType(inttype)方法,其返回结果为boolean,用于检查数据库是否支持给定的结果集类型。在实际的程序开发中,DatabaseMetaData并不用于开发,而是用语句直接指定,如下面的程序代码所示:
语句st=con.createStatement(类型,并发);
有三种类型。
TYPE_FORWARD_ONLY:结果集游标只能向前移动。
TYPE_SCROLL_INSENSITIVE:可滚动,对数据变化不敏感。
TYPE_SCROLL_SENSITIVE:可滚动,对数据变化敏感。
对结果集进行操作意味着对结果集的游标进行操作,其中定义了许多方法:
Absolute(int row):将光标移动到给定的行。
AfterLast():将光标移动到最后一行之后。
BeforeFirst():将光标移动到第一行的前面。
IsAfterLast():确定光标是否在最后一行之后。
IsBeforeFirst():确定光标是否在第一行的前面。
First():将光标移动到第一行。
Last():将光标移动到最后一行。
Is():确定光标是否在isFirst行。
IsLast():确定光标是否在最后一行。
Previous():将光标移动到当前行的前一行。
Next():将光标移动到当前行的下一行。
Relative(intt):将光标相对移动几行。
GetRow():获取当前行数。
下面是一些方法的用法:
公共类测试{
公共静态void main(String[] args){
尝试{
class . forname( JDBC . odbc . JDBC odbc driver );
connection con=driver manager . get connection( JDBC:odbc:AAA ,, );
语句ST=con . create statement(ResultSet。TYPE_SCROLL_INSENSITIVE,ResultSet。CONCUR _ READ _ ONLY);
ResultSet RS=ST . execute query(" select * from student ");
//检查结果
RS . absolute(2);
system . out . println(RS . getstring(1));
RS . previous();
system . out . println(RS . getstring(1));
RS . first();
system . out . println(RS . getstring(1));
RS . relative(3);
system . out . println(RS . getstring(1));
system . out . println(RS . getrow() );
RS . close();
ST . close();
con . close();
} catch(异常e) {
e . printstacktrace();
}
2)结果集可以更新。
在ResultSet类中,getConcurrency方法用于确定结果集是否可更新。ResultSet接口中有许多更新方法,如下所示:
UpdateBoolean():用布尔值更新指定的列。
UpdateByte():用字节值更新指定的列。
UpdateBytes():用字节数组值更新指定的列。
UpdateCharacterStream():用字符流的值更新指定的列
UpdateDate():用日期值更新指定的列。
Update():用double值更新指定的列。
UpdateFloat():用Float类型的值更新指定的列。
UpdateInt():用Int类型的值更新指定的列。
Update():用long类型的值更新指定的列。
UpdateNull():为可空的列指定一个空值。
Update():用对象值更新指定的列。
UpdateRow():用resultset对象的新内容进行更新。
Updateshort():用short类型的值更新指定的列。
UpdateString():用字符串类型的值更新指定的列。
UpdateTime():用时间值更新指定的列。
可更新结果集的程序和可滚动结果集类似,但可更新结果集的循环没有可滚动结果集重要,这里不给出可更新结果集的代码。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。