《jdbc相关技术》word版.docx_第1页
《jdbc相关技术》word版.docx_第2页
《jdbc相关技术》word版.docx_第3页
《jdbc相关技术》word版.docx_第4页
《jdbc相关技术》word版.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

mysql的JDBC连接字符串1MySQL Timestamp 型態 的 屬性(新增/修改 自動更新 Timestamp型態 的 欄位)2mysql JDBC Driver3为什么 PreparedStatement 很重要, 以及怎样正确使用他们.5JDBC性能优化12Transaction测试14JDBC2/3.0 特征 介绍16常用JDBC连接数据库方法总结19mysql的JDBC连接字符串jdbc:mysql:/localhost:3306/mydb?useUnicode=true&characterset=gb2312, 其中“useUnicode=true&characterset=gb2312“是什么意思?Class.forName(org.gjt.mm.mysql.Driver).newInstance(); String url =jdbc:mysql:/localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1 /myDB为数据库名 Connection conn= DriverManager.getConnection(url); 用缺省配置创建时,ResultSet 是一种只能访问一次(one-time-through)、只能向前访问(forward-only)和只读的对象。您只能访问数据一次,假如再次需要该数据,必须重新查询数据库。然而,并不只有这一种方式。通过配置 Statement 对象上的参数,您能够控制他产生的 ResultSet。例如:.Class.forName(driverName);db = DriverManager.getConnection(connectURL);Statement statement = db.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);这个 Statement 现在将产生能够更新并将应用其他数据库用户所作更改的 ResultSet。您还能够在这个 ResultSet 中向前和向后移动。第一个参数指定 ResultSet 的类型。其选项有:TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。 TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至能够进行特定定位,例如移至列表中的第四个记录或从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。 TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 相同,允许在记录中定位。这种类型受到其他用户所作更改的影响。假如用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。 第二个参数配置 ResultSet 的并发性,该参数确定是否能够更新 ResultSet。其选项有:CONCUR_READ_ONLY:这是缺省值,指定不能够更新 ResultSet CONCUR_UPDATABLE:指定能够更新 ResultSet MySQL Timestamp 型態 的 屬性(新增/修改 自動更新 Timestamp型態 的 欄位)MySQL 的 timestamp 型態 的屬性比較特別, 預設 timestamp 的屬性是, 只要有值 新增/修改(同一個row), MySQL 會自動幫你將 timestamp 型態的欄位 寫入現在時間.有兩種屬性可供調整使用: 自動初始化: 此欄位 寫入 資料時, 自動將 timestamp 的欄位寫入現在時間(建立時, 自動寫入時間).(DEFAULT CURRENT_TIMESTAMP) 自動更新: 此欄位 修改 資料時, 自動將 timestamp 的欄位寫入現在時間(更新時, 自動寫入時間). (ON UPDATE CURRENT_TIMESTAMP)主要有下述 四種 設法/時機: (範例轉載自官方網站: MySQL 5.1 Reference Manual - TIMESTAMP Properties) 自動初始化 及 自動更新ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 只做自動初始化 (建立時初始化, 更新時不修改時間)ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP 只做自動更新 (建立時不做初始化動作)ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 全都不做(使用這個的話, 或許直接用 DATETIME 的型態 似乎比較方便?)ts TIMESTAMP DEFAULT 0mysql JDBC Driver常用的有两个,一个是gjt(Giant Java Tree)组织提供的mysql驱动,其JDBC Driver名称(JAVA类名)为:org.gjt.mm.mysql.Driver详情请参见网站:/或在本网站下载mysql JDBC Driver(mm.jar)另一个是mysql官方提供的JDBC Driver,其JAVA类名为:com.mysql.jdbc.Driver驱动下载网址:/downloads/,进入其中的MySQL Connector/J区域下载。mysql JDBC URL格式如下:jdbc:mysql:/host:port,host:port./database?参数名1=参数值1&参数名2=参数值2.现只列举几个重要的参数,如下表所示: 参数名称参数说明缺省值最低版本要求user数据库用户名(用于连接数据库)所有版本password用户密码(用于连接数据库)所有版本useUnicode是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为truefalse1.1gcharacterEncoding当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbkfalse1.1gautoReconnect当数据库连接异常中断时,是否自动重新连接?false1.1autoReconnectForPools是否使用针对数据库连接池的重连策略false3.1.3failOverReadOnly自动重连成功后,连接是否设置为只读?true3.0.12maxReconnectsautoReconnect设置为true时,重试连接的次数31.1initialTimeoutautoReconnect设置为true时,两次重连之间的时间间隔,单位:秒21.1connectTimeout和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本03.0.1socketTimeoutsocket操作(读写)超时,单位:毫秒。 0表示永不超时03.0.1对应中文环境,通常mysql连接URL可以设置为:jdbc:mysql:/localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false在使用数据库连接池的情况下,最好设置如下两个参数:autoReconnect=true&failOverReadOnly=false需要注意的是,在xml配置文件中,url中的&符号需要转义成&。比如在tomcat的server.xml中配置数据库连接池时,mysql jdbc url样例如下:jdbc:mysql:/localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false 其他参数请参见mysql jdbc官方文档: MySQL Connector/J Documentation 为什么 PreparedStatement 很重要, 以及怎样正确使用他们.数据库有一个艰苦的工作. 它们不断地从许多客户端读取 SQL 查询, 对数据进行尽可能高效的 查询. 处理语句可能成为一个代价较高的操作, 但是现在数据库都是很好的设计, 这样这个困难 被减到最小. 但是这些优化需要应用程序开发者的协助,这篇文章给你展示一下怎样正确使用 PreparedStatement 来漂亮地帮助数据库执行这些优化.一个数据库怎样执行一条语句?显然, 不要希望这里有许多细节; 我们只看一下对这篇文章比较重要的部分. 当一个数据库接收 到一条语句的时候, 数据库引擎首先解析这条语句, 查看语法错误. 一旦语句解析了, 数据库 需要找出最有效的方法来执行这条语句. 这个计算起来代价很大. 数据库检查什么索引(如果有 的话)能有所帮助, 或者它是否能全部读出一张表中所有的记录. 数据库根据这些关于数据库所 存数据的统计数字来找出最好的办法. 一旦制订出查询方案, 就可以由数据库引擎来执行.需要 CPU 来产生访问方案. 理想的情况, 如果我们把相同的语句给数据库发送两次, 我们期望 数据库重用第一条记录的访问方案. 这会比第二次重新产生方案要使用较少的 CPU.语句缓冲数据库可以进行调节来做语句缓冲. 通常包含一些类型的语句缓冲. 缓冲使用语句本身作为关键 字, 访问方案和相应的语句存储在缓冲区中. 这样就允许数据库引擎对以前执行过的语句所使用 的访问方案进行重用. 举个例子来说, 如果我们向数据库发送这样一条语句 select a, b from t where c = 2, 计算好的访问方案就放入缓冲区了. 如果我们以后再使用同样的语 句, 数据库就能重用以前的访问方案, 这样就能节省 CPU.但是要注意, 整条语句是一个关键字. 例如, 如果我们后来发送的语句是 select a,bfrom t where c = 3, 那么就不会找出以前的访问方案. 因为 c=3 和 c=2 是不一样的. 所以, 例如: For(int I = 0; I 1000; +I)PreparedStatement ps = conn.prepareStatement(select a,b from twhere c = + I);ResultSet rs = Ps.executeQuery();Rs.close();Ps.close();这里不会用到缓冲. 每次循环向数据库发送一条不同的 SQL 语句. 每次循环都重新计算新的访问 方案, 用这种方法我们会浪费大量的 CPU 周期. 但是, 看看下一个片段:PreparedStatement ps = conn.prepareStatement(select a,b from t where c= ?);For(int I = 0; I set transaction read only;事务处理集。SQL delete from employee where username=AAA;delete from employee where username= * 第 1 行出现错误:ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作SQL select username,age from employee;USERNAME AGE- -AAA 8已选择1行。窗口2:SQL update employee set age=18 where username=AAA;已更新 1 行。SQL commit;提交完成。窗口1: SQL select username,age from employee;USERNAME AGE - - AAA 8-看不到其他用户已提交的修改已选择1行。SQL commit;提交完成。SQL select username,age from employee;USERNAME AGE - - AAA 18 -事务结束后才看到对SYS用户来说,不支持set transaction read only set transacton read only支持的语句: 不带for update的select语句 lock table set role alter session alter system 二、set transaction read write 特点: 这是默认的事务级别 允许事务中的读写操作 语句级别读一致(statement-level read consitency) 限制: 不能在事务级别读一致与语句级别读一致之前转换三、set transaction isolation level serializable 特点: 查询时,只显示事务开始之前已提交的数据 不可更新事务开始之后别人已提交修改的数据 修改别人未提交的数据会引发等待。 窗口1: SQL update employee set age=22 where username=AAA;已更新 1 行。窗口2: SQL select username,age from employee;USERNAME AGE - - AAA 20窗口1: SQL commit;提交完成。窗口2: SQL select username,age from employee;USERNAME AGE - - AAA 20 -仍然是旧值SQL update employee set age=23 where username=AAA; update employee set age=23 where username=AAA * 第 1 行出现错误: ORA-08177: 无法连续访问此事务处理 -不能更新别人在事务开始后提交的数据此级别类似于set transaction read only,要求数据保持在事务开始之前的状态,但可以更改数据。四、set transaction isolation level read committed特点: 默认的事务级别 修改同一数据,后改的事务会一直等待前面的事务完成。 JDBC2/3.0 特征 介绍下面一个例子:Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(SELECT * FROM user WHERE username=aa);stmt.executeUpdate(UPDATE user SET lastdatetime=now() where username=aa);这 是一个用户登录时,经常用到的代码,先是根据用户名aa查找该用户的详细信息,然后再更新该用户的最后登录时间(lastdatetime)。这这个里 面,我们用了两个sql语句,这个是我一直用的方法,但是如果用JDBC2.0给我们提供的便利,我们只要写一条sql就够了,其他的都交给jdbc,看 下面的代码:Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs2 = stmt.executeQuery(SELECT * FROM user WHERE username=aa);rs2.next();rs2.updateDate(lastdatetime, new Date(Calendar.getInstance().getTimeInMillis();rs2.updateRow();这 里面最主要的特征就是ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_UPDATABLE,通过初始化 Statement时传不同的参数,可以对ResultSet进行不用的错作限制。con.createStatement的时候,有三种可以掉用的函 数:1、createStatement();2、createStatement(int resultSetType, int resultSetConcurrency)3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)其中resultSetType可选值是: 1、ResultSet.TYPE_FORWARD_ONLY 在ResultSet中只能先前移动游标, 2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标, 3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标,同时ResultSet的值有所改变的时候,他可以得到改变后的最新的值其中resultSetConcurrency可选值是: 1、ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只读的,可以修改 2、ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以任意修改,然后更新会数据库其中resultSetHoldability可选值是: 1、ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交时,不关闭ResultSet的游标 2、ResultSet.CLOSE_CURSORS_AT_COMMIT 表示修改提交时,关闭ResultSet的游标对 于查询操作第一种初始化方法createStatement(),相当于第二种方法的createStatement (ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY),第三种方法的createStatement (ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT)下面写一段demo的代码,我把一些特征函数都用出来,但是只是用来查考和说明名灵活性的。Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs2 = stmt.executeQuery(SELECT * FROM user);rs2.next();rs2.updateDate(lastdatetime, new Date(Calendar.getInstance().getTimeInMillis();rs2.updateRow();rs2.afterLast();while(rs2.previous() /*.*/ rs.beforeFirst();while(rs2.next() /*.*/ rs.last();rs.first();rs.absolute(5);/游标移动到第5条rs.absolute(-1); /游标移动到最后一条rs.relative(-5); /游标向上移动5条rs.relative(2); /游标向下移动2条rs.deleteRow();/删除当前行rs.last(); /游标移动到最后rs.updateString(summary, This is .); /设置更新的字段值rs.cancelRowUpdates(); /取消刚才输入的更新rs.getRow(); /得到当前行号rs.moveToInsertRow(); /游标移动到要新增的那条记录上rs.updateInt(id, 1);rs.updateString(2, my name);rs.insertRow(); /插入新记录JDBC2.0提供的还有一个功能就是数据库的批量操作:con.setAutoCommit(false);Statement stmt3 = con.createStatement();stmt3.addBatch(insert .);stmt3.addBatch(insert .);int rows = stmt3.executeBatch();mit();但是有一点要注意,stmt3.executeBatch()他不会自动给你回滚数据操作,当你有5条update语句的时候,如果第三条发生错误,那么将无法自动回滚前两条update语句的影响,所以一定要自己手工进行事务管理。在您的事务中使用 Savepoint JDBC3.0 中最令人兴奋的附加特点就是 Savepoint 了。有时候需要的是对事务多一点的控制,而不是在当前的事务中简单地对每一个改变进行回滚。在JDBC3.0下,您就可以通过 Savepoint 获得这种控制。Savepoint 接口允许您将事务分割为各个逻辑断点,以控制有多少事务需要回滚。看下面的代码:conn.setAutoCommit(false); conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); Statement stmt = conn.createStatement(); int rows = stmt.executeUpdate( INSERT INTO authors (first_name, last_name) valueS(Lewis, Carroll); Savepoint svpt = conn.setSavepoint(NewAuthor); tryrows = stmt.executeUpdate( UPDATE authors set type = fiction WHERE last_name = Carroll); catch(Exception e)conn.rollback(svpt);rows = stmt.executeUpdate( update . other sql );mit(); 上面代码显示,当UPDATE authors失败的时候,系统事务回滚UPDATE authors的sql的影响,而INSERT INTO authors的sql仍然有效检索自动产生的关键字为 了解决对获取自动产生的或自动增加的关键字的值的需求,JDBC 3.0现在将获取这种值变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,Statement.RETURN_GENERATED_KEYS和 Statement.NO_GENERATED_KEYS。在执行这条语句后,所产生的关键字的值就会通过从 Statement 的实例方法 getGeneratedKeys() 来检索 ResultSet 而获得。ResultSet 包含了每个所产生的关键字的列。看下面代码:Statement stmt = conn.createStatement(); stmt.executeUpdate(INSERT INTO authors (first_name, last_name) valueS (George, Orwell), Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys(); if ( rs.next() ) int key = rs.getInt(); 常用JDBC连接数据库方法总结一、JDBC连接DB2Class.forName(Com.ibm.

温馨提示

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

评论

0/150

提交评论