话题一:JDBC简介及基本使用一:jdbc简介:1:定义:JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并且为java开发人员提供调用接口方法。是java访问数据库的唯一的,统一的,底层的API2:产生的背景和原因:(1)由java从小设备应用发展到通用语言,跟企业打交道一定要和数据库打交道,这就是java为联结数据库发明API的原因(2):java的平台无关性,就需要自己重新开发一套平台无关的联结数据库语言,(3):java希望所用的代码都在虚拟机中运行,以保证安全性。3:数据库驱动的概念:驱动本质上是一个某个数据库厂商实现的jdbc接口的类库,注意:数据库驱动不是一定要实现这个类库中的所有接口,但是必须实现java.sql.Driver接口。二:jdbc中常使用的接口1:Driver:驱动2:DriverManager:辅助管理驱动3:Connection:数据库联接4:Statement:对数据库的操作对象(通过SQL语句操作)5:ResultSet:结果集三.JDBC应用步骤1,注册加载一个driver驱动Class.forName(oracle.jdbc.driver.OracleDriver);2,创建数据库连接(Connection)Stringurl=jdbc:oracle:thin:@192.168.0.23:1521:tarena;Stringuser=openlab;Stringpassword=open123;con=DriverManager.getConnection(url,user,password);3,创建一个Statement(发送sql)Stringsql=selectfirst_name,idfroms_emp;state=con.createStatement();4,执行sql语句ResultSetrs=state.executeQuery(sql)5,处理sql结果(select语句,关闭rs)while(rs.next()){System.out.print(rs.getInt(id));System.out.println(+rs.getString(first_name));}6,关闭Statementstate.close()7,关闭连接Connectioncon.close()注意:(1)关闭对象的步骤势必须要做的,因为这些资源是不会自动释放的,必须要自己关闭(2)要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接时才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭Connection。四:细节知识点1:常用驱动类(1)Oracle的Driveroracle.jdbc.driver.OracleDriver(2)mysql的Drivercom.mysql.jdbc.Driver(3)SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver2:2:常用的url书写格式(1)OracleURL的格式例:jdbc:oracle:thin:@192.168.0.20:1521:tarenadb(2)MySqlURL的写法例:jdbc:mysql://localhost:3306/tarena(3)SQLServerURL的写法例:jdbc:microsoft:sqlserver://localhost:1433/test3:statement的方法作用和区别excute():任何语句都可以executeUpdate():增,删,改,创建executeQuery():查询4:固定驱动(了解)如果想要用固定的driver而不是要让驱动管理器一个一个的找,那么需要明确的driver,可以通过new的方式,显式的创建driver例如:Driverdrv=neworacle.jdbc.driver.OracleDriver();DriverManager.registerDriver(drv);5:激发驱动类加载的方式(1)直接在获得连接的代码中调用Class.forName(“”);(2)直接在静态代码块中调用Class.forName(“”);(3)通过命令行参数传入,(本质上传入的是字符串)Class.forName(args[0]);(4)通过虚拟机参数传入终端命令行传入,例如Java-Djdbc.drivers=oracle.jdbc.driver.OracleDriverFristJdbc.java在eclipse中加入虚拟机参数的方式。6:PreparedStatement的使用(从Statement继承而来)同构SQL:SQL语句基本一样,只是具体参数值不同.异构SQL:SQL语句完全不一样.Statement不足:1.效率比较低;2.对字段类型的支持比较差;3.语法含义不清晰.(结构不清楚)由于编译时不需要参数,PreparedStatement可以使用?来替代sql语句中的某些参数,它先将不带参数的sql语句发送到数据库,进行预编译,然后PreparedStatement会再将设置好的参数发送给数据库。在使用PreparedStatement设置相应参数时,要指明参数的位置和类型,以及给出参数的具体值。(注意:参数的位置从1开始)根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数如:Stringsql=updateXXXsetx=?whereXXX;;//?PreparedStatementps=con.prepraredStatement(SQL);//SQL语句已经送到数据库去编译了,即预编译ps.setXXX(参数的位置,参数值)ps.executeUpdate();五:元数据1:概念和作用:用来描述对象信息的对象2:分类(1):resultSetMetaData:用来描述结果集的信息ResultSetMetaDatamd=ResultSet.getMetaData();(2):DatabaseMetaData:用来描述数据库的信息DatabaseMetaDatemd=Connection.getMetaData();结果集元数据中常用的方法:1.获得字段个数2.获得字段名称3.获得字段类型如:ResultSetrs=ps.executeQuery(sql);ResultSetMetaDatam=rs.getMetaData();getColumnCount(),获得实际列数getColumnName(intcolnum),获得指定列的列名getColumnType(intcolnum),获得指定列的数据类型(Types里面的类型,存放的是整数)getColumnTypeName(intcolnum),获得指定列的数据类型名话题二:事务一:事务(Transaction)原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作.事务是针对原子操作的,要求原子操作不可再分,并且必须同时成功同时失败。事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作.二:jdbc中使用事务的基本步骤在JDBC中默认是自动提交的【但是Hibernate默认不是自动提交的】,如果要想使用事务,需要按以下步骤执行:1.要调用con.setAutoCommite(false)方法,把自动提交(commit)置为false。2.进行正常的数据库操作3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback();注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用setAutoCommite(true).三:事务并发产生的问题三种并发产生的后果:1,脏读:一个事务读取到了另外一个事务没有提交的数据。2,重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一时间点上读取到的数据相同,希望在一段时间内的数据是不变的。3,幻读:一个事务读取到了另外一个事务提交的数据。用同样的操作读取两次,得到的记录数不相同。四:事务五种控制级别:TRANSACTION_NONE不使用事务。TRANSACTION_READ_UNCOMMITTED允许脏读。TRANSACTION_READ_COMMITTED防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读,TRANSACTION_SERIALIZABLE可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率五:定义事务的隔离级别以上的五个事务隔离级别都是在Connection类中定义的静态常量,使用setTransactionIsolation(intlevel)方法可以设置事务隔离级别。如:con.setTransactionIsolation(Connection.REPEATABLE_READ);话题三:Jdbc2.0新特性一.结果集的可滚动特性和可更新特性JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单.JDBC2.0中游标可以双向,相对或者绝对移动.可滚动结果集:这种结果集不但可以双向滚动,相对定位,绝对定位,并且还可以修改数据信息。基本语法:Statementst=null;st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量1:滚动特性(1).滚动特性常量:●:TYPE_FORWARD_ONLY该常量表示指针只能向前移动ResultSet对象的类型。(默认)●:TYPE_SCROLL_INSENSITIVE该常量指示可滚动但通常不受其他更改影响的ResultSet对象的类型。●:TYPE_SCROLL_SENSITIVE该常量指示可滚动并且通常受其他更改影响的ResultSet对象的类型。(也即数据库改变,结果集改变)(2)常用方法定位方法:booleanabsolute(introw)定位到指定的记录位置。成功返回true,否则返回false。voidafterLast(),把游标移动到最后一条记录的后面(逻辑位置)。voidbeforeFirst(),把游标移动到第一条记录的前面(逻辑位置)。//由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void.booleanfirst(),把游标定位到第一条记录。booleanlast(),把游标定位到最后一条记录。//当结果集为空的时候,这两个方法会返回false.booleannext(),此方法是使游标向下一条记录移动。booleanprevious(),此方法可以使游标向上一条记录移动,前提是前面还有记录。booleanrelative(introws),相对定位方法,参数值可正可负,参数为正,游标从当前位置向后移动指定值条记录,参数为负,游标从当前位置向前移动指定值条记录。判断方法:ifBeforeFirst()判断是否在在第一条记录之前.ifAfterLast()判断是否在在最后一条记录之后.ifFirst()判断是否为第一条记录.ifLast()判断是否为最后一条记录.2:可更新特性(1).更新特性常量:●:CONCUR_READ_ONLY只读结果集(默认)●:CONCUR_UPDATABLE可更新结果集(2)更新特性的常用方法a.moveToInsertRow();记录当前游标位置,将游