您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > JDBC关键技术以及面试问题
JDBC终端进入mysql:mysql-uroot回车终端进入oracle:telnet192.168.0.23然后sqlplusopenlab/open123MySQL常用命令:showdatabases;usedatabaseName;showtables;一、概述JDBCJDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBCAPI使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。ODBC:基于C语言的数据库访问接口。JDBC:是Java版的ODBC。JDBC特性:高度的一致性、简单性(常用的接口只有4、5个)。驱动程序按照工作方式分为四类:1、JDBC-ODBCbridge+ODBC驱动JDBC-ODBCbridge桥驱动将JDBC调用翻译成ODBC调用,再由ODBC驱动翻译成访问数据库命令。优点:可以利用现存的ODBC数据源来访问数据库。缺点:从效率和安全性的角度来说的比较差。不适合用于实际项目。2、基于本地API的部分Java驱动我们应用程序通过本地协议跟数据库打交道。然后将数据库执行的结果通过驱动程序中的Java部分返回给客户端程序。优点:效率较高。缺点:安全性较差。3、纯Java的网络驱动(中间协议)(本地协议)appJDBC纯Java中间服务器DB缺点:两段通信,效率比较差优点:安全信较好4、纯Java本地协议:通过本地协议用纯Java直接访问数据库。特点:效率高,安全性好。二、JDBC编程的步骤importjava.sql.*;导包0.参数化StringdriverName=com.mysql.jdbc.Driver;注册驱动Stringurl=jdbc:mysql://localhost:3306/test;//协议;库或服务器名称;服务器IP,端口Stringusername=root;Stringpassword=root;/*Oracle的连接StringdriverName=oracle.jdbc.driver.OracleDriver;Stringurl=jdbc:oracle:thin:@192.168.0.23:1521:ora10g;Stringusername=openlab;Stringpassword=open123;*///以下这些都需要写在有异常的代码块里,所以需要提取出来。Connectionconn=null;Statementstmt=null;ResultSetrs=null;//建议用PreparedStatement1.加载和注册数据库驱动Class.forName(driverName);//自动注册;需要把驱动的jar包导进来;需处理异常/*方法二:实例化具体的Driver驱动,这写法一般不用(不能参数化驱动名,不够灵活)Driverdriver=newcom.mysql.jdbc.Driver();DriverManager.registerDriver(driver);//将驱动交于DriverManager托管*//*方法三:Dos运行时,java-Djdbc.drives=oracle.jdbc.driver.OracleDriver;--可多个*/2.连接数据库conn=DriverManager.getConnection(url,username,password);//需处理异常//Connection返回数据库连接,如:“com.mysql.jdbc.Connection@1ffb8dc”;连接不成功则返回null3.创建Statement对象//为了类型安全和批量更新的效率,改用PreparedStatementstmt=conn.createStatement();//需处理异常//返回其生成结果的对象oracle.jdbc.driver.OracleStatement@198dfaf4.操作数据库,执行SQL语句Stringsql=select*fromtableName;//SQL语句里不需要写分号rs=stmt.executeQuery(sql);//executeQuery(sqlString)查询返回查询结果集/*Stringsql=insertintotableNamevalues(?,?);//?占位符intnumber=stmt.executeUpdate(sql);//更新,再返回int(更新、修改影响的条数)*/5.处理数据(游标)//创建索引StringBuffersb=newStringBuffer();//缓存;用它可提高读取速度。当然,不用也可以。ResultSetMetaDatamd=rs.getMetaData();//ResultSetMetaData可获取列的类型和属性信息intcol=md.getColumnCount();//获取列的数目while(rs.next()){//rs.next()使游标下移一位,返回boolean,没有下一个结果则返回falsefor(inti=1;i=col;i++){//index(JDBC的下标从1开始)sb.append(md.getColumnName(i)+=+rs.getString(i)+);}sb.append(\n);}System.out.println(sb);//1.游标的初始位置在第一条记录的前面,使第一次调用next()后,刚好拿到第一个结果。//2.游标的最终位置在最后一条记录的后面(结果集的前面和后面留空,真正存在)6.释放资源,断开与数据库的连接//先判断是否有引用资源,再释放(释放空资源会抛异常);注意顺序if(rs!=null)try{rs.close();}catch(Exceptione){e.printStackTrace();}if(stmt!=null)try{stmt.close();}catch(Exceptione){e.printStackTrace();}if(conn!=null)try{conn.close();}catch(Exceptione){e.printStackTrace();}//这些异常没法处理,处理只为方便调试。所以这些异常处理也只是打印。/*要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为ResultSet需要Statement和Connection连接时才可以用的;Statement也需要Connection才可用;结束Statement之后有可能其它的Statement还需要连接,因此不能先关闭Connection。ResultSet同理。*/步骤1、2、6每次都一样,可以重构。因为加载驱动是个一次性工作,所以可以采用静态初始化块来加载驱动;连接数据库的方法应该自己负责,获取数据库连接信息和驱动的信息,并处理相关异常;释放数据库资源的方法要考虑到ResultSet、Statement、Connection的不同情况,并处理相关异常。三、JDBC几个重要接口重点讲解在JDBC中包括了两个包:java.sql和javax.sql。①java.sql基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。②javax.sql扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。API说明Connection与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。Driver每个驱动程序类必需实现的接口,每个数据库驱动程序也都应该提供一个实现Driver接口的类。DriverManager(Class)管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。Statement用于执行静态SQL语句并返回其生成结果的对象。PreparedStatement继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。CallableStatement用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。ResultSet指的是查询返回的数据库结果集。ResultSetMetaData可用于获取关于ResultSet对象中列的类型和属性信息的对象。注:除了标出的Class,其它均为接口。每个都是“java.sql.”包下的。1.Statement——SQL语句执行接口代表了一个数据库的状态,在向数据库发送相应的SQL语句时,都需要创建Statement接口或PreparedStatement接口。在具体应用中,Statement主要用于操作不带参数(可以直接运行)的SQL语句,比如删除语句、添加或更新。2.PreparedStatement:预编译的Statement第一步:通过连接获得PreparedStatement对象,用带占位符(?)的sql语句构造。PreparedStatementpstm=con.preparedStatement(“select*fromtestwhereid=?”);第二步:设置参数pstm.setString(1,“ganbin”);//第一个字段是“ganbin”;需一个个字段写第三步:执行sql语句Rs=pstm.excuteQuery();statement发送完整的Sql语句到数据库不是直接执行而是由数据库先编译,再运行。每次都需要编译。而PreparedStatement是先发送带参数的Sql语句,由数据库先编译,再发送一组组参数值。(同构时不需重复编译)如果是同构的sql语句,PreparedStatement的效率要比statement高。而对于异构的sql则两者效率差不多。一般都用PreparedStatement代替Statement,因为它是类型安全的。Statement对参数类型不作检查,故不够安全。同构:两个Sql语句可编译部分是相同的,只有参数值不同。异构:整个sql语句的格式是不同的注意点:1、使用预编译的Statement编译多条Sql语句一次执行2、可以跨数据库使用,编写通用程序3、能用预编译时尽量用预编译4、如果第二个SQL语句与前一个是异构的,需要再次编译“ps=con.prepareStatement(sql);“3.ResultSet——结果集操作接口ResultSet接口是查询结果集接口,它对返回的结果集进行处理。ResultSet是程序员进行JDBC操作的必需接口。4.ResultSetMetaData——元数据操作接口ResultSetMetaData是对元数据进行操作的接口,可以实现很多高级功能。Hibernate运行数据库的操作,大部分都是通过此接口。可以认为,此接口是SQL查询语言的一种反射机制。ResultSetMetaData接口可以通过数组的形式,遍历数据库的各个字段的属性,对于开发者来说,此机制的意义重大。JDBC通过元数据(MetaData)来获得具体的表的相关信息,例如,可以查询数据库中有哪些表,表有哪些字段,以及字段的属性等。MetaData中通过一系列getXXX将这些信息返回给我们。数据库元数据DatabaseMetaData用connection.getMetaData()获得;包含了关于数据库整体元数据信息。结果集元数据ResultSetMetaData用resultSet.getMetaData()获
本文标题:JDBC关键技术以及面试问题
链接地址:https://www.777doc.com/doc-2881808 .html