`
tigers20010
  • 浏览: 48967 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2009-12-10传智播客jdbc——高级应用(转载)

    博客分类:
  • JDBC
阅读更多
Oracle数据库部分终于在昨天结束了,整理学习日志到很晚。今天继续讲解JDBC,是方老师授课的。方老师在我们班还有六堂的课程,多少有些舍不得,他是个好老师。学完这六堂课,JAVAWEB基础到此也就结束了(09-12-18)。十分渴望快些学习到项目那,把这些技术混合运用,做出个像模像样的东西来!



         今天的内容依然很多,我还是好好把它整理出来吧!



一、JDBC中调用Oracle存储过程:

         例,在Oracle中创建一个存储过程:

CREATE OR REPLACE PROCEDURE UPEMPFUN(

       ARG_EMPNO IN NUMBER,

       ARG_SAL IN NUMBER,

       ARG_RES OUT VARCHAR

)IS BEGIN 

    UPDATE EMP SET SAL = ARG_SAL WHERE EMPNO=ARG_EMPNO;

    COMMIT; 

    ARG_RES := 'OK!';

END;


         在JDBC中,调用上面的存储过程(我的Oralce出问题了,没有测试):

CallableStatement cStmt = conn.prepareCall("{call UPEMPFUN(?, ?, ?)}");

// 注册接收返回值的变量

cStmt.registerOutParameter(3, Types.VARCHAR);

cStmt.setInt(1, 7360);

cStmt.setFloat(1, 8888);

cStmt.execute();

// 打印返回值

System.out.println(cStmt.getString(3));




二、JDBC数据库中的分布技术:

1.ResultSet提供了对结果集进行滚动的功能:

next():移动到下一行

Previous():移动到前一行

absolute(int row):移动到指定行

beforeFirst():移动resultSet的最前面

afterLast() :移动到resultSet的最后面



         使用上面的滚动记录功能可以实现分页功能,但建议不要使用这种技术进行分页。因为当记录数量大的时间,会带来性能上的下降,资源的浪费。



         2.MySQL分页语句:

         Select * from tab_ame limit M,N;

         M:记录起始索引位置

         N:获取记录数量



         3.Oracle分页语句(TOP-N技术):

         Select * from (

                   Select rownum rn,* from (

                            Select * from tab_name where 条件

) where rownum <=结束位置

)where rn >=起始位置

         它与MySql分页相比,MySql更方便些。而且MySql中的N直接获取记录数量,但Oracle中却是结束位置的索引和起始位置的索引之间的记录。



         4.编写一个WEB应用,使用分布技术显示数据库中的记录:

简易流程图:(如果看不到图片,请到这里:http://www.blogjava.net/changcheng/)



ListStudent.java,doGet部分:

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 获取总记录数量

       StudentDao sd = new StudentDao();

       int totalrecord = 0;

       int pagenum = 0;

       Page page = null;

       try {

           totalrecord = sd.getTotal();

           // 获取记录信息

           String currage = request.getParameter("currpage");

           page = new Page(totalrecord, (currage != null) ? Integer

                  .parseInt(currage) : 1);

           page.setRecord(sd.getRecord(page.getStartindex(), page.getPagesize()));

       } catch (Exception e) {

           e.printStackTrace();

       }

      

       // 将信息发往index.jsp进行显示

       request.setAttribute("page", page);

       request.getRequestDispatcher("index.jsp").forward(request, response);

    }




Student.java:

public class StudentDao {

    // 获取学生总数

    public int getTotal() throws SQLException {

       // 获取连接

       Connection conn = JdbcUtil.getDataSource().getConnection();

       // 查询数量

       PreparedStatement ps = conn

              .prepareStatement("select count(*) from student");

       ResultSet rs = ps.executeQuery();

       int total = 0;

       while (rs.next()) {

           total = rs.getInt(1);

       }

       // 释放连接

       JdbcUtil.release(rs, ps, conn);

       return total;

    }



    // 获取记录

    public List getRecord(int startindex, int count) throws SQLException {

       // 获取连接

       Connection conn = JdbcUtil.getDataSource().getConnection();

       // 查询记录

       PreparedStatement ps = conn

              .prepareStatement("select id,name,sex from student limit ?,?;");

       ps.setInt(1, startindex);

       ps.setInt(2, count);

       ResultSet rs = ps.executeQuery();

       // 读取记录

       List result = new ArrayList();

       while (rs.next()) {

           StudentBean stuben = new StudentBean();

           stuben.setId(rs.getInt("id"));

           stuben.setName(rs.getString("name"));

           stuben.setSex(rs.getBoolean("sex"));

           result.add(stuben);

       }

       // 释放连接

       JdbcUtil.release(rs, ps, conn);

       return result;

    }



}




Page.java:

public class Page {

    private int totalrecord;// 总记录数

    private int totalpage;// 总页面数

    private int pagesize = 3;// 页面显示记录数

    private int startindex;// 起始索引

    private int currpage;// 当前页面

    private List record;// 记录



    public Page(int totalrecord, int currpage) {

       this.totalrecord = totalrecord;

       this.currpage = currpage;

    }

    public int getTotalrecord() {

       return this.totalrecord;

    }

    public List getRecord() {

       return record;

    }

    public void setRecord(List record) {

       this.record = record;

    }

    // 计算总页面数

    public int getTotalpage() {

       if (this.totalrecord % this.pagesize == 0)

           totalpage = this.totalrecord / this.pagesize;

       else

           totalpage = this.totalrecord / this.pagesize + 1;



       return this.totalpage;

    }

    // 计算起始索引

    public int getStartindex() {

       this.startindex = (this.currpage - 1) * this.pagesize;

       return this.startindex;

    }

    public int getPagesize() {

       return this.pagesize;

    }

}




Index.jsp,body部分:

    <body>

        HI

        <hr>

        <table border="1">

        <tr>

            <td>ID</td><td>姓名</td><td>性别</td>

        </tr>

        <!-- 显示记录信息 -->

        <cc:forEach var="record" items="${page.record}">

        <tr>

            <td>${record.id }</td><td>${record.name }</td><td>${record.sex }</td>

        </tr>

        </cc:forEach>

       

        <!-- 显示翻页信息 -->

        </table>

        <cc:forEach var="i" begin="1" end="${page.totalpage}">

         <a href="http://localhost:8080/091210/ListStudent?currpage=${i}">${i}</a>

    </cc:forEach>

    </body>




         如果连接的是Oracle数据库,则使用Oracle数据库的TOP-N技术即可!



三、JDBC对数据库LOB操作:

         LOB数据(LargeObject),简称大对象。它分为两类:

1.        CLOB:CharactorLargeObject,专门用于处理字符的大对象。

2.        BLOB:ByteLargeObject,专门用于处理二进制数据,比如图片等。



1.        MySQL中的LOB操作:

在MySQL中:TEXT与CLOB对应,BLOB与BLOB对应。

调用下面的方法设置TEXT:

PreparedStatement.setCharacterStream(index, reader, length);

//注意length长度须设置,并且设置为int型


调用下面的方法获取TEXT:

1.reader = resultSet. getCharacterStream(i);

2.reader = resultSet.getClob(i).getCharacterStream();

3.string = resultSet.getString(i);




调用下面的方法设置BLOB:

PreparedStatement.setBinaryStream(i, inputStream, length);


调用下面的方法获取BLOB:

1.InputStream in = resultSet.getBinaryStream(i);

2.InputStream in = resultSet.getBlob(i).getBinaryStream();




在MySql数据库中使用LOB字段,直接定义这个字段的类型为“TEXT”或“BLOB”即可!



2.        Oracle中的LOB操作:

在Oracle中CLOB与“EMPTY_CLOB()”对应,“BLOB”与“EMPTY_BLOB()”对应。

Oracle中设置和获取BLOB的JDBC方法与MySQL相同。

在Oralce中添加LOB字段插入内容时,必须在事件中进行否则极可能出错。



注意:在Oracle数据库中添加CLOB字段必须使用“empty_clob()”,添加BLOB字段必须使用“empty_blob()”。在对他们进行赋值时,必须使用查询语句获取对应字段名的指针。在获取字段指针的查询语句结尾必须使用“fro update”这样锁定该行,保证不会发生冲突。



例,向Oracle数据库写入大文本操作:

private static void save() throws Exception {

       // 获取连接

       Connection conn = JdbcUtil.getDataSource().getConnection();

       conn.setAutoCommit(false);

       PreparedStatement ps = conn

              .prepareStatement("insert into ocolb(id, text) values (1,empty_clob())");

       ps.executeUpdate();

       // 获取指针

ps = conn.prepareStatement("select text from ocolb where id=1 for update;");

       ResultSet rs = ps.executeQuery();

       // 写入数据

       File imfi = new File("C:/ocolb.txt");

       Reader reader = new FileReader(imfi);

       //ps.setCharacterStream(1, reader, imfi.length());

       CLOB clob = (CLOB) rs.getClob("text");

       Writer writer = clob.getCharacterOutputStream();

       char[] buf = new char[1024];

       int len = 0;

       while((len = reader.read(buf)) != -1){

           writer.write(buf, 0, len);

       }

       reader.close();

       writer.close();

       // 提交

       conn.commit();

       // 释放连接

       JdbcUtil.release(rs, ps, conn);

    }




四、JDBC对数据库批量操作:

当我们向数据库的一个表中插入100条记录时,比如向employee表中插入100名员工。难道我们要一条条语句执行?如果插入100万条呢?后果可想而知,所以需要批量操作来完成此任务。



在JDBC中有两种方法可以进行指操作:

1.        Statement.addBatch(sql):

实现批处理的缺点:当向表中使用sql语句批量插入数据时,采用此种方式需重复写上多条语句相同,只参数不同的sql语句,工作量大,可读性差。

String sql1 = "insert into employee(id,name) values(1,'aaa')";       

String sql2 = "insert into employee(id,name) values(2,'bbb')";

st = conn.createStatement();

st.addBatch(sql1);

st.addBatch(sql2);

st.executeBatch();




2.        PreparedStatement. addBatch():

SQL语句相同,但参数相同。此种方法主要用于在同一个表中批量插入数据、或批量更新数据。

String sql2 = "insert into employee(name,department_id) values(?,?)";

ps = conn.prepareStatement(sql2);            

Iterator it = department.getEmployees().iterator();

while(it.hasNext()){

    Employee e = (Employee) it.next();

    ps.setString(1, e.getName());

    ps.setInt(2, id);

    ps.addBatch();

}






五、JDBC操作多个实体:

操作多个实体?这个玩法第一次听说。说直白些就是将JAVA对象与数据库的表,关联起来。如何关联?当然是通过代码关联了。



例:

1.创建department和employee表:

Create table department(

    id int primary key auto_increment,

    name varchar(50)

)



Create table employee(

    id int primary key auto_increment,

    name varchar(30),

    department_id int,

    constraint for_ke foreign key(department_id) references department(id)

)




2.定义Department和Employee类:

public class Department {

    private int id;

    private String name;

    private Set<Employee> employees = new HashSet<Employee>();



}



public class Employee {

    private int id;

    private String name;

    private Department department;



}




3.创建一个多Department对象,创建多个个Employee对象,添加到Department对象的SET中。



4.定义一个工具类,将Department对象给工具类的SAVE方法,SAVE方法使用批量操作,将数据添加到数据库的department和employee表中。



分享到:
评论

相关推荐

    台州市乡镇边界,shp格式

    shp格式,可直接导入arcgis使用

    perl516-perl-Time-Piece-1.20.1-19.el6.centos.alt.x86_64.rpm

    perl516-perl-Time-Piece-1.20.1-19.el6.centos.alt.x86_64.rpm

    基于蒙特卡洛模拟的电动汽车接入对配电网影响研究:灵活容量预测、潮流计算与电压稳定性优化分析,基于蒙特卡洛法的电动汽车无序接入对配电网影响的分析 采用蒙特卡洛法对电动汽车的接入容量进行预测 再将预测

    基于蒙特卡洛模拟的电动汽车接入对配电网影响研究:灵活容量预测、潮流计算与电压稳定性优化分析,基于蒙特卡洛法的电动汽车无序接入对配电网影响的分析 采用蒙特卡洛法对电动汽车的接入容量进行预测 再将预测的结果接入IEEE33节点配电网 通过对配电网的潮流计算 得到接入前后对电网电压和网损的影响 这个接入的数目也是可以灵活改变的 这段程序主要是对一个电力系统进行潮流计算和优化。下面我将对程序的功能、应用领域、工作内容、主要思路进行详细解释。 1. 功能和应用领域: 这段程序的功能是对一个电力系统进行潮流计算和优化。潮流计算是电力系统中的一种重要分析方法,用于计算系统中各节点的电压幅值和相位角,以及各支路的功率损耗。优化是指对系统进行调整,以减小功率损耗、提高电压稳定性等方面的指标。这种潮流计算和优化在电力系统规划、运行和管理中具有重要的应用价值。 2. 工作内容: 这段程序包含了多个函数和主程序,下面将逐个进行解释。 - 主程序: - 清除工作区和命令窗口中的变量和数据。 - 从文件中加载负荷数据,并进行单位转。 - 调用函数`car

    蓄电池与超级电容混合储能系统仿真模型:功率分配与波动抑制研究,基于Matlab Simulink平台实现,结合低通滤波器与智能SOC管理策略,蓄电池与超级电容混合储能并网matlab simulink

    蓄电池与超级电容混合储能系统仿真模型:功率分配与波动抑制研究,基于Matlab Simulink平台实现,结合低通滤波器与智能SOC管理策略,蓄电池与超级电容混合储能并网matlab simulink仿真模型,混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电,soc较低时状态与其相反。 ,核心关键词:混合储能; MATLAB Simulink仿真模型; 功率分配; 低通滤波器; 功率波动抑制; 能量管理; 超级电容SOC; 蓄电池。,"混合储能系统:Matlab Simulink仿真模型中低通滤波器与SOC能量管理优化"

    医疗废物信息化管理系统建设方案

    该文档是医疗废物信息化管理系统建设方案,围绕医疗废物管理展开。先介绍政策历程,因医疗废物危害大,国家出台多项政策推动信息化管理。接着阐述建设背景,指出当前医废管理存在纸质单据缺陷、流程不规范等问题。随后详细说明解决方案,涵盖系统应用、业务流程等。功能设计部分分别介绍卫健委局端、医院端、处置公司的功能,如数据展示、医废采集入库出库、人员管理等,旨在实现医废精准管理、全程追溯和闭环监管。

    syslinux-perl-4.05-15.el7.x64-86.rpm.tar.gz

    1、文件内容:syslinux-perl-4.05-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/syslinux-perl-4.05-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于Matlab Simulink的单向Boost PFC与全桥LLC串联谐振开关电源仿真模型:2kw功率输出48V,谐振频率100kHz及输出电压闭环PFM控制,单向Boost PFC+全桥LLC

    基于Matlab Simulink的单向Boost PFC与全桥LLC串联谐振开关电源仿真模型:2kw功率输出48V,谐振频率100kHz及输出电压闭环PFM控制,单向Boost PFC+全桥LLC串联谐振开关电源Matlab simulink仿真模型 2kw功率,输出48V,谐振频率100k LLC使用输出电压闭环 PFM控制 ,核心关键词:单向Boost;PFC+全桥LLC;串联谐振开关电源;Matlab simulink仿真模型;2kw功率;输出48V;谐振频率100k;LLC输出电压闭环;PFM控制;,"Matlab Simulink仿真模型:2kW全桥LLC谐振电源的Boost-PFC研究"

    perl516-perl-File-Slurp-9999.19-10.el6.centos.alt.noarch.rpm

    perl516-perl-File-Slurp-9999.19-10.el6.centos.alt.noarch.rpm

    python项目实战之基于深度学习的电影评论情感分析源码+报告PDF

    python项目实战之基于深度学习的电影评论情感分析源码+报告PDF,个人大三设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做课程设计大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 python项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度学习的电影评论情感分析源码+报告PDFpython项目实战之基于深度

    weixin079-springboot智能校园点餐管理系统设计(论文+PPT).zip

    标题SpringBoot智能校园点餐管理系统设计AI更换标题第1章引言介绍智能校园点餐管理系统的背景、意义以及本文的设计目标和主要内容。1.1研究背景与意义分析校园点餐的现状及问题,阐述智能点餐系统的必要性和优势。1.2设计目标与内容明确系统的设计目标,概述论文的主要研究内容和结构安排。第2章系统需求分析对智能校园点餐管理系统的功能需求和非功能需求进行详细分析。2.1功能需求分析列举系统应具备的各项功能,如菜品浏览、点餐、支付等。2.2非功能需求分析分析系统的性能、安全性、可靠性等非功能需求。第3章系统设计根据需求分析,设计系统的整体架构、功能模块和数据库。3.1系统架构设计设计系统的整体架构,包括前后端分离、微服务架构等。3.2功能模块设计详细设计系统的各个功能模块,如用户管理、菜品管理、订单管理等。3.3数据库设计设计系统的数据库结构,包括表结构、数据字典等。第4章系统实现阐述系统的具体实现过程,包括开发环境、技术选型、关键代码实现等。4.1开发环境与技术选型介绍系统的开发环境,选择合适的技术栈和工具。4.2关键代码实现展示系统关键功能的代码实现,如用户登录、菜品展示、订单生成等。

    基于改进Fi-GNN模型的CTR预估方法.pdf

    基于改进Fi-GNN模型的CTR预估方法.pdf

    MAKINO系列机床操作与维修设定指南:PRO3操作、V55维护、报警表及作业规范手册,MAKINO 牧野 PRO3 维修设定操作 A55 PRO3操作说明书 日文.pdf A55卧加工作台旋转后加

    MAKINO系列机床操作与维修设定指南:PRO3操作、V55维护、报警表及作业规范手册,MAKINO 牧野 PRO3 维修设定操作 A55 PRO3操作说明书 日文.pdf A55卧加工作台旋转后加工原点计算.xlsx A61_SPECS.pdf MAKINO PRO3 V55-Operation-Guide 英文.pdf MAKINO S 系列PRO5 使用说明书PIC-Makino-S33-S56-0209.pdf MAKINO 培训课程Schulung_英文.pdf MAKINO-F3F5安装手册MANUAL 英文.pdf Makino-GF8主轴头取汲说明书.pdf MAKINO-PRO3-ProgManua英文l.pdf PIC-Makino-a61-0209.pdf V33 V55 -Series-Operation-485a-9911e英文.pdf V55-Maintenance-Guide-4v2b1563英文.pdf 牧野J5机床说明书J5_OPERATION_中文.pdf 牧野Professional5使用说明书摘要(a1系列 a51 a61 a71 a81 a8

    sgml-common-0.6.3-39.el7.x64-86.rpm.tar.gz

    1、文件内容:sgml-common-0.6.3-39.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sgml-common-0.6.3-39.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    基于ST-GCN的轻量级行为识别方法.pdf

    基于ST-GCN的轻量级行为识别方法.pdf

    开发板FPGA电机控制源码:底层Verilog与Nios II软件架构的协同工作,集成编码器模块算法与矢量调制等核心技术,开发板FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源

    开发板FPGA电机控制源码:底层Verilog与Nios II软件架构的协同工作,集成编码器模块算法与矢量调制等核心技术,开发板FPGA电机控制源码(verilog+nios2架构)FPGA电机控制源码, 方案为单FPGA方案才用底层verilog + 应用层nios2的软件架构,很具有学习价值。 包括编码器模块算法, 坐标变算法, 矢量调制算法等等。 注:此代码不适合新手小白。 ,核心关键词:FPGA电机控制源码; 开发板; Verilog; Nios2架构; 编码器模块算法; 坐标变换算法; 矢量调制算法; 学习价值; 单FPGA方案; 底层Verilog + 应用层Nios2软件架构。,基于Verilog+Nios2架构的FPGA电机控制源码:单FPGA方案学习宝典

    产品经理-yyb.apk

    产品经理-yyb.apk

    基于PSO优化的SVM时间序列预测分析:详细代码注释,数据替换即用,PSO优化SVM做时间序列预测分析,代码内注释详细,直接替数据就可以使用 ,核心关键词:PSO优化; SVM; 时间序列预测分析;

    基于PSO优化的SVM时间序列预测分析:详细代码注释,数据替换即用,PSO优化SVM做时间序列预测分析,代码内注释详细,直接替数据就可以使用 ,核心关键词:PSO优化; SVM; 时间序列预测分析; 代码内注释详细; 直接替换数据即可使用。,PSO算法优化SVM时间序列预测分析工具——注释详尽的代码直接替换数据即可使用

    telepathy-glib-0.24.1-1.el7.x64-86.rpm.tar.gz

    1、文件内容:telepathy-glib-0.24.1-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/telepathy-glib-0.24.1-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    perl516-perl-DB_File-1.826-19.el6.centos.alt.x86_64.rpm

    perl516-perl-DB_File-1.826-19.el6.centos.alt.x86_64.rpm

    OMRON CP1HPLC电子手轮控制伺服:详细教程-接线、设定与编程指南,OMRON CP1HPLC 电子手轮控制伺服,如何接线,设定,编写程序 PDF文档,我自己总结编写的教程,实际项目应用

    OMRON CP1HPLC电子手轮控制伺服:详细教程——接线、设定与编程指南,OMRON CP1HPLC 电子手轮控制伺服,如何接线,设定,编写程序。 PDF文档,我自己总结编写的教程,实际项目应用,私家珍藏。 ,核心关键词:OMRON CP1HPLC; 电子手轮控制伺服; 接线方法; 设定步骤; 编写程序; 教程; PDF文档; 实际项目应用; 私家珍藏。,OMRON CP1HPLC伺服控制教程:接线、设定与编程指南

Global site tag (gtag.js) - Google Analytics