




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
访问数据库(2),第6章,2,回顾,怎样注册JDBC驱动程序 ? 怎样获得数据库连接接口对象? 获得PreparedStatement和Statement接口对象的方法分别是什么?,3,本章目标,本次课程目标 掌握事务的处理方法; 掌握ResultSetMateData对象的用法; 掌握怎样将ResultSet中的数据装入到集合中 了解怎样获得可滚动结果集,4,事务处理:,默认情况下,连接Connection是处于自动提交模式。 在自动提交模式下,每个SQL更新语句(insert,update,delete)成功执行完后就会自动提交到数据库中。 为了将多个数据库更新组合成一组更新,我们需要将自动提交模式关闭(使用setAutoCommit(boolean auto)方法)。 一旦关闭了自动提交模式,每个SQL语句都是一个事务的一部分,为使事务对数据库产生永久效果,需要使用 commit()方法来显式地进行提交。 在自动提交关闭后,不成功的提交会导致数据库进行隐式的回滚,所有的更新都会丢失。也可以调用rollback();,5,事务设置,public void trans() Connection con=null; PreparedStatement pstmt=null; try con=getConnection(); con.setAutoCommit(false); String sql1=“insert into student values(?,?,?)“; pstmt=con.prepareStatement(sql1); pstmt.setString(1,“孙悟空“); pstmt.setString(2, “男“); pstmt.setDate(3, java.sql.Date.valueOf(“1753-5-13“); pstmt.executeUpdate(); System.out.println(“第一次录入成功“); pstmt.setString(1,“观世音“); pstmt.setString(2, “女“); pstmt.setDate(3, java.sql.Date.valueOf(“1753-5-13“); pstmt.executeUpdate(); System.out.println(“第二次录入成功“); mit(); catch (SQLException e) con.rollback(); ,事务管理,设置手动提交,事务开始,出现异常,事务回滚,提交事务,6,练习1,训练内容 使用JDBC事务保证数据操作的完整性 需求说明 开通银行帐户需记录客户基本信息,同时应给客户分配一个银行资金帐户,且在开户时,银行资金帐户必须存入至少10元金额.为了保证客户信息完整和资金帐户数据安全,在添加客户资料和分配资金帐户时,应确保两个操作同时执行成功,7,表结构,8,ResultSetMetaData对象,继续完善BaseDB的方法通用查询方法 只要输入一个sql语句就能将结果输出到控制台,public void executeQuery(String sql) Connection con=null ; PreparedStatement pstmt=null; ResultSet rs=null; try con=getConnection(); pstmt=con.prepareStatement(sql); rs=pstmt.executeQuery(); while(rs.next() System.out.print(rs.getString(1)+“t“); System.out.print(rs.getString(2)+“t“); System.out.print(rs.getString(3)+“t“); catch (ClassNotFoundException e) 。 finally /关闭资源 ,你用用ResultSetMetaData,保管好使,怎么才能知道查询语句里有几个字段呢?,9,ResultSetMetaData对象,可用于获取关于 ResultSet 对象中列的类型和属性信息的对象 获得ResultSetMetaData对象: ResultSet对象的getMetaData()方法; ResultSetMetaData对象的常用方法: int getColumnCount() : 获得本次查询中的列数 String getColumnName(int column) :获得本次查询中指定列的列名。 String getColumnTypeName(int column) :检索指定列的数据库特定的类型名称。 int getColumnDisplaySize(int column) :指示指定列的最大标准宽度,以字符为单位。 String getTableName(int column) :获取指定列的表名称,10,从数据库中取出表中所有信息,public void executeQuery(String sql) Connection con=null ; PreparedStatement pstmt=null; ResultSet rs=null; try con=getConnection(); pstmt=con.prepareStatement(sql); rs=pstmt.executeQuery(); ResultSetMetaData rd=rs.getMetaData(); int colCount=rd.getColumnCount(); while(rs.next() for(int i=1;i=colCount;i+) System.out.print(rs.getString(i)+“t“); System.out.println(); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); finally /关闭资源 ,ResultSetMetaData对象,获得媒体元数据对象,循环输出每一列数据,获得本次查询的列数,11,参数设置,继续完善BaseDB的方法通用参数设置方法,告诉你个秘密,要自己写一个设置参数的方法。,如果sql中有“?”参数那该怎么办?,public void setParams(PreparedStatement ps,Object params) if(params=null) return; for(int i=0;iparams.length;i+) ps.setObject(i+1,paramsi); ,public void executeQuery(String sql,Object params) Connection con=null ; PreparedStatement pstmt=null; ResultSet rs=null; try con=getConnection(); pstmt=con.prepareStatement(sql); setParams(pstmt,params); rs=pstmt.executeQuery(); ResultSetMetaData rd=rs.getMetaData(); int colCount=rd.getColumnCount(); while(rs.next() for(int i=1;i=colCount;i+) System.out.print(rs.getString(i)+“t“); System.out.println(); . . . . . . ,有了这个方法以后就太方便了!,12,Java和数据库数据类型匹配,数据库java类型对照表 表示完全匹配, 表示有时可以用,13,将ResultSet对象中的数据装入到集合中,思路: 每一条记录的每个字段值放入到一个集合中-rowList 所有记录是一个大的集合-tabList,创建一个集合用来存放表中的数据。tabList,将行的集合加入到表的集合中。,每行创建一个集合rowList用来存放每一条记录中的每一列的值,14,将ResultSet对象中的数据装入到集合中,思路: 每一条记录的每个字段值放入到一个集合中 所有记录是一个大的集合,int colCount=metaData.getColumnCount(); ArrayList tableData=new ArrayList(); while(rs.next() ArrayList rowList=new ArrayList(); for(int i=1;i=colCount;i+) rowList . add(rs.getString(i); tableData.add(rowList); ,创建一个集合用来存放每一条记录中的每一列的值,创建一个表集合用来加载-存放每一条记录的小的集合,将行的集合加入到表的集合中。,15,创建可滚动的ResultSet对象,Statemet createStatement(int resultSetType,int resultSetConcurrency) PreparedStatement prepareStatement(String sql, int resultSetType,int resultSetConcurrency) resultSetType参数决定对象的类型(可否滚动); ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE resultSetConcurrency参数决定并发级别; ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE,16,数据库编程,创建可滚动的ResultSet对象 :,17,只读性可滚动结果集,con = DBManager.getCon(); String sql=“select * from student“; pst=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); rst = pst.executeQuery(); rst.absolute(3);/定位至结果集第三条记录 System.out.println(rst.getString(2); rst.previous();/定位至当前记录的上一条记录 System.out.println(rst.getString(2); rst.next();/定位至当前记录的下一条记录 System.out.println(rst.getString(2); rst.first();/定位至第一条记录 System.out.println(rst.getString(2); rst.last();/定位至最后一条记录 System.out.println(rst.getString(2);,上面的程序可获取任意位置的数据,更新数据,应使用读写可滚动结果集,18,设置具有可滚动结果集的语句对象,public void rollSet() Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; try con=getConnection(); String sql1=“select * from student“; pstmt=con.prepareStatement(sql1,ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY); rs=pstmt.executeQuery(); ResultSetMetaData rd=rs.getMetaData(); int colCount=rd.getColumnCount(); rs.absolute(4); while(rs.next() for(int i=1;i=colCount;i+) System.out.print(rs.getString(i)+“t“); System.out.println(); catch (ClassNotFoundException e) / TODO Auto-generated catch block e.printStackTrace(); catch (SQLException e) ,使用PreparedStatement查询数据 2-2,设置可滚动不敏感、并发只读的结果集,将结果即指针直接移动到指定位置,19,在自动增长主键的表中插入一条数据,往往需要获得该数据的主键。,public int insertGoods() int resultId=-1; try con=getConnection(); String sql1=“insert into Goods values(猪八戒,63.5)“; stmt=con.createStatement(); stmt.executeUpdate(sql1,Statement.RETURN_GENERATED_KEYS); rs=stmt.getGeneratedKeys(); if(rs.next() resultId=rs.getInt(1); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); finally return resultId; ,获得新插入记录的主键,设置获取返回的主键,获取返回的主键,20,在自动增长主键的表中插入一条数据,往往需要获得该数据的主键。,public int insertGoods() int resultId=-1; try con=getConnection(); String sql1=“insert into Goods values(猪八戒,63.5)“; stmt=con.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS); stmt.executeUpdate(); rs=stmt.getGeneratedKeys(); if(rs.next() resultId=rs.getInt(1); catch (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); finally return resultId; ,获得新插入记录的主键,设置获取返回的主键,获取返回的主键,21,2.CallableStatement,2.1 CallableStatement简介,CallableStatement是PreparedStatement和Statement接口的子接口,其主要作用是调用存储过程 CallableStatement的主要方法如下,除了上面的方法外, CallableStatement继承了PreparedStatement中大量的方法,22,2.2 CallableStatement使用,Java中使用CallableStatement调用存储过程,可以完成复杂的数据操作,调用存储过程步骤:,编写存储过程,创建CallableSatement,为存储过程赋值,执行存储过程调用,23,CallableStatement使用,CallableStatement cst = connection.prepareCall(String name),如何创建CallableStatement?,prepareCall方法中的参数格式: call 存储过程名称() 如果存储过程带有参数需要在括号中加问号,并为参数赋值 call 存储过程名称(?,?),有两个问号表示此存储过程有两个参数 如果存储过程有输出参数应调用 cst.registerOutParameter()方法注册输出参数.,如何设置参数?,24,调用无参数存储过程,use demo if exists(select * from sysobjects where name=pro_demo1 and type=p) drop procedure pro_demo1 go create procedure pro_demo1 as select * from stuclass go,con = DBManager.getCon(); cst = con.prepareCall(“call pro_demo1()“); cst.execute();/调用存储过程 rst = cst.getResultSet(); while(rst.next() System.out.println(“名称:“+rst.getString(2); ,25,调用带输入参数存储过程,use Demo if exists(select * from sysobjects where name=pro_demo2 and type=p) drop procedure pro_demo2 go create procedure pro_demo2 majoyName varchar(20) -输入参数 as select COUNT(*) from stuclass where majoy = majoyName go,con = DBManager.getCon(); cst = con.prepareCall(“call pro_demo2(?)“); cst.setString(1, “计算机“); cst.execute(); rst = cst.getResultSet(); while(rst.next() System.out.println(“计算机专业的班级有:“+rst.getInt(1); ,为输入参数赋值,26,调用带输入输出参数存储过程,use Demo if exists(select * from sysobjects where name=pro_demo3 and type=p) drop procedure pro_demo3 go create procedure pro_demo3 majoyName varchar(20), stuNum int output as
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建材物流园工程可行性研究报告(参考)
- 国际冷链物流产业园扩建项目可行性研究报告(范文模板)
- 河南省开封市五县联考2023-2024学年高二上学期12月月考历史含解析
- 重庆第二师范学院《中级法语(二)》2023-2024学年第二学期期末试卷
- 平顶山学院《有机化学实验一》2023-2024学年第二学期期末试卷
- 广东茂名健康职业学院《节目策划通论》2023-2024学年第二学期期末试卷
- 四川信息职业技术学院《纳米工程导论》2023-2024学年第二学期期末试卷
- 湖南化工职业技术学院《体育赛事组织》2023-2024学年第二学期期末试卷
- 南阳科技职业学院《环境科学前沿》2023-2024学年第二学期期末试卷
- 贵州交通职业技术学院《网络与新媒体》2023-2024学年第二学期期末试卷
- 防火防爆技术课件:电气防爆
- 微笑曲线中文版课件
- 《古典决策理论》课件
- 2024年中考物理母题解密专题12 简单机械 机械效率考点精练(附答案)
- 观景台施工合同模板
- 存款代持协议书范文模板
- 标准化服务在博物馆展览策划中的应用考核试卷
- 2024年华东师大版学业水平信息技术模拟试卷(含答案解析)
- 派遣工的考勤管理制度
- GB/T 44353.1-2024动物源医疗器械第1部分:风险管理应用
- 中医培训课件:火龙罐的中医技术
评论
0/150
提交评论