理工课件-java基础3-数据库10jdbc_第1页
理工课件-java基础3-数据库10jdbc_第2页
理工课件-java基础3-数据库10jdbc_第3页
理工课件-java基础3-数据库10jdbc_第4页
理工课件-java基础3-数据库10jdbc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA核心技术JDBC本章相关词汇单词说明driver驱动,驱动程序connection连接statement语句prepared预备的,预编译的result结果create创建,创造execute执行query查询JDBC了解JDBC的概念和必要性了解JDBC驱动程序类型了解java.sql包使用JDBC进行数据库编程PreparedStatement接口纯Java驱动方式连接不同数据库JDBC了解JDBC的概念和必要性了解JDBC驱动程序类型了解java.sql包使用JDBC进行数据库编程PreparedStatement接口纯Java驱动方式连接不同数据库数据库访问技术简介当今企业级应用程序大部分采用了客户机/服务器(C/S)模式;客户端机器需要与服务器进行通讯,要操作数据库中的数据,执行SQL(StructuredQueryLanguage结构化查询语言)语句以及检索查询结果;在Java中实现这些活动的技术称作JDBC。数据库编程示意图

客户机/服务器应用程序

数据库编程JDBC数据库执行SQL语句检索查询结果

关于DBMSDBMS(DataBaseManagementSystem)是指数据库管理系统;目前DBMS的生产商众多,产品也不尽相同,如:Oracle公司的Oracle系列;Microsoft公司的Access系列和SQLServer系列;Microsoft公司早期的FoxPro;IBM公司的DB2;Sybase公司的Sybase;还有自由开源的MySQL等等。这就意味着编程语言要针对不同的DBMS开发不同版本的应用程序,这将是一项非常枯燥的工作。ODBCODBC(OpenDataBaseConnectivity)指开放式数据库连接,是由Microsoft公司提供的应用程序接口;它负责连接各种不同产商和类型的DBMS,然后为各种不同的编程语言提供查询、插入、修改和删除数据的功能;如同在各种不同的DBMS和各种不同的编程语言之间架设了一座通用的桥梁。JDBCJDBC(JavaDataBaseConnectivity)是由SunMicrosystem公司提供的API(ApplicationProgrammingInterface应用程序编程接口);它为Java应用程序提供了一系列的类,使其能够快速高效地访问数据库;这些功能是由一系列的类和对象来完成的,我们只需使用相关的对象,即可完成对数据库的操作。JDBC工作方式示意图

Java程序

JDBC驱动程序数据库SQL命令

结果

JDBC驱动程序类型使用JDBC连接数据库可以通过不同的驱动方式来实现,有4种驱动类型:JDBC-ODBC桥驱动纯Java驱动本地API部分Java驱动JDBC网络纯Java驱动不论采用哪种驱动方式,在程序中对数据库的操作方式基本相同,只是加载不同的驱动程序即可。java.sql包java.sql包也是Java内置的包,其中包含了一系列用于与数据库进行通信的类和接口;如果要使用到这些类和接口的话,则必须显式地声明如下语句:

importjava.sql.*;java.sql包中的一些接口接口名称说明Connection连接对象,用于与数据库取得连接Driver用于创建连接(Connection)对象Statement语句对象,用于执行SQL语句,并将数据检索到结果集(ResultSet)对象中PreparedStatement预编译语句对象,用于执行预编译的SQL语句,执行效率比Statement高ResultSet结果集对象,包含执行SQL语句后返回的数据的集合java.sql包中的一些类类名称说明SQLException数据库异常类,是其它JDBC异常类的根类,继承于java.lang.Exception,绝大部分对数据库进行操作的方法都有可能抛出该异常DriverManager驱动程序管理类,用于加载和卸载各种驱动程序,并建立与数据库的连接Date该类中包含有将SQL日期格式转换成Java日期格式的方法TimeStamp表示一个时间戳,能精确到纳秒Java.util.Date是java.sql.Date和java.sql.Timestamp的父类java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分java.sql.Timestamp弥补了java.sql.Date的缺陷,保存日期时间精确纳秒java.util.Date除了SQL语句的情况下面使用java.sql.Date和java.sql.Timestamp及java.util.Date的区别和使用三者都可以通过getTime()进行互相转换//获取系统当前时间

java.util.Dateud=newjava.util.Date();

//将java.util.Date转化成java.sql.Datejava.sql.Datesd=newjava.sql.Date(ud.getTime());//将java.util.Date转化成java.sql.Timestampjava.sql.Timestamptime=newjava.sql.Timestamp(ud.getTime());//将java.sql.Date转化成java.util.Dateud=newjava.util.Date(sd.getTime());//将java.sql.Timestamp转化成java.util.Dateud=newjava.util.Date(time.getTime());java.sql.Date和java.sql.Timestamp及java.util.Date的相互转换JDBC程序访问数据库步骤开始导入java.sql包加载并注册驱动程序创建Connection对象创建Statement对象执行SQL语句关闭ResultSet对象关闭Statement对象关闭Connection对象使用ResultSet对象建立数据源(ODBC)附加相应产商提供的驱动结束JDBC-ODBC桥方式纯Java驱动方式步骤详解1:建立数据源这里以链接oracle数据库为例1.找到oracle安装路径的JAR包—ojdbc14.jar复制到项目中与src同级文件夹lib中,并导入到项目,地址如下:E:\oracle\product\10.2.0\db_1\jdbc\lib步骤详解2:加载驱动程序1.使用Class类的forName方法,将驱动程序类加载到JVM(Java虚拟机)中,代码如下:对于链接oracle数据库的驱动方式,应该加载:Class.forName("oracle.jdbc.driver.OracleDriver");方法原型说明staticClassforName(StringclassName)throwsClassNotFoundException将由className指定完整名称的类加载到JVM中,如果加载失败,将抛出异常,必须捕捉步骤详解3:获得连接对象方法原型说明staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLException参数url是连接字符串,参数user是数据库用户名,参数password是登录口令,成功连接到数据库返回Connection对象,连接失败则抛出SQLException异常,必须捕捉成功加载驱动后,必须使用DriverManager的静态方法getConnection来获取链接对象。对于链接Oracle数据库方式如下:Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");步骤详解释4:创建语句对象一旦成功连接到数据库,获得Connection对象后,必须通过Connection对象createStatement方法来创建语句对象,才可以执行SQL语句;Statementsta=con.createStatement();方法原型说明StatementcreateStatement()throwsSQLException成功创建返回Statement对象,否则抛出SQLException异常,必须捕捉步骤详解5:执行SQL语句使用语句对象来执行SQL语句,有两种情况:一种是执行DELETE、UPDATE和INSERT之类的数据库操作语句(DML),这样的语句没有数据结果返回,使用Statement对象的executeUpdate方法执行;如:intrs=st.executeUpdate("insertintoperson(pid,pname)values(4,'mxt')");方法原型说明intexecuteUpdate(Stringsql)throwsSQLException参数sql是要执行的SQL语句,执行成功返回受影响的行数,执行失败则抛出SQLException异常,必须捕捉步骤详解5:执行SQL语句(续)另一种是执行SELECT这样的数据查询语句(DQL),这样的语句将从数据库中获得所需的数据,使用Statement对象的executeQuery方法执行;如:ResultSetrs=null;

rs=st.executeQuery("select*frompersonwherepid="+pid);while(rs.next()){System.out.println("编号:"+rs.getInt("pid")+"姓名:"+rs.getString("pname"));}方法原型说明ResultSetexecuteQuery(Stringsql)throwsSQLException参数sql是要执行的SQL语句,查询成功返回包含有结果数据的ResultSet对象,否则抛出SQLException异常,必须捕捉步骤详解6:关闭资源当对数据库的操作结束后,应当将所有已经被打开的资源关闭,否则将会造成资源泄漏;Connection对象、Statement对象和ResultSet对象都有执行关闭的close方法;函数原型都是:voidclose()throwsSQLException如:

rs.close();//关闭ResultSet对象

sta.close();//关闭Statement对象

con.close();//关闭Connection对象有可能抛出SQLException异常,必须捕捉;请注意关闭的顺序,最后打开的资源最先关闭,最先打开的资源最后关闭。数据库操作示例DMLConnectioncon=null;Statementst=null;intrs=0;try{Class.forName("oracle.jdbc.driver.OracleDriver");con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");st=con.createStatement();rs=st.executeUpdate("insertintoperson(pid,pname,pgender,page,pmsg)values(4,'mxt','女',25,'今天天气很不错')");if(rs>0){System.out.println("添加成功");}else{System.out.println("添加失败");}}catch(Exceptione){System.out.println(e.toString());}finally{

try{if(st!=null){st.close();}if(con!=null){con.close();}}catch(Exceptione2){System.out.println(e2.toString());}}}数据库操作示例DQLSystem.out.println("请输入要查询的学生编号:");Scannerscanner=newScanner(System.in);Stringpid=scanner.nextLine();Connectioncon=null;Statementst=null;ResultSetrs=null;try{//注册驱动类Class.forName("oracle.jdbc.driver.OracleDriver");con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");st=con.createStatement();rs=st.executeQuery("select*frompersonwherepid="+pid);while(rs.next()){System.out.println("编号:"+rs.getInt("pid")+"姓名:"+rs.getString("pname"));}}catch(Exceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(st!=null){st.close();}if(con!=null){con.close();}}catch(Exceptione2){}}}操作结果集使用Statement对象的executeQuery方法成功执行SELECT语句后,将返回一个包含有结果数据的ResultSet对象,要从该对象中获取数据,将使用到如下方法:方法原型说明booleannext()throwsSQLException将结果集游标往下移动一行,如果已经到达结果集最后,将会返回false,有可能抛异常,必须捕捉XgetX(StringcolumnName)throwsSQLException获得某个字段的值,X是指具体的数据类型,视数据库表中字段的具体情况而定,该方法有一组,并且每个都有两种重载方法,一种是以字段名称为参数,另一种是以字段索引为参数(字段索引从1开始),有可能抛异常,必须捕捉XgetX(intcolumnIndex)throwsSQLException操作结果集示例try{StringstrCon="jdbc:odbc:dsn_javaBase";System.out.println("正在连接数据库...");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connectioncon;con=DriverManager.getConnection(strCon,"sa",“sa");System.out.println("成功连接到数据库。");Statementsta=con.createStatement();ResultSetrs=sta.executeQuery("SELECT*FROMFriends");System.out.println("查询到数据如下:");

while(rs.next()){//循环将结果集游标往下移动,到达末尾返回false

//根据字段名称获得各个字段的值

System.out.print(rs.getString("Name")+"\t");//获得字符串

System.out.print(rs.getString("Address")+"\t");//获得字符串

System.out.print(rs.getInt("Telephone")+"\t");//获得整数

System.out.print(rs.getDate("HireDate")+"\t");//获得日期型数据

System.out.println(rs.getFloat("Salary"));//获得浮点型数据

}rs.close();sta.close();con.close();}catch(ClassNotFoundExceptioncnfe){cnfe.printStackTrace();}

catch(SQLExceptionsqle){sqle.printStackTrace();}1PreparedStatemend和Statement区别Statement(语句对象)PreparedStatemend(预编译语句对象)1.PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程2.在对数据库只执行一次性存取的时侯PreparedStatement对象的开销比Statement大3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译的,

preparedstatement支持批处理4.PreparedStatement对象不仅包含了SQL语句,而且该语句如果已经被编译过,那么当该语句仅仅只是修改变量后再次执行的时候,只需DBMS运行SQL语句,而不必编译。所以PreparedStatement对象将会大大减少运行时间,当然也加快了访问数据库的速度。5.然而,在Oracle环境中,开发人员实际上有更大的灵活性。当使用Statement或PreparedStatement对象时,Oracle数据库会缓存SQL语句以便以后使用。在一些情况下,由于驱动器自身需要额外的处理、在Java应用程序和Oracle服务器间增加的网络活动,执行PreparedStatement对象实际上会花更长的时间。6.然而,除了缓冲的问题之外,至少还有一个更好的原因使我们在企业应用程序中更喜欢使用PreparedStatement对象,那就是安全性。传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。PreparedStatement接口1如果要多次执行相似的SQL语句,可以使用PreparedStatemend(预编译语句对象)对象来执行;通过Connection对象的prepareStatement方法来创建预编译语句对象;PreparedStatement对象会将SQL语句预先编译,这样将会获得比Statement对象更高的执行效率。方法原型说明PreparedStatementprepareStatement(Stringsql)throwsSQLException参数sql是要执行的SQL语句,根据指定的SQL语句创建PrepareStatement对象,有可能抛异常,必须捕捉PreparedStatement接口2包含在PreparedStatement对象中的SQL语句可以带有一个或多个参数,使用“?”作为占位符,如:PreparedStatement

ps=con.prepareStatement("insertintoperson(pid,pname)values(?,?)");在执行SQL语句之前,必须使用PreparedStatement对象中的setX方法设置每个“?”位置的参数值;如: ps.setString(1,5); ps.setString(2,"陈老师");方法原型说明voidsetX(intparameterIndex,Xx)throwsSQLException将parameterIndex指定的“?”位置指定为x的值,这里X可以指代任意数据类型,“?”的索引从1开始。PreparedStatement接口3设置好每个参数的值之后,就可以使用PreparedStatement对象的executeUpdate和executeQuery方法来执行SQL语句,这一点和Statement对象很相似:方法原型说明intexecuteUpdate()throwsSQLException用于执行INSERT、DELETE和UPDATE语句,执行成功返回受影响的行数,否则抛出SQLException异常,必须捕捉ResultSetexecutQuery()throwsSQLException用于执行SELECT语句,执行成功返回包含有结果数据的ResultSet对象,否则抛出SQLException异常,必须捕捉intresult=ps.executeUpdate();//增,删,改ResultSetrs=ps.executeQuery();//查询PreparedStatement对象示例(DML)try{Class.forName("oracle.jdbc.driver.OracleDriver");}catch(ClassNotFoundExceptione){e.printStackTrace();}Connectioncon=null;ResultSetrs=null;PreparedStatementps=null;try{con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");ps=con.prepareStatement("insertintoperson(pid,pname,pgender,page,pmsg)values(?,?,?,?,?)");ps.setString(1,"5");ps.setString(2,"陈老师");ps.setString(3,"女");ps.setInt(4,27);ps.setString(5,"xxxxxxx");intresult=ps.executeUpdate();if(result>0){System.out.println("添加成功");}else{System.out.println("添加失败");}}catch(SQLExceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(ps!=null){ps.close();}if(con!=null){con.close();}}catch(SQLExceptione){e.printStackTrace();}}}PreparedStatement对象示例(DQL)try{Class.forName("oracle.jdbc.driver.OracleDriver");}catch(ClassNotFoundExceptione){e.printStackTrace();}System.out.println("请输入要查询的老师编号");Scannerscan=newScanner(System.in);Stringtid=scan.nextLine();Connectioncon=null;PreparedStatementps=null;ResultSetrs=null;try{con=DriverManager.getConnection("jdbc:oracle:thin:@:1521:orcl","oa","oa");ps=con.prepareStatement("select*frompersonwherepid=?");ps.setString(1,tid);rs=ps.executeQuery();while(rs.next()){System.out.println("编号:"+rs.getInt("tid")+"姓名:"+rs.getString("tname"));}}catch(SQLExceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(ps!=null){ps.close();}if(con!=null){con.close();}}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}纯Java驱动方式连接数据库使用JDBC-ODBC桥方式连接数据库,其性能完全取决于数据源(ODBC)的性能,并且无法脱离Microsoft的平台,这样将带来不便;大部分DBMS产商都为自己的产品开发了纯Java的驱动程序,我们只需要加载相应的驱动,就可以直接连接到数据库,而无需通过ODBC桥连接;下载驱动程序包要使用纯Java驱动,首先必须获得相应数据库的驱动程序包;根据数据库的类型,登录对应产商的官方网站,一般都可以免费获得;下载后,复制到本地磁盘,并将完整路径设置到classpath环境变量中,如用开发工具开发程序,还需在开发环境中设置路径。纯Java驱动连接SQLServer2000使用纯Java驱动连接到SQLServer2000数据库,加载驱动程序应改成如下语句:

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");连接字符串应如下格式:"jdbc:microsoft:sqlserver://服务器名或IP:1433;databaseName=数据库名"如:

Connectioncon=DriverManager.getConnection("jdbc:microsoft:sqlserver://:1433;databaseName=pubs","sa","");纯Java驱动连接SQLServer2005使用纯Java驱动连接到SQLServer2005数据库,加载驱动程序应改成如下语句:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");连接字符串应如下格式:

"jdbc:sqlserver://服务器名或IP:1433;databaseName=数据库名"如:

Connectioncon=DriverManager.getConnection("jdbc:sqlserver://:1433;databaseName=pubs","sa","sa");纯Java驱动连接MySQL使用纯Java驱动连接到MySQL5.0数据库,加载驱动程序应改成如下语句:

Class.forName("com.mysql.jdbc.Driver");连接字符串应如下格式:

"jdbc:mysql://服务器名或IP:3306/数据库名"如:

Connectioncon=DriverManager.getConnection("jdbc:mysql://:3306/test","root","root");

纯Java驱动连接Oracle使用纯Java驱动连接到Oracle9i数据库,加载驱动程序应改成如下语句:

Class.forName("oracle.jdbc.driver.OracleDriver");连接字符串应如下格式:

"jdbc:oracle:thin:@服务名或IP:1521:数据库名"如:

Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@:1521:test","scott","tiger");改进数据库连接(属性)//驱动类public

static

finalStringDRIVER="oracle.jdbc.driver.OracleDriver";//字段,数据库连接字符串public

static

finalStringURL="jdbc:oracle:thin:@:1521:orcl";//用户名public

static

finalStringUID="oa";//密码public

static

finalStringPWD="oa";//数据库连接对象Connectioncon=null;//数据库预编译处理对象PreparedStatementps=null;//结果集对象ResultSetrs=null;改进数据库连接(连接对象)/***返回数据库连接对象**@return*/publicConnectiongetCon(){try{Class.forName(DRIVER);}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论