Oracle的学习三:java连接Oracle、事务、内置函数、日期函数、转换函数、系统函数
1.java程序操作Oracle
- java连接Oracle
- JDBC_ODBC桥连接
1.加载驱动:
Class.forName("sun.jdbc.odbc.JdbcodbcDriver");
2.得到连接:(和SQL Server一样)
首先,引用数据包: import java.sql.*;
连接: Connection ct=DriverManager.getConnection("jdbc:odbc:testds","用户名","密码"); 需配置数据源,数据源名称设为:testds
3.下面和SQL Server一摸一样:
创建执行状态对象: Statement sm =ct.createStatement();
查询的结果集: ResultSet rs =sm.executeQuery("select * from emp");
取得数据: rs.getString(字段序号,从1开始);
4.关闭各种资源:
rs.close();
sm.close();
ct.close();
解释:JDBC_ODBC不能远程连接。
- JDBC
1.加载驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
2.得到连接:(和SQL Server一样)
首先,引用数据包: import java.sql.*;
连接: Connection ct=DriverManager.getConnection("jdbc:orcle:thin:@127.0.0.1:1521:myOrcl","用户名","密码");
3.下面和SQL Server一摸一样:
创建执行状态对象: Statement sm =ct.createStatement();
查询的结果集: ResultSet rs =sm.executeQuery("select * from emp");
取得数据: rs.getString(字段序号,从1开始);
4.关闭各种资源:
rs.close();
sm.close();
ct.close();
注意:JDBC能远程连接,并且需要引用jdbc驱动。
- Java实现分页
--以下是在JSP中实现的代码:
<h2>数据分页</h2>
<table>
<tr><td>UserName</td><td>Salary</td></tr>
<%
Connection ct =null;
Statement sm=null;
ResultSet rs=null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
ct =DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myOrcl", "scott", "scott");
sm =ct.createStatement();
//
String s_pageNow = (String)request.getParameter("newPage");
int pageNow =1;
if(s_pageNow !=null)
{
pageNow =Integer.parseInt(s_pageNow);
}
//
int pageCount =0;
int recordCount =0;
int pageSize =3;
rs = sm.executeQuery("select count(*) from emp");
if(rs.next())
{
recordCount =rs.getInt(1);
if(recordCount%pageSize ==0)
{
pageCount =recordCount/pageSize;
}
else
{
pageCount =recordCount/pageSize + 1;
}
}
rs =sm.executeQuery("select * from (select a1.*, rownum RN from (select * from emp) a1 where rownum<="+ pageSize*pageNow +") where RN>=" + (pageSize*(pageNow-1)+1));
while(rs.next())
{
out.println("<tr><td>" + rs.getString(2) +"</td><td>" + rs.getDouble(6)+ "</td><tr>");
}
out.println("</table>");
//
for(int i=1; i<pageCount; i++)
{
out.print("<a href=myTest.jsp?newPage=" + i + "> [" + i + "] </a>");
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
rs.close();
sm.close();
ct.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
%>
</body>
2.Oracle中的事务处理
数据存储的逻辑单位是数据块,数据操作的逻辑单位是事务。
事务---用户定义的一组操作序列,由一组相关的DML语句组成,是数据库应用程序的基本逻辑单位。用于保证数据的一致性,该组的DML语句要么全部成功,要么全部失败。事务管理技术主要包括数据库的恢复技术和并发控制技术。
- 事务和锁
当执行事务操作时,Oracle会在被作用的表上加锁,防止其他用户更改表的结构。事务中的SQL语句只限于DML命令,而DDL、DCL语句时不能会回退的。
- 事务控制
- 事务的开始与结束
Oracle是没有"开始事务处理"的语句。
事务开始:连接到数据库,并开始执行第一条DML语句;当前一个事务结束或者执行一条会自动提交事务的语句;
事务结束:执行一条commit语句或rollback语句时;执行一条会自动提交事务的语句时;执行一条DML语句,却该语句失败了会自动回退。
回退部分事务(rollback to savapoint)不会终止一个事务,也不会开始下一个事务。
事务自动提交:执行一条DDL语句;执行一条DCL语句;断开与数据库的连接(disconnect、exit、关闭sqlplus、意外关闭);
sql *plus中可以设置自动提交功能: set autocommit on/off;
- 设置事务
- 提交事务
执行commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁。当使用commit语句结束事务后,其他会话将可以查看到事务变化后的新数据。exit也会自动提交。
- 回退事务
回退全部事务:当执行rollback时,可以回退全部事务。 rollback;
回退部分事务:
ex:保存点--事务中的中间标志,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。
设置保存点:savepoint aa;(可以创建多个保存点)
回退到aa保存点: rollback to aa; (确保事务没有被commit,commit后所有保存点会删除)
- java程序中如何使用事务 Connection ct=null;
设置不自动提交事务: ct.setAutoCommit(false);
无异常时提交事务: ct.commit();
异常时事务回滚: ct.rollback();
- 只读事务
只读事务是指只允许执行查询的操作,而不允许执行任何其它DML操作的事务,使用只读事务可以确保用户只能取得某个时间点的数据。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不能取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
设置只读事务: set transaction read only;
- 事务的状态与性质
事务的状态:事务初态、活动状态、失败状态、终止状态、提交状态。
事务的性质: ACID属性
原子性(不可分割的逻辑单位)、一致性(操作前后逻辑上的一致性)、隔离性(一个事务内部操作的数据对其他事务是隔离的。脏读、不可重复读、幻像)、持久性(一旦提交成功,永久保存)。
3.SQL函数的使用
Oracle中的dual表是一个虚拟的表,它有一行一列,所有人是sys,可供所有用户使用,但是不能插入数据。
- 单行字符函数
ASCII(c)
--返回c的首字符在ASCII码中对应的十进制
char(n)
--返回十进制ASCII码n对应的字符
concat(c1,c2)
--返回将c2添加到c1后面而形成的字符串。
initcap(c)
--返回将c的每个首字符都大写,其它字符都小写的字符串。单词之间以空格等分界。
instr(c1,c2[, n[, m]]
-- 在c1中从n开始搜索c2第m次出现的位置,并返回该位置数字。若n为负数,则搜索从右向左进行,但位置数字仍按从左到右计算。
length(c)
-- 返回字符串c的长度,包括所有的后缀空格,c=null,则值为null。
lower(char)
-- 将字符串转化为小写的格式。
lpad(c1,n[,c2])
--在c1的左边填充c2,使之总长度为n。c2默认为空格。若c1>n,返回c1的左边n个字符。
ltrim(c1[,c2])
--去掉c1左边所包含的c2中的任何字符,直至遇到不是c2的字符结束,返回剩余的字符串,c2默认是空格。
nanvl(x,value)
--如果x匹配NaN(非数字),则返回value,否则返回x
nvl(x,value)
--如果x为NULL(空),就返回value,否则返回x
nvl2(x,value1,value2)
--如果x为NULL(空),就返回value1,否则返回value2
replace(c1,c2[,c3])
--把c1中出现的c2都替换成c3,返回剩余的字符串。c3默认为null。
rpad(c1,n[,c2])
--在c1的右边填充c2,使之总长度为n。c2默认为空格。若c1>n,返回c1的右边n个字符。
rtrim(c1[,c2])
--去掉c1右边所包含的c2中的任何字符,直至遇到不是c2的字符结束,返回剩余的字符串,c2默认是空格
substr(c,m,n)
-- 取字符串c的子串(从第m个开始(1,2...),长度为n的字符串)。
translate(c1,c2,c3)
--把c1中的所有在c2中出现的字符用c3来代替,返回替换后的c1。c1,c2,c3任何一个为null,值为null;
upper(char)
-- 将字符串转化为大写的格式。
- 单行数学函数
介绍:数学函数的输入和返回值的数据类型都是数字类型,数学函数包括cos、cosh、exp、ln、log、sin、sinh、sqrt、tan、tanh、acos、asin、atan、round等。三角函数用于处理角度。
abs(n)
--返回数字n的绝对值
acos(n)
--返回数字的反余弦值
asin(n)
--返回数字的反正弦值
atan(n)
--返回数字的正切值
atan2(x,y)
--返回x/y的正切值,y不能为0
cos(n)
--返回数字的反余弦值
cosh(n)
--返回数字的双反余弦值
ceil(n)
--返回大于或等于n的最小整数。
注:在Oracle测试,可以使用dual表(虚拟表、测试表)。
exp(n)
--返回e的n次幂
floor(n)
--返回小于或等于n的最大整数。
log(m,n)
--返回x的自然对数值
ln(x)
--返回对数值
mod(m,n)
--取模运算 m%n;n为0,则返回y
power(m,n)
--返回m的n次幂
round(n,[m])
--用于执行四舍五入,如果省掉m,则四舍五入到整数;如果m是整数,则四舍五入到小数点的m位后,如果时负数,则四舍五入到小数点的m位前。
sign(x)
--检测x的正负,如果x小于0,则返回-1;如果x大于0,则返回1;
sin(x)
--返回x的正弦值。
sinh(x)
--返回x的双正弦值。
sqrt(x)
--返回x的平方根,x>=0。
tan(x)
--返回x的正切值。
tanh(x)
--返回x的双正切值。
trunc(n,[m])
--用于截取数字。如果省掉m,就截取小数部分,如果m是正数,就截取到小数点的m位后,如果m是负数,则截取到小数点的前m位。
- 单行日期函数
介绍:用于处理date类型的数据
sysdate
--返回系统时间
add_months(d,n)
--在时间d的基础上,加n个月。
eg:返回入职时间大于8个月的纪录: sysdate>add_months(时间字段,8);
last_day(d)
--返回指定日期所在月份的最后一天。
- 转换函数
介绍:转换函数用于将数据类型从一种转换为另外一种,在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型。为提高可靠性,应使用转换函数。
to_char
日期转换:to_char(日期值或日期字段,'格式') eg:'yyyy-mm-dd hh24:mi:ss'
格式:yy:两位数字的年份;
yyyy:四位数字的年份;
mm:两位数字的月份;
dd:两位数字的天;
hh24:24小时制的小时数;
hh12:12小时制的小时数;
mi、ss:小时分钟/秒;
货币转换:to_char(货币值或货币字段, '格式'): eg:'L9,999.99'
格式:9:显示数字,并忽略前面0;
0:显示数字,如位数不足,则用0补齐;
.:在指定位置显示小数点;
$:在数字前显示美元符号;
L:在数字前加本机货币符号;
C:在数字前加国际货币符号;
G:在指定位置显示组分隔符;
D:在指定位置显示小数点符号(.);
to_date
函数to_date用于将字符串转换成date类型的数据。
- 系统函数
sys_context
(1) terminal --当前会话客户所对应的终端的标识符
(2) lanuage --语言
(3) db_name --当前数据库名称
(4) nls_date_format --当前会话客户所对应的日期格式
(5) session_user --当前会话客户所对应的数据库用户名
(6) current_schema --当前会话客户所对应的默认方案名
(7) host --返回数据库所在的主机的名称
eg: select sys_context('userenv', 'db_name') from dual;
- 用户和方案的关系:
建立一个用户的同时,数据库自动建立一个和用户名同名的方案,方案中存储用户的数据对象(表、视图、...)。
Oracle的学习三:java连接Oracle、事务、内置函数、日期函数、转换函数、系统函数的更多相关文章
- MySQL学习(三)——Java连接MySQL数据库
1.什么是JDBC? JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据 ...
- Java连接Oracle数据库的三种连接方式
背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...
- Java连接Oracle数据库常用方法
JDBC的六大步骤: 注册驱动 获取连接 获取执行sql语句对象 执行sql语句 处理结果集 关闭资源 oracle URL: jdbc:oracle:thin:@localhost:1521:SID ...
- java连接oracle数据库的实现代码
package connectionOracleDatabase; import java.sql.Connection; import java.sql.DatabaseMetaData; impo ...
- oracle入门(5)——java连接oracle数据库
[本文介绍] 前面几篇说了那么多,最终还没讲到如何用java连接数据库,本文实用一点,讲讲如何连接数据库. [java连接oracle数据库] 1.导入jdbc驱动:看到这里,就忙着上网找驱动?不,安 ...
- java连接Oracle数据库的操作说明
在测试中,我们常常需要连接Oracle数据库来进行查询对比.下面,我们就来看看,如何使用java代码来连接数据库,并且取出我们想要的数值. 首先,java中如果要连接Oracle数据库,需要jdbc的 ...
- java连接oracle jdbc连接
Class.forName("oracle.jdbc.driver.OracleDriver"); Connection ct=Driver.Magager.getConnecti ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- MySQL学习(一)——Java连接MySql数据库
MySQL学习(一)——Java连接MySql数据库 API详解: 获得语句执行 String sql = "Insert into category(cid, cname) values( ...
随机推荐
- Win8 URI 方案 ms-appX 用法大全
ms-appdata://可以引用来自应用的本地.漫游和临时数据文件夹中的应用文件ms-appdata:///local/hello/logo.png ms-appx://可以引用来自应用包的应用文件 ...
- mysql快速上手2
上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...
- DEDECMS中,会员中心的常用知识
会员中心 引入了member/config.php,即可用$cfg_ml->fields['face'].$cfg_ml->fields['spacesta']等
- PHP类的自动载入机制
php的自动加载: 在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,麻烦 php作者想简单点,最好能引用一个类 ...
- Python学习笔记1——人人都爱列表
一些BIF函数在列表中的应用: Python 3.3.4 (v3.3.4:7ff62415e426, Feb 10 2014, 18:13:51) [MSC v.1600 64 bit (AMD64) ...
- 基于Python的密码生成程序的优化
近期刚刚组织完内部的Python基础培训.GUI的开发培训,之后布置的作业是两人一组,利用前面所写的一些模块做一些小软件. 具体就是模拟Advanced Password Generator这个软件的 ...
- .NET Framework 3.5 安装错误:0x800F0906、0x800F081F、0x800F0907
使用Add-WindowsFeature 照成的问题 I get the failure below.. If I pick the Server 2012 R2 image from 8/15/2 ...
- vim使用手册
1. 关于Vim 1.1 Vim的几种模式 2. 启动Vim 3. 文档操作 4. 光标的移动 4.1 基本移动 4.2 翻屏 4.3 标记 5. 插入文本 5.1 基本插入 5.2 改写插入 6. ...
- c++迭代器(iterator)详解
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...
- 从零开始学ios开发(八):Autorotation and Autosizing
不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios. 这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容 ...