java关系数据库

一、JDBC基础

JDBC是Java应用与数据库管理系统进行交互的标准API,包括两个包:核心API---java.sql和扩展的API---javax.sql。应用程序通过核心API的接口实现数据库连接和数据处理,其主要接口如下:























接口名称

功能

java.sql.Driver

驱动程序,连接应用程序和数据库,用于读取数据库驱动器的信息,提供连接方法,建立访问数据库所用的Connection对象。在加载某一Driver类时,它应该创建自己的实例并向DriverManager注册该实例。

java.sql.DriverManager

驱动程序管理器,管理一组Driver对象,对程序中用到的驱动程序进行管理,包括加载驱动程序、获得连接对象、向数据库发送信息。在调用getConnection方法时,DriverManager会试着从初始化时加载的那些驱动程序以及使用与当前
applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。

java.sql.Connection

连接Java数据库和Java应用程序之间的主要对象并创建所有的Statement对象。
不管对数据库进行什么样的操作,都需要创建一个连接,然后通过这个连接来完成操作。

java.sql.Statement

语句对象,代表了一个特定的容器,对一个特定的数据库执行SQL语句。用于执行静态SQL语句并返回它所生成结果的对象。在默认情况下,同一时间每个
Statement 对象在只能打开一个ResultSet对象。因此,如果读取一个 ResultSet
对象与读取另一个交叉,则这两个对象必须是由不同的Statement对象生成的。如果存在某个语句的打开的当前ResultSet对象,则Statement接口中的所有执行方法都会隐式关闭它。

PreparedStatement

表示预编译的SQL语句的对象。SQL语句被预编译并存储在PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。

java.sql.ResultSet

用于控制对一个特定语句的行数据的存取,也就是数据库中记录或行组成的集合。


二、结果集及其常见方法

1.
结果集有三种类型,它的类型决定了能否对结果集中的游标进行操作,以及并发的数据源的改变能否反映到结果集中。具体描述如下:














类型

描述

TYPE_FORWARD_ONLY

默认的结果集类型,这种类型的结果集对象的游标只能向前移动,从第1行的前面到最后一行的后面。

TYPE_SCROLL_INSENSITIVE

这种类型的结果集对象的游标可以向前移动,也可以直接定位到某一行上,但是对结果集中对应数据的变化是不敏感的。

TYPE_SCROLL_SENSITIVE

这种类型的结果集对象的游标可以向前移动,也可以直接定位到某一行上,并且对结果集中对应数据的变化是敏感的(如果)。

2.
结果集的并发性决定了结果集所支持的更新操作的层次,有两种并发性层次:












类型

描述

CONCUR_READ_ONLY

默认的结果集并发类型,这种情况下的结果集对象不支持更新操作。

CONCUR_UPDATABLE

这种情况下的结果集对象支持更新操作。

可以通过调用DatabaseMetaData的supportsResultSetConcurrency方法来看驱动是否支持结果集上的更新操作,该方法定义如下:




boolean
supportsResultSetConcurrency(int type,int concurrency) throws
SQLException

第一个数据表示结果集类型,第二个参数表示并发类型。

3.
结果集的延续性是指当事务提交时,在当前事务中创建的结果集是否关闭。默认情况下会关闭这个结果集对象。延续性可以通过如下两个静态属性来指定:












类型

描述

HOLD_CURSORS_OVER_COMMIT

当提交事务时不关闭该结果集对象。

CLOSE_CURSORS_AT_COMMIT

提交事务时关闭结果集对象,有时候会提高性能。

4.
结果集的类型、并发性和延续性可以通过Connection.createStatement、Connection.prepareStatement和Connection.prepareCall等方法指定,同时Statement、PreparedStatement和CallableStatement接口也提供了相应的setter方法和getter方法。如下代码是创建语句对象的时候指定结果集的类型、并发性和延续性。





Connection conn =
ds.getConnection(user,passwd);

Statement stmt =
conn.createStatement(ResultSet. TYPE_SCROLL_INSENSITIVE,

ResultSet.
CONCUR_READ_ONLY, ResultSet. CLOSE_CURSORS_AT_COMMIT);

5.
结果集常用的游标操作方法如下表所示:







































返回值

方法名

功能描述

boolean

next()

将游标从当前位置向前移一行,如果指向某行,返回true,如果指向最后一行的后面,返回false

boolean

previous()

将游标从当前位置向后移一行,如果指向某行,返回true,如果指向第一行的前面,返回false

boolean

first()

将游标移到此结果集的第一行。

boolean

last()

将游标移到些结果集的最后一行。

void

beforeFirst()

将游标移动到此结果集的开始处,正好位于第一行之前

void

afterLast()

将游标移动到此结果集的末尾,正好位于最后一行之后

boolean

relative(int
rows)

按相对行数移动游标。如果参数为0,游标无变化。如果参数是正的,游标向前移动rows行,如果rows太大,游标指向最后1条记录的后面。如果参数是负数,游标向后移动rows行,如果rows太小,游标指向第1条记录的前面。如果游标指向一个有效行,方法返回true,否则返回false

boolean

absolute(int
row)

将游标移动到参数所指定的行

6. 以下是示例代码:





//获取结果集中列的类型

ResultSet rs =
stmt.executeQuery(sqlString);

ResultSetMetaData rsmd
= rs.getMetaData();

int [] colType = new
int[ rsmd.getColumnCount() ];

for(int idx=0,int
col=1;idx<colType.length;idx++,col++)

colType[idx] =
rsmd.getColumnType(col);

//如果结果集支持更新操作,可以通过结果集完成更新、删除和插入操作。

Statement stmt =
conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);

ResultSet rs =
stmt.executeQuery(“select author from booklist where
isbn=111”);

rs.next();

rs.updateString(“author”,”JerryChoi”);

rs.updateRow();

//插入记录

ResultSet rs =
stmt.executeQuery(“select author,title,isbn from booklist”);

rs.moveToInsertRow();

//设置每一列的值

rs.updateString(1,”aaa”);

rs.updateString(2,”bbb”);

rs.updateLong(3,1234);

//插入一行

rs.insertRow();

rs.moveToCurrentRow();

//删除记录

rs.absolute(4);

rs.deleteRow();


三、连接数据库的基本过程

基本过程如下:

l 建立数据源

l 导入用到的包

l 加载驱动程序

l 创建与数据库的连接

l 创建语句对象

l 编写SQL语句

l 执行SQL语句

l 处理数据

l 关闭相关对象

l 处理异常

1. 建立数据源

假设已经存在名为bookstore的MySQL数据库。

2. 导入用到的包




import
java.sql.*;

3. 加载驱动程序




//如果驱动程序和名字是MyDriver,加载驱动程序的语句是:

Class.forName(“MyDriver”);

//或者

Class.forName(“MyDriver”).newInstance();

//本例中使用MySQL,刚加载的语句为:

Class.forName(“com.mysql.jdbc.Driver”);

4. 创建与数据库的连接

连接数据库需要知道如下信息:

l 数据库所在的主机,所使用的端口等

l 数据库的名字

l 用户信息,包括用户名和口令




//连接数据库的格式如下:

//constr:连接字符串;user:用户名;passwd:口令

Connection con =
DriverManager.getConnection(constr,user,passwd);

//MySQL数据库的连接示例如下:

Connection con =
DriverManager.getConnection(“jdbc:mysql://localhost:3306/bookstore”,”root”,”root”);

以下表格是常用的数据库驱动程序名字和URL格式:






































数据库

驱动程序

URL

Oracle

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@dbip:port:databasename

dbip :数据库服务器的
IP 地址,如果是本地可写 localhost 或 127.0.0.1 。

port :数据库的监听端口,需要看安装时的配置,缺省为
1521 。

databasename:数据库的
SID ,通常为全局数据库的名字。

SQL Server

com.microsoft.jdbc.sqlserver.SQLServerDriver

jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename

dbip :数据库服务器的
IP 地址,如果是本地可写 localhost 或 127.0.0.1 。

port :数据库的监听端口,需要看安装时的配置,缺省为
1433。

databasename:数据库的
SID ,通常为全局数据库的名字。

DB2

com.ibm.db2.jdbc.app.DB2Driver

jdbc:db2://dbip:port/databasename

dbip :数据库服务器的
IP 地址,如果是本地可写 localhost 或 127.0.0.1 。

port :数据库的监听端口,需要看安装时的配置。

databasename:数据库的
SID ,通常为全局数据库的名字。

Informix

com.informix.jdbc.IfxDriver

jdbc:infoxmix-sqli://dbip:port
/testDB:INFORMIXSERVER=
databasename;user=username;password=userpassword

dbip :数据库服务器的
IP 地址,如果是本地可写 localhost 或 127.0.0.1 。

port :数据库的监听端口,需要看安装时的配置。

databasename:数据库的
SID ,通常为全局数据库的名字。

user:用户名

password:用户口令

Sybase

com.sybase.jdbc.SybDriver

jdbc:sybase:Tds:dbip:port/databasename

dbip :数据库服务器的
IP 地址,如果是本地可写 localhost 或 127.0.0.1 。

port :数据库的监听端口,需要看安装时的配置。

databasename:数据库的
SID ,通常为全局数据库的名字。

MySQL

com.mysql.jdbc.Driver

org.gjt.mm.mysql.Driver

jdbc:mysql://dbip:port/databasename
[?param1=value1][&param2=value2]……

注:[] 是可选的选项

dbip :数据库服务器的IP地址,如果是本地可写成
localhost 或 127.0.0.1 。

port:数据库的监听端口,需要看安装时的配置,缺省为
3306。

databasename:数据库的
SID ,通常为全局数据库的名字。

param1、param2、value1和value2:附加参数,常见参数如下:

l user:用户名

l
password:密码

l
autoReconnect:联机失败时是否重新联机(true/false)

l
maxReconnect:尝试重新联机次数

l
initialTimeout:尝试重新联机间隔

l
maxRows:传回最大行数

l
useUnicode:是否使用Unicode编码(ture/false)

l
characterEncoding:何种编码

l
relaxAutocommit:是否自动提交(true/false)

l
capitalizeTypeNames:数据定义的名称以大写表示

PostgreSQL

org.postgresql.Driver

jdbc:postgresql://dbip:port/databasename

dbip :数据库服务器的IP地址,如果是本地可写成
localhost 或 127.0.0.1 。

port:数据库的监听端口,需要看安装时的配置。

databasename:数据库的
SID ,通常为全局数据库的名字。

Access

sun.jdbc.odbc.JdbcOdbcDriver

jdbc:odbc:datasourcename

datasourcename:数据库的 SID
,通常为全局数据库的名字。

注:该驱动只能工作在 Windows
系统中,首先需要在操作系统中建立一个可以访问 Access 数据库的本地数据源(ODBC) ,如果名字为 allandb ,那么 URL
写法如下:jdbc:odbc:allandb

5. 创建语句对象

语句对象的作业就是执行SQL语句。语句对象的创建是通过连接对象创建的,所以在创建语句对象之前应该确保连接对象已经创建。以下代码是创建语句对象的代码,不管连接什么数据库,不管执行什么样的操作,这句代码不用改:




Statement stmt =
con.createStatement();

6. 编写SQL语句

示例代码如下:




String sql = “select *
from usertable”;

7. 执行SQL语句

常用的执行SQL语句的方法有以下两个:














返回值

方法

说明

ResultSet

executeQuery(String
sql)

主要用于执行有结果集返回的SQL语句,典型的就是select查询语句。

int

executeUpdate(String
sql)

主要用于执行没有结果集返回的SQL语句,如果要在数据库中添加、修改或删除信息,它们都没有返回值,应该使用本方法。该方法的返回值是一个整数,表示影响数据库中记录的个数。

例如,要执行上面的查询语句,可以使用如下代码:




ResultSet rs =
stmt.executeQuery(sql);

8. 处理结果集

可参照上面的“结果集及其常见方法”

注:对行的遍历,使用结果集的next()方法。要获取某一列,可以使用getXXX(int
columnIndex)或getXXX(String columnLabel)方法。以下是示例代码:




//以字符串的形式获取第1列或字段名为username的列

String userid =
rs.getString(1);

String userName =
rs.getString(“username”);

9. 关闭相关对象

代码如下:




//应该按以下顺序关闭相关对象,该顺序与创建对象的顺序相反

//关闭结果集

rs.close();

//关闭语句

stmt.close();

//关闭连接

con.close();

10. 异常处理

使用以下框架对异常进行处理:





try{

……//要执行的可能出错的代码

}catch(Exception
e){

……//出错后的处理代码

}finally{

……//不管是否出错都要执行的代码

}

以下是综合示例代码:





String className =
“com.mysql.jdbc.Driver”;

String url =
“jdbc:mysql://localhost:3306/bookstore”;

String username =
“root”;

String userpass =
“root”;

String tableName =
“usertable”

Connection con =
null;

PreparedStatement pstmt
= null;

ResultSet rs =
null;

try{

Class.forName(className);

con =
DriverManager.getConnection(url,username,userpass);

pstmt =
con.prepareStatement(“select * from “ + tableName);

rs =
pstmt.executeQuery();

while(rs.next())

{

for(int
i=0;i<rs.getMetaDate().getColumnCount();++i)

System.out.println(rs.getString(i+1));

System.out.println();

}

}catch(Exception
e){

System.out.println(e.toString);

}finally{

try{
rs.close();}catch(Exception e){}

try{
pstmt.close();}catch(Exception e){}

try{
con.close();}catch(Exception e){}

}

时间: 2024-11-05 02:18:40

java关系数据库的相关文章

Dropwizard简单入门

Dropwizard:一个简洁的RESTful Web框架 Dropwizard跨越了开发库与框架的界限,旨在为Web应用所需的功能提供高性能.可靠的实现.Dropwizard将这些功能抽象为可重用的开发库,因此应用程序可以保持精简与专注,从而大大减少产品面世的时间以及维护负担. Jetty HTTP库 Web应用都离不开HTTP,Dropwizard使用Jetty HTTP库为项目嵌入HTTP服务器.与复杂的应用服务器不同,Dropwizard项目通过main方法加快HTTP服务器处理.在生产

linux开源论坛

开源资源: 开源http://oss.org.cn/?action-news http://www.lupaworld.com/proj.php http://www.10pig.cn/linux/opensource/开源中国:http://www.oschina.net/news开源吧:http://www.kaiyuanba.cn/http://www.enet.com.cn/opensource/list/index.jsp?_keyword_=Linux http://freeware

多对多关系数据库表 java描述

多对多关系 需要建立一张新表存放它们的对应数据 sql语句 1 create table teacher( 2 id int primary key, 3 name varchar(100), 4 money float(8,2) 5 ); 6 create table student( 7 id int primary key, 8 name varchar(100), 9 grade varchar(10) 10 ); 11 create table teacher_student( 12

一对一关系数据库表 java类描述

一对一关系中 从表的主键是 主表的外键 sql语句 1 create table person( 2 id int primary key, 3 name varchar(100) 4 ); 5 create table idcard( 6 id int primary key, 7 num varchar(20), 8 constraint person_id_fk foreign key(id) references person(id) 9 );View Code domain Perso

[Java面试八]Hibernate总结以及在面试中的一些问题.

1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. ②.Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM 实现.他很大程度的简化DAO层的编码工作 ③.hibernate 的性能非常好,因为它是个轻量级框架.映射的灵活性很出色.它支持各种关系数据库,从一对一到多对多的各种复杂关系. 开发流程 2.什么是延迟加载? 延迟加载机制是为了避免一

java面试题大全

java面试笔试题大汇总     第一,谈谈final, finally, finalize的区别. 最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 这个问得很少. 第五,HashMap和Hashtable的区

java RMI入门指南

感觉这篇文章不错,直接转了 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方式之中的一个.事实上它能够被看作是RPC的Java版本号.可是传统RPC并不能非常好地应用于分布式对象系统.而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信.实现远程对象之间的无缝远程调用. RMI眼下使用Java远程消息交换协议JRMP

[Java] SSH框架笔记_SSH三大框架的工作原理及流程

Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息3.通过config.buildSessionFactory();//创建SessionFactory4.sessionFactory.openSession();//打

42步进阶学习—让你成为优秀的Java大数据科学家!

作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备,机器学习,SQL数据科学等. 本文将这42步骤分为六个部分, 前三个部分主要讲述从数据准备到初步完成机器学习的学习过程,其中包括对理论知识的掌握和Python库的实现. 第四部分主要是从如何理解的角度讲解深入学习的方法.最后两部分则是关于SQL数据科学和NoSQL数据库. 接下来让我们走进这42步进