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表中。
分享到:
相关推荐
传智播客-Jdbc-李勇.ppt 传智播客-Jdbc-李勇.ppt 传智播客-Jdbc-李勇.ppt
总的来说,“01_传智播客JDBC_jdbc的理论概述”应该涵盖了JDBC的基本概念、核心组件的使用以及如何在实际项目中应用JDBC进行数据库操作。通过深入学习这个课程,开发者将能够熟练掌握数据库编程,为后续的Java Web...
标题中的“02_传智播客JDBC_编写一个简单的jdbc例子程序”表明这是一个关于Java数据库连接(JDBC)的教程,由传智播客提供,内容可能涉及如何使用JDBC来执行基本的数据库操作。描述和标签与标题一致,暗示这个压缩包...
【标题】"传智播客JDBC_所有源码与ppt"是一个教育机构传智播客发布的关于Java数据库连接(JDBC)技术的教学资源集合。这个压缩包包含了讲解JDBC的PPT演示文稿和相关的源代码示例,旨在帮助学习者深入理解和掌握JDBC...
方立勋老师的"传智播客jdbc详解ppt"系列讲座,深入浅出地介绍了JDBC的相关概念和技术,是学习JDBC的宝贵资源。 在JDBC中,我们首先需要了解的是**数据库驱动**,它是连接Java程序与数据库的桥梁。Java应用程序通过...
这份“传智播客讲解JDBC的PPT”应该是该机构在教授Java数据库编程时使用的教学材料,涵盖了JDBC的基础知识和实践技巧。 PPT可能包括以下几个主要知识点: 1. **JDBC API概述**:介绍JDBC API的基本概念,包括JDBC...
花了1W大洋的传智播客北京班java SSH绝密培训资料,包括XML JSP JDBC Oracle Servlet Ajax Spring Struts2的所有PPT,由于文件太大,分为XML JSP JDBC Oracle Servlet Ajax Spring Struts2,首发绝对真实超值!...
"传智播客jdbc"的主题显然聚焦于通过JDBC API获取和理解数据库的元数据信息。数据库元数据是描述数据库结构、属性和约束的数据,包括表、列、索引、视图等的详细信息。以下将详细阐述这个主题的相关知识点。 1. **...
【标题】"传智播客 李勇老师 JDBC代码全部和ppt" 提供的是一个关于JDBC编程的全面学习资源,由知名教育机构传智播客的讲师李勇主讲。JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的...
应用程序通过JDBC API来与数据库进行通信,而JDBC API则调用相应的数据库驱动,数据库驱动负责与特定数据库系统的交互。 【连接数据库的步骤】 1. **注册驱动**:通常使用`Class.forName("com.mysql.jdbc.Driver")`...
本资源包“49-传智播客 jdbc 所有资源和ppt”显然是一个针对Java JDBC技术的教程集合,包括源代码和PPT演示文稿,旨在帮助学习者深入理解并掌握Java数据库编程的基本概念和实践技巧。 首先,JDBC是Java中的核心API...
《传智播客成都中心蔡世友JavaScript面向对象及ExtJS基础教程》2.79G 《2010传智播客struts2.1.8视频教程》1.09G 《EJB3.0视频教程》180M 《JDBC视频教程》664M 《jpa详解视频教程》165M 《spring2.5视频教程》365M ...
1. **驱动程序**:JDBC驱动程序是Java代码和数据库之间的桥梁,主要有四种类型:JDBC-ODBC桥接驱动、本地API驱动、网络纯Java驱动和二进制兼容驱动。每种类型的驱动程序在性能和实现方式上都有所不同。 2. **数据库...
本教程“49_传智播客JDBC_所有源码与ppt.rar”是一个全面的JDBC学习资源包,包含了一系列的源代码示例和配套的PPT讲解,旨在帮助开发者深入理解JDBC的工作原理和应用技巧。 首先,我们要明确JDBC的核心概念。JDBC是...
在这个"传智播客崔希凡JavaWeb-day19JDBC第三天"教程中,崔希凡老师深入浅出地讲解了如何使用JDBC(Java Database Connectivity)进行数据库操作,特别是DBUtil工具类的运用以及JDBC实战案例。 首先,DBUtil是...
传智播客JDBC_所有源码与ppt Java培训教程教学课件 传智播客SCM手把手开发文档 传智播客内部数据库教学资料及上课笔记 张孝祥javaweb高级PPT 张孝祥JavaWEB课堂PPT AJAX技术入门.ppt itcast_hibernate.ppt itcast_...
标题“传智播客2016spring资料4”揭示了这是一份关于Spring框架的教育资料,特别关注的是2016年传智播客教学课程中的第四天内容。传智播客是一家知名的IT教育机构,其课程通常深入浅出,适合初学者和有一定经验的...