资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,JDBC,Java,数据库编程接口,教材第,12,章,12.1 JDBC,概述,在,Java,程序中,连接数据库采用,JDBC,(,Java,DataBase,Connectivity,)技术。,JDBC,是由,Sun,公司提供的与平台无关的数据库连接标准,它将数据库访问封装在少数几个方法内,使用户可以极其方便地查询数据库、插入新的数据、更改数据。,JDBC,是一种规范,目前各大数据库厂商基本都提供,JDBC,驱动程序,使得,Java,程序能独立运行于各种数据库之上,。,12.1 JDBC,概述,Java application,JDBC Driver,Manager,JDBC API,JDBC Driver,(,数据库厂家提供,),JDBC Driver API,DBMS,JDBC,驱动程序类型,SUN,定义的,JDBC,驱动程序类型:,Type1:,JDBC-ODBC,桥,作为,JDK1.1,后的一部分,是,sun.jdbc.odbc,包的一部分,Application-JDBC-ODBC Bridge(Type1,jdbc,driver)-JDBC-ODBC Library-ODBC Driver-Database,通过,ODBC,驱动程序提供,JDBC,访问,缺点是必须加载到目标机器上,并且,ODBC-JDBC,转换影响效率。适用于快速的原型系统,没有提供,JDBC,驱动的数据库如,Access,。,Type2: Java to Native API,利用开发商提供的本地库来直接与数据库通信。,Application-JDBC Driver(Type2,jdbc,driver)-Native Database library-Database,比,Type1,性能略好。,JDBC,驱动程序类型,Type3: Java to net,Application-,Jdbc,Driver(Type3,jdbc,driver)-java middleware-JDBC Driver-Database,具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的。,Type4: Java to native,dababase,Application-,Jdbc,driver(type4,jdbc,driver)-database engine-database,最高的性能,通过自己的本地协议直接与数据库引擎通信,具备在,Internet,装配的能力。,JDBC,的工作过程,JDBC,的工作过程,与数据源建立连接:通过,DriverManager,类建立与数据源的连接,这个连接作为数据操作的起点,也是连接会话事务操作的基础;,向数据库发出,SQL,命令:通过,Statement,类或者,PreparedStatement,类向数据源发送,SQL,命令,然后再调用类中的,execute,方法来执行,SQL,命令;,处理数据源返回的结果:对于,DDL/DML,操作,返回被修改的记录数,对于查询操作,返回结果集,ResultSet,,通过遍历结果集可以获得所需的查询结果。,数据库连接,每个,JDBC,应用程序至少要有一个,JDBC,驱动程序版本,,JDBC,驱动程序是,Driver,接口类的实现。,Driver,类是驱动程序厂家实现的接口,,Driver,使,DriverManager,和,JDBC,应用程序层可以独立于具体的数据库系统。,应用程序,JDBC,Oracle,驱动程序,MySQL,驱动程序,JDBC,功能结构图,JDBC API(,类),java.sql.,DriveManager,负责装载、拆除驱动程序,负责连接驱动程序。,java.sql.,Connection,实现对某一数据库的连接功能(建立连接)。,java.sql.,Statement,在一个给定的连接中作为执行,SQL,语句的容器。,java.sql,.,ResultSet,保存,SQL,语句执行结果,java.sql.,PreparedStatement,用于执行预编译的,SQL,声明,java.sql.,CallableStatement,用于执行数据库中存储过程的调用,12.2 JDBC,开发一般步骤,本节首先介绍数据库编程的一般过程,然后通过几个有代表性的实例介绍数据库编程方法。,JDBC,开发一般步骤:,加载驱动程序;,连接数据库,;,建立与执行,SQL,语句,;,对返回结果集进行操作,;,关闭对象资源。,12.2 JDBC,开发一般步骤,加载驱动程序,要连接数据库,首先要加载,JDBC,驱动程序。加载,JDBC,驱动程序的语句如下:,Class.forName(JDBC,驱动程序名,) ;,或,Class.forName(JDBC,驱动程序名,).,newInstance,();,例如,要加载,JDBC-ODBC,桥驱动程序,使用以下语句;,Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver,”);,使用,JDBC-ODBC,桥驱动程序,可以通过,ODBC,数据源连接数据库。,12.2 JDBC,开发一般步骤,连接数据库,加载了,JDBC,驱动程序后,便可以连接数据库了。连接数据库使用以下语句;,Connection,连接变量,=,DriverManager,.,getConnection,(,数据库,URL,,用户帐号,用户密码,);,数据库,URL,由三部分组成:,jdbc:subProtocol:subName,即主通信协议、子通信协议和子名称。,例如,Connection,conn,=,DriverManager,.,getConnection,(“jdbc:odbc:myDB,”, “,li,”, “1234”);,如果连接成功,对数据库的任何操作都可以通过,conn,来进行了。,12.2 JDBC,开发一般步骤,建立与执行,SQL,语句,要对连接的数据库进行查询、更改或添加数据,可通过,SQL,语句并创建相关对象(,Statement,PreparedStatement,或,CallableStatement,)。,建立,Statement,对象。执行,SQL,语句需要建立,Statement,对象变量。通过,Connetion,对象,createStatemnet,(),方法创建该对象的语句如下:,Statement stmt =,conn.,createStatement,(),;,执行,SQL,语句。建立上述对象之后,有,3,种方法执行,SQL,语句,分别是:,executeQuery(String,sql,);,/,执行,select,的,SQL,查询语句,该语句返回单个,ResultSet,对象。,。,executeUpdate(String,sql,);,/,执行,insert,、,delete,、,update,更新语句,以及,DDL,语句,该语句返回整数。,execute(String,sql,);,/,执行给定的,SQL,语句,该语句可能返回多个结果。,例如:,stmt.,executeUpdate,(insert,into employee values(2020,翟建设,男,746);,String,sql,=,SELECT * FROM employee WHERE sex=,男 ”,;,ResultSet,rs,=,stmt.,executeQuery,(,sql,);,12.2 JDBC,开发一般步骤,对返回结果集进行操作,ResultSet,对象。用来保存查询的所有结果数据。通过,Statement,对象的,executeQuery,(),方法,返回一个,ResultSet,对象,例如:,String,sql,=SELECT * FROM employee WHERE sex=,男 ”,ResultSet,rs,=,stmt.,executeQuery,(,sql,);,ResultSet,对象以类似表中记录的组织方式来组织查询到的结果。使用下列的循环语,句对查询结果逐行处理。,while (,rs.next,() ) ,/,对每行记录进行处理,例如:,System.out.println(rs.getInt(1) + t + rs.getString(2);,12.2 JDBC,开发一般步骤,关闭对象,释放资源,对数据库操作完成后,应该使用对象的,close(),方法将操作数据库的对象资源关闭。其句型是:,对象名,.close(),例如,要关闭前面建立的对象资源,使用以下语句:,rs.close,();,stmt.close,();,conn.close,();,12.3 JDBC,开发实例,例:查询数据库,假定对数据库,myDB.mdb,已经建立了数据源,myDB,,,myDB.mdb,中有一个表,employee,。该实例利用,JDBC-ODBC,桥驱动程序,访问,Access,数据库,myDB.mdb,,显示表中所有职员的,no,(编号)、,name,(姓名)、,sex,(性别)和,salary,(工资)。,import,java.sql,.*;,class Query ,public static void main(String,args, ) ,try,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,); ,catch (,ClassNotFoundException,ce,),System.out.println(SQLException:+ce.getMessage,(); ,1,查询数据库,1,查询数据库(续),try ,Connection con =,DriverManager.getConnection(jdbc:odbc:myDB,);,Statement stmt =,con.createStatement,();,String,sqlstr,= select * from employee;,ResultSet,rs,=,stmt.executeQuery,(,sqlstr,);,while (,rs.next,() ) ,System.out.println,(,编号, +,rs.getString(no,) + t,+ ,姓名, +,rs.getString(name,) + t,+ ,性别, +,rs.getString(sex,) + t,+ ,工资, +,rs.getFloat(salary,) );,rs.close,();,stmt.close,();, catch (,SQLException,e) ,System.out.println(SQLException:+e.getMessage,(); ,2,插入记录,假定对数据库,myDB.mdb,已经建立了数据源,myDB,,,myDB.mdb,中有一个表,employee,,该实例利用,JDBC-ODBC,桥驱动程序,访问,Access,数据库,myDB.mdb,,在表中插入,2,条记录,其数据分别为:,2001,,邢雪花,女,,650,和,2020,,翟建设,男,,746,。,import,java.sql,.*;,class,Insert1,public static void main(String,args,) ,try,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,); ,catch (,ClassNotFoundException,ce,),System.out.println(SQLException:+ce.getMessage,(); ,2,插入记录(续),try ,Connection con =,DriverManager.getConnection(jdbc:odbc:myDB,li,1234);,Statement stmt =,con.createStatement,();,String,sqlstr,= insert into employee values(2001, ,邢雪花,女,650);,stmt.executeUpdate,(,sqlstr,);,stmt.executeUpdate(insert,into employee values(2020,翟建设,男,746);,stmt.close,();,con.close();,catch (,SQLException,e),System.out.println(SQLException:+e.getMessage,(); ,3,修改记录,该实例利用,JDBC-ODBC,桥驱动程序访问,Access,数据库,myDB.mdb,,修改表中,2,条记录,将,name,为翟建设的记录的,no,改为,3000,,将,no,值为,2001,记录中的,salary,改为,900,。,import,java.sql,.*;,class,Update1,public static void main(String,args,) ,try,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,); ,catch (,ClassNotFoundException,ce,),System.out.println(SQLException:+ce.getMessage,(); ,try ,Connection con =,DriverManager.getConnection,( jdbc:odbc:myDB,li,1234);,Statement stmt =,con.createStatement,();,String,sql,= ,update employee set no= 3000 + where name= ,翟建设,;,stmt.executeUpdate(sql,);,sql,= ,update employee set salary=900 +where no = 2001,;,stmt.executeUpdate(sql,);,stmt.close,();,con.close();,catch (,SQLException,e),System.out.println(SQLException:+e.getMessage,(); ,3,修改记录(续),4.,删除记录,该实例利用,JDBC-ODBC,桥驱动程序,访问,Access,数据库,mdDB.mdb,,删除,employee,表中,no,值为,1004,的记录。,import,java.sql,.*;,class Delete ,public static void main(String,args,) ,try ,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,);, catch (,ClassNotFoundException,ce,) ,System.out.println(SQLException,: +,ce.getMessage,();,4.,删除记录(续),try,Connection con =,DriverManager.getConnection(jdbc:odbc:myDB,li,1234);,Statement stmt =,con.createStatement,();,String,sql,= ,delete from employee where no=1004,;,stmt.executeUpdate(sql,);,stmt.close();,con.close();,catch (,SQLException,e),System.out.println(SQLException:+e.getMessage,(); ,5.,建立表,该实例利用,JDBC-ODBC,桥驱动程序访问,Access,数据库,mdDB.mdb,,建立表,student,,其中有,s_num,(学号)、,s_name,(姓名)和,score,(成绩),3,列数据。给表中输入一条记录,其数据为:,9901,,张学军,,85,。,import,java.sql,.*;,class Create ,public static void main(String,args,) ,try,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,); ,catch (,ClassNotFoundException,ce,),System.out.println(SQLException:+ce.getMessage,(); ,5.,建立表(续),try ,Connection con =,DriverManager.getConnection(jdbc:odbc:myDB,li,1234);,Statement stmt =,con.createStatement,();,String,sql,= ,create table student (s_num char(4), s_name char(6) null, score,int,),;,stmt.executeUpdate,(,sql,);,sql,= ,insert into student(s_num, s_name,score) values(9901, ,张学军,85),;,stmt.executeUpdate,(,sql,);,stmt.close,();,con.close();,catch (,SQLException,e) ,System.out.println(SQLException:1 +,e.getMessage,();,6.,删除表,该实例利用,JDBC-ODBC,桥驱动程序访问,Access,数据库,myDB.mdb,,删除表,student,。,import,java.sql,.*;,class Drop ,public static void main(String,args,) ,try ,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,);,catch (,ClassNotFoundException,ce,) ,System.out.println(SQLException:+ce.getMessage,();,try,Connection con = DriverManager.getConnection(jdbc:odbc:myDB,li,1234);,Statement stmt =,con.createStatement,();,String,sql,= ,drop table student,;,stmt.executeUpdate,(,sql,);,stmt.close();,con.close();,catch (,SQLException,e) ,System.out.println(SQLException:1 +,e.getMessage,();,6.,删除表(续),7,取表中各列名称,该实例利用,JDBC-ODBC,桥驱动程序访问,Access,数据库,myDB.mdb,,取表,student,中各列名称。,import,java.sql,.*;,class,Meta,public static void main(String,args,) ,try ,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,);,catch (,ClassNotFoundException,ce,) ,System.out.println(SQLException:+ce.getMessage,();,try ,Connection con =,DriverManager.getConnection(jdbc:odbc:myDB,li,1234);,Statement stmt =,con.createStatement,();,String,sqlstr,= SELECT * FROM student ;,ResultSet,rs,=,stmt.executeQuery,(,sqlstr,);,ResultSetMetaData,rsmd,=,rs.getMetaData,();,for(int,i = 1; i =,rsmd.getColumnCount,(); i+) ,if ( i=1 ),System.out.print,(,rsmd.getColumnName(i,) );,else System.out.print(,+,rsmd.getColumnName(i,);,rs.close,();,stmt.close,();,con.close,();, catch (,SQLException,e) ,System.out.println(SQLException:1 +,e.getMessage,();,7,取表中各列名称(续),12.4 JDBC,中的主要接口和类,Java,应用程序访问数据库主要是通过,JDBC API,实现的,通过下面几个重要接口和类:,DriverManager,类,C,onnection,接口,Statement,接口,PreparedStatement,接口,CallableStatement,接口,ResultSet,接口,ResultSetMetaData,接口,DatabaseMetaData,接口,1.,DriverManager,类,DriverManager,类是,Java.sql,包中用于数据库驱动程序管理的类,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接,也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。,DriverManager,类直接继承自,java.lang.object,,,其主要成员方法:,static Connection,getConnection,(String,url,),:通过指定的,URL,创建数据库的连接;,static Connection,getConnection,(String,url,String,user,String,password,),:通过指定的,URL,及用户名、密码创建数据库的连接;,static void,registerDriver,(Driver,driver),:注册数据库驱动程序。,2.,Connection,接口,Connection,接口是用来表示数据库连接的对象,对数据库的一切操作都是在这个连接的基础上进行的。,Connection,接口的主要成员方法:,Statement,createStatement,(),:创建一个,Statement,对象;,Statement,createStatement,(,int,resultSetType,int,resultSetConcurrency,),:创建一个,Statement,对象,它将生成具有特定类型和并发性的结果集,其中,resultSetType,有以下几种值:,TYPE_FORWARD_ONLY,:结果集不可滚动;,TYPE_SCROLL_INSENSITIVE,:结果集可滚动,不反映数据库的变化;,TYPE_SCROLL_SENSITIVE,:结果集可滚动,反映数据库的变化。,resultSetConcurrency,有以下几种值:,CONCUR_READ_ONLY,:不能用结果集更新数据;,CONCUR_UPDATABLE,:能用结果集更新数据。,boolean,getAutoCommit,(),:返回,Connection,类对象的,AutoCommit,状态;,void,setAutoCommit,(boolean,autoCommit,),:设定,Connection,类对象的,AutoCommit,状态,为,true,时,,SQL,语句组被提交作为一个单独的事务;否则,SQL,语句组的事务分组由,commit,或,roolback,语句确定。,2.,Connection,接口(续),Connection,接口的主要成员方法:,void,commit,(),:提交对数据库的改动并释放当前连接持有的数据库的锁;,void,rollback,(),:回滚当前事务中的所有改动并释放当前连接持有的数据库的锁;,void,setReadOnly,(),:设置连接的只读模式;,void,close,(),:立即释放连接对象的数据库和,JDBC,资源。,boolean,isClosed,(),:测试连接是否已经关闭。,DatabaseMetaData,getMetaData,(),:建立,DatabaseMetaData,类对象。,PreparedStatement,prepareStatement,(String,sql,),:建立,PreparedStatement,对象。,3. Statement,接口,Statement,接口用于在已经建立的连接的基础上向数据库发送,SQL,语句的对象。它只是一个接口的定义,其中包括了执行,SQL,语句和获取返回结果的方法。,有,3,种,Statement,对象:,Statement,、,PreparedStatement,(,继承自,Statement,),和,CallableStatement,(,继承自,PreparedStatement,)。,它们都作为在给定连接上执行,SQL,语句的容器,每个都专用于发送特定类型的,SQL,语句:,Statement,对象:,用于执行不带参数的简单,SQL,语句;,PreparedStatement,对象:,用于执行带或不带,IN,参数的预编译,SQL,语句;,CallableStatement,对象:,用于执行对数据库已存储过程的调用。,3. Statement,接口,创建,statement,对象的方法如下:,Statement stmt =,con.createStatement,();,Statement,接口定义中包括的主要方法,ResultSet,executeQuery,(String,sql,),:使用,Select,命令对数据库进行查询,返回结果集;,int,executeUpdate,(String,sql,),:使用,Insert/Delete /Update/DDL,命令对数据库进行增、删、改、建等操作;,boolean,execute,(String,sql,),:执行,SQL,语句。,void,close,(),:关闭,Statement,对象对数据库的联机。,void,addBatch,(String,sql,),:在,Statement,语句中增加用于数据库操作的,SQL,批处理语句。,Connection,getConnection,(),:获取对数据库的连接。,4.,PreparedStatement,接口,PreparedStatement,接口和,Statement,类的不同之处在,于,PreparedStatement,类对象会将传入的,SQL,命令事先编好等待使用,当有单一的,SQL,指令需多次执行时,用,PreparedStatement,会比,Statement,效率更高。,PreparedStatement,接口的主要方法:,ResultSet,executeQuery,(String,sql,),:使用,Select,命令对数据库进行查询,返回结果集;,int,executeUpdate,(String,sql,),:使用,Insert/Delete /Update/DDL,命令对数据库进行增、删、改、建等操作;,void,setXXX,(int,parameterIndex,XXX,x),:给,PreparedStatement,类对象的,IN,参数设定为,XXX,类型的值。这里,XXX,可为,int,、,float,、,NULL,、,String,、,Date,和,Time,。,5.,CallableStatement,接口,CallableStatement,接口,用于执行对数据库已存储过程的调用。在,CallableStatement,对象中,有一个通用的成员方法,call,,,这个方法以名称的方式调用数据库中的存储过程。在数据库调用过程中,可以通过设置,IN,参数向调用的存储过程提供执行所需的参数。另外,在存储过程的调用中,通过,OUT,参数获取存储过程的执行结果。,创建,CallableStatement,对象的方法如下:,CallableStatement,cstmt,=,conn.prepareCall(“call,procedure_name,(?,?)”);,向存储过程传递,IN,参数值的方法是通过,setXXX,(),语句完成的。例如:,cstmt.,setByte,(1,25);,cstmt.,setInt,(2,64);,5.,CallableStatement,接口(续),例,14-6,利用,JDBC,接口调用数据库的存储过程,Query_Student,。,存储过程,Query_Studen.sql,的脚本如下:,USE study,GO,CREATE PROCEDURE Query_Study2,(,no char(6),name char(20) OUTPUT,dept char(10) OUTPUT,),AS,SELECT name=,sname,dept,=,sdept,FROM student,WHERE,sno,=no,5.,CallableStatement,接口(续),/,JdbcCallProcedure.java,的代码,import,java.sql,.*;,import,javax.swing,.*;,class,jdbcCallProcedure,public static void main(String,args,) ,try ,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver,);,String DATABASE_URL= ,jdbc:odbc:Driver,=SQL,Server;Server,=ZGZ1,+ + ,SQLEXPRESS;uid,=,sa;pwd,=,sa;Database,=study;,Connection,conn,=,DriverManager.getConnection(DATABASE_URL,);,CallableStatement,callStmt,=,conn.,prepareCall,(,call,Query_Student,(?,?,?),”,);,callStmt.,setString,(1,20001);,/,设置传入的第一个输入参数,(?),值是,20001,callStmt.,registerOutParameter,(2,java.sql.Types.VARCHAR),callStmt.,registerOutParameter,(3,java.sql.Types.VARCHAR);,callStmt.execute,();,String b1 = callStmt.,getString,(2);,String b2 = callStmt.,getString,(3);,System.out.println(b1);,System.out.println(b2);,callStmt.close,();,conn.close,();, catch (,SQLException,sqlException,) ,.,6.,ResultSet,接口,ResultSet,接口负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、删除和修改操作;也负责维护一个记录指针(,Cursor,),,记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。,ResultSet,接口主要方法,:,boolean,absolute,(int,row),:移动记录指针到指定的记录;,void,beforeFirst,( ),:移动记录指针到第一条记录之前;,void,afterLast,( ),:移动记录指针到最后一条记录之后;,boolean,first,( ),:移动记录指针到第一条记录;,boolean,last,( ),:移动记录指针到最后一条记录;,boolean,next,( ),:移动记录指针到下一条记录;,boolean,previous,( ),:移动记录指针到上一条记录;,int,getXXXX,(int,columnIndex,),:取得指定字段的值;,ResultSetMetaData,getMetaData,( ),:取得,ResultSetMetaData,类对象。,7.,ResultSetMetaData,接口,ResultSetMetaData,接口的对象保存了所有,ResultSet,类对象中关于字段的元信息,并提供许多方法来取得这些信息。,ResultSetMetaData,接口中的方法:,int,getColumnCount,(),:取得,ResultSet,对象的字段个数;,int,getColumnDisplaySize,(),:取得,ResultSet,对象的字段长度;,int,getColumnName,(int,column),:取得,ResultSet,对象的字段名称;,int,getColumnTypeName,(),:取得,ResultSet,对象的字段类型名称;,int,getTableName,(int,column),:取得,ResultSet,对象的字段所属数据表的名称。,8.,DatabaseMetaData,接口,DatabaseMetaData,接口保存了数据库的所有特性,并且提供许多方法来取得这些信息。,DatabaseMetaData,类的主要方法:,String,getDatabaseProductName,(),:取得数据库名称;,String,getURL,(),:取得连接数据库的,JDBC,URL,;,String,getUserName,(),:取得登录数据库的使用者账号。,12.5,数据库连接之本地驱动程序,下载相应数据库的本地,JDBC,驱动程序,配置,ClassPath,配置,IDE,的运行环境,数据库连接例,(,SQLServer,),SQLServer,安装后,设置,ClassPath,,例如:,ClassPath,JDBC,驱动路径,sqljdbc4.jar,注册(装入),SQLServer,Jdbc,驱动程序,String,driverName,= ,com.microsoft.sqlserver.jdbc.SQLServerDriver,;,Class.,forName,(driverName,);,建立连接(到指定数据库),/,服务器和数据库连接字符串,String,dbUrl,= jdbc:sqlserver:/localhost/SQLEXPRESS:1433;databaseName=study;,String,uid,= root;,String,pwd,= 1234;,conn,=,DriverManager.,getConnection,(dbUrl,uid,pwd,);,与,SQLServer,建立简单连接,使用,Microsoft SQL Server JDBC Driver,与,SQL Server,数据库建立简单连接的快速入门指导。在连接到,SQL Server,数据库之前,必须首先在本地计算机或服务器上安装,SQL Server,,并且必须在本地计算机上安装,JDBC,驱动程序。,选择正确的,JAR,文件,Microsoft SQL Server JDBC Driver,提供两个类库文件:,sqljdbc.jar,和,sqljdbc4.jar,,具体使用哪个文件取决于首选的,Java,运行时环境,(JRE),设置。,设置,Classpath,JDBC Driver,并未包含在,Java SDK,中。如果要使用该驱动程序,必须将,classpath,设置为包含,sqljdbc.jar,文件或,sqljdbc4.jar,文件。如果,classpath,缺少,sqljdbc.jar,项或,sqljdbc4.jar,项,应用程序将引发“找不到类”的常见异常。,sqljdbc.jar,文件和,sqljdbc4.jar,文件的安装位置如下:,sqljdbc,_,sqljdbc.jar,sqljdbc,_sqljdbc4.jar,下面是用于,Windows,应用程序的,CLASSPATH,语句示例:,CLASSPATH =.;C:Program FilesMicrosoft SQL Server JDBC Driversqljdbc_3.0enusqljdbc.jar,与,SQLServer,建立简单连接,在,IDE,中运行的应用程序,每个,IDE,供应商都提供了在,IDE,中设置,classpath,的不同方法。仅在操作系统中设置,classpath,将无法正常工作。必须将,sqljdbc.jar,或,sqljdbc4.jar,添加到,IDE,classpath,。,数据库连接例,(,MySql,),MySql,安装后,设置,ClassPath,,例如:,ClassPath,JDBC,驱动路径,mysql-connector-java-5.1.18-bin.jar,注册(装入),MySql,Jdbc,驱动程序,String,driverName,= ,com.mysql.jdbc.Driver,;,Class.,forName,(driverName,);,建立连接(到指定数据库),/,服务器和数据库连接字符串,String,dbUrl,= ,jdbc:mysql:/localhost/study,;,String,uid,= root;,String,pwd,= 1234;,conn,=,DriverManager.,getConnection,(dbUrl,uid,pwd,);,Oracle,数据库开发应用实例,利用前面建立的,SQL Server,的数据库,Study,和,ODBC,数据源,StudyDSN,,,安排了对数据库进行插入、修改、删除和查询的,Java,程序设计。这些程序设计实例在设计时,考虑了通用性原则,应用了通用性的程序设计技术。其好处是:你可以利用本节示范的程序设计例子很容易编写访问其它数据库的,Java,应用程序。,数据库连接例,(Oracle),Oracle,安装后,设置,classpath,,例如:,CLASSPATH,c:oracleora92jdbclibojdbc14.jar,注册(装入),oracle,jdbc,驱动程序,语法:,DriverManager.registerDriver(Driver,driver),例:,DriverManager.registerDriver,(,new,oracle.jdbc.driver.OracleDriver,();,建立连接(到指定数据库),Connection con =,DriverManager.getConnection,(jdbc:oracle:thin:166.111.7.248:1521:o8i2,scott, tiger);,该方法将挑选一个合适的已注册的,JDBC,驱动程序,执行,sql,语句,Statement,类,建立,Statement,类对象(,sql,容器),Statement stmt =,conn.createStatement,(),;,查询:,ResultSet,rs,=,stmt.executeQuery(select,ename,age,from,emp,);,修改:,int,count =,stmt.executeUpdate(update,emp,set age = 30 where,ename,=MARTIN ),INSERT, UPDATE or DELETE,(返回行数),DDL,语句(返回,0,),ResultSet,类的方法,移动指针,boolean,rs.next,() ;,取结果集当前行的数据:,语法:,getXXX,(,列序号或列名,) /,方法名的重载,String,rs.getString(ename,) ;,int,rs.getInt,(age) ;,或,int,rs.getInt,(2) ;,访问数据库例,import,java.sql,.* ;,class Test,public static void main (String,args,) throws,SQLException,DriverManager.registerDriver(new,oracle.jdbc.OracleDriver,();,Connection con =,DriverManager.getConnection,(,jdbc:oracle:thin:166.111.7.248:1521:o8i2,帐号, , ,密码,);,Statement stmt=,con.createStatement,(); /,创建,Statement,对象,System.out.println,(-,查询并显示所有系的学生,-);,ResultSet,rs,=,stmt.executeQuery(SELECT,* FROM student,order by birthday);,while(rs.next,() /,显示查询结果,System.out.print(rs.getString(sno,) + );,System.out.print(rs.getString(sname,) + );,System.out.print(rs.getString(sex,) + );,12-10,访问数据库例,System.out.print(rs.getDate(birthday,) + );,System.out.println(rs.getString(dno,) + );,;,System.out.println,(-,统计并显示各系学生数,-);,rs,=,stmt.executeQuery(SELECT,dno,count,(*) as num,FROM student group by,dno,);,while(rs.next,() /,显示查询结果,System.out.print(rs.getString(dno,) + );,System.out.println(rs.getInt(num,) + );,;,System.out.println,(-,插入一个学生记录:,-);,String s = INSERT INTO student VALUES(s00000, ,林时, ,男, ,21-4,月,-1990 , d01) ;,stmt.executeUpdate(s,); /,添加一条记录,访问数据库例,System.out.println,(-,查询,d01,系的学生:,-);,rs,=,stmt.executeQuery(SELECT,* FROM student,WHERE,dno,=d01 ); /,查询,while(rs.next,() /,显示,System.out.print(rs.getString(sno,) + );,System.out.println(rs.getString(sname,) + );,;,System.out.println,(-,删除一个学生记录,-);,stmt.executeUpda
展开阅读全文