JDBC连接数据库概述

一、JDBC基础知识

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。

1、跨平台运行:这是继承了Java语言的“一次编译,到处运行”的特点;

2、不受数据库供应商的限制:巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发人员通过SQL调用数据库和处理结果,而不需要考虑数据库的提供商;另一个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利用JDBC API创建Java程序和数据源之间的桥梁。应用程序只需要编写一次,便可以移到各种驱动程序上运行。Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就可以被识别,就可以正常工作。所以JDBC不受数据库供应商的限制。

JDBC API可以作为连接Java应用程序与各种关系数据库的纽带,在带来方便的同时也有负面影响,以下是JDBC的优、缺点。优点如下:

操作便捷:JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数;

可移植性强:JDBC支持不同的关系数据库,所以可以使同一个应用程序支持多个数据库的访问,只要加载相应的驱动程序即可;

通用性好:JDBC-ODBC桥接驱动器将JDBC函数换成ODBC;

面向对象:可以将常用的JDBC数据库连接封装成一个类,在使用的时候直接调用即可。

缺点如下:

访问数据记录的速度受到一定程度的影响;

更改数据源困难:JDBC可支持多种数据库,各种数据库之间的操作必有不同,这就给更改数据源带来了很大的麻烦

二、JDBC连接数据库的流程及其原理

创建一个以JDBC连接数据库的程序,包含7个步骤:

1、加载JDBC驱动程序:

在连接数据库之前,首先要加载想要连接的数据库的驱动,就是数据库厂商提供的jar包,将它加载到JVM(Java虚拟机)中,这通过java.lang.Class类的静态方法forName(String className)实现。

例如:

01
try{
02
 
03
//加载MySql的驱动类 
04
//不同的数据库提供的驱动包是不一样的,在下面大家将会看到常用的驱动类。
05
Class.forName("com.mysql.jdbc.Driver") ; 
06
System.out.println("成功加载驱动");
07
 
08
}catch(ClassNotFoundException e){
09
 
10
System.out.println("找不到驱动程序类 ,加载驱动失败!");
11
 
12
e.printStackTrace() ;
13
 
14
}

成功加载后,会将Driver类的实例注册到DriverManager类中,我们在下一步中,就可以直接调用类中的方法。

2、提供JDBC连接的URL

•连接URL定义了连接数据库时的协议、子协议、数据源标识。

•书写形式:协议:子协议:数据源标识

协议:在JDBC中总是以jdbc开始

子协议:是桥连接的驱动程序或是数据库管理系统名称。

数据源标识:标记找到数据库来源的地址与连接端口。

下面列出常用的数据库连接URL:

Oracle8/8i/9i数据库(thin模式)

1
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
2
String url="jdbc:oracle:thin:@localhost:1521:orcl";
3
//orcl为数据库的SID

DB2数据库

1
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
2
String url="jdbc:db2://localhost:5000/sample";
3
//sample为你的数据库名

Sql Server7.0/2000数据库

1
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
2
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
3
//mydb为数据库

Sybase数据库

1
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
2
String url =" jdbc:sybase:Tds:localhost:5007/myDB";
3
//myDB为你的数据库名

Informix数据库

1
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
2
String url ="jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;

MySQL数据库

1
Class.forName("com.mysql.jdbc.Driver").newInstance();
2
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
3
//myDB为数据库名

PostgreSQL数据库

1
Class.forName("org.postgresql.Driver").newInstance();
2
String url ="jdbc:postgresql://localhost/myDB"
3
//myDB为数据库名

说明:useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为gb2312或GBK,本参数必须设置为true 。aracterEncoding=gbk:字符编码方式。

3、创建数据库的连接

•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。

•使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。

例如:

01
String url = "jdbc:mysql://localhost:3306/test" ;
02
 
03
String username = "root" ;
04
 
05
String password = "root" ;
06
 
07
try{
08
 
09
Connection con =
10
 
11
DriverManager.getConnection(url , username , password ) ;
12
 
13
}catch(SQLException se){
14
 
15
System.out.println("数据库连接失败!");
16
 
17
se.printStackTrace() ;
18
 
19
}

也可以不单独定义上面username和password,直接将用户名、密码附加在url上,作为参数发送给数据库服务器,例如

1
jdbc:mysql://localhost:3306/test?user=root&password=root

4、创建一个Statement

•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3

种类型:

1、执行静态SQL语句。通常通过Statement实例实现。

2、执行动态SQL语句。通常通过PreparedStatement实例实现。

3、执行数据库存储过程。通常通过CallableStatement实例实现。

具体的实现方式:

1
Statement stmt = con.createStatement() ; 
2
PreparedStatement pstmt = con.prepareStatement(sql) ; 
3
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ; 

5、执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate

和execute

1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句

,返回一个结果集(ResultSet)对象。

2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或

DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等

3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的

语句。

具体实现的代码:

1
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; 
2
int rows = stmt.executeUpdate("INSERT INTO ...") ; 
3
boolean flag = stmt.execute(String sql) ; 

6、处理结果

两种情况:

1、执行更新返回的是本次操作影响到的记录数。

2、执行查询返回的结果是一个ResultSet对象。

• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些

行中数据的访问。

• 使用结果集(ResultSet)对象的访问方法获取数据:

1
while(rs.next()){
2
 
3
String name = rs.getString("name") ;
4
 
5
String pass = rs.getString(1) ; // 此方法比较高效
6
 
7
}

(列是从左到右编号的,并且从列1开始)

7、关闭JDBC对象

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声

明顺序相反:

1、关闭记录集

2、关闭声明

3、关闭连接对象

01
if(rs != null){ // 关闭记录集
02
 
03
try{
04
     rs.close() ;
05
 
06
}catch(SQLException e){
07
 
08
     e.printStackTrace() ;
09
 
10
}   }
11
 
12
if(stmt != null){ // 关闭声明
13
 
14
try{
15
 
16
stmt.close() ;
17
 
18
}catch(SQLException e){
19
 
20
e.printStackTrace() ;
21
}     }
22
 
23
if(conn != null){ // 关闭连接对象
24
 
25
try{
26
 
27
conn.close() ;
28
 
29
}catch(SQLException e){
30
 
31
e.printStackTrace() ;
32
 
33
}    }
34

三、JDBC应用示例实验

实验使用mysql数据库,使用myeclipse工具新建一个类,命名为 JDBCTest,可以使用Navicat for MySQL可视化数据库操作,新建数据库users,在数据库users里添加 表user_table( UserId,UserName,PassWord)),有三个字段,本示例主要用于演示数据库连接,连接成功后,插入一条数据。具体内容如下

01
import java.sql.*;
02
public class JDBCTest {
03
 
04
/**
05
* @param args
06
* @throws ClassNotFoundException 
07
* @throws SQLException 
08
*/
09
public static void main(String[] args) throws ClassNotFoundException, SQLException {
10
//第一步:打开数据库 需要用户名,密码,数据库地址,数据库名称;
11
String username = "root";
12
String password = "123456";
13
 
14
String url = "jdbc:mysql://localhost:3306/users";
15
//1.加载数据库驱动
16
Class.forName("com.mysql.jdbc.Driver");
17
//2.创建是数据库连接
18
Connection conn = DriverManager.getConnection(url, username, password);
19
 
20
System.out.println("数据库连接成功!");
21
//第二步:操作数据库;
22
String sql=" insert into user_table ( UserId,UserName,PassWord) values (5,'song','ss') ";
23
PreparedStatement pt=conn.prepareStatement( sql );
24
pt.executeUpdate( );
25
//第三步:关闭数据库;
26
conn.close();
27
System.out.println("数据库操作成功!");
28
 
29
}
30
 
31
}

更多关于数据库的操作,如增删改查,参考网友sererin写的如下代码,很详细:

001

002
<PRE class=java name="code">package chp07;
003
 
004
import java.sql.Connection;
005
import java.sql.DriverManager;
006
import java.sql.ResultSet;
007
import java.sql.SQLException;
008
import java.sql.Statement;
009
 
010
public class JDBC_Test {
011
 // 创建静态全局变量
012
 static Connection conn;
013
 
014
 static Statement st;
015
 
016
 public static void main(String[] args) {
017
 insert(); //插入添加记录
018
 update(); //更新记录数据
019
 delete(); //删除记录
020
 query(); //查询记录并显示
021
 }
022
 
023
 /* 插入数据记录,并输出插入的数据记录数*/
024
 public static void insert() {
025
 
026
 conn = getConnection(); // 首先要获取连接,即连接到数据库
027
 
028
 try {
029
 String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"
030
 + " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插入数据的sql语句
031
 
032
 st = (Statement) conn.createStatement(); // 创建用于执行静态sql语句的Statement对象
033
 
034
 int count = st.executeUpdate(sql); // 执行插入操作的sql语句,并返回插入数据的个数
035
 
036
 System.out.println("向staff表中插入 " + count + " 条数据"); //输出插入操作的处理结果
037
 
038
 conn.close(); //关闭数据库连接
039
 
040
 } catch (SQLException e) {
041
 System.out.println("插入数据失败" + e.getMessage());
042
 }
043
 }
044
 
045
 /* 更新符合要求的记录,并返回更新的记录数目*/
046
 public static void update() {
047
 conn = getConnection(); //同样先要获取连接,即连接到数据库
048
 try {
049
 String sql = "update staff set wage='2200' where name = 'lucy'";// 更新数据的sql语句
050
 
051
 st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量
052
 
053
 int count = st.executeUpdate(sql);// 执行更新操作的sql语句,返回更新数据的个数
054
 
055
 System.out.println("staff表中更新 " + count + " 条数据"); //输出更新操作的处理结果
056
 
057
 conn.close(); //关闭数据库连接
058
 
059
 } catch (SQLException e) {
060
 System.out.println("更新数据失败");
061
 }
062
 }
063
 
064
 /* 查询数据库,输出符合要求的记录的情况*/
065
 public static void query() {
066
 
067
 conn = getConnection(); //同样先要获取连接,即连接到数据库
068
 try {
069
 String sql = "select * from staff"; // 查询数据的sql语句
070
 st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量
071
 
072
 ResultSet rs = st.executeQuery(sql); //执行sql查询语句,返回查询数据的结果集
073
 System.out.println("最后的查询结果为:");
074
 while (rs.next()) { // 判断是否还有下一个数据
075
 
076
 // 根据字段名获取相应的值
077
 String name = rs.getString("name");
078
 int age = rs.getInt("age");
079
 String sex = rs.getString("sex");
080
 String address = rs.getString("address");
081
 String depart = rs.getString("depart");
082
 String worklen = rs.getString("worklen");
083
 String wage = rs.getString("wage");
084
 
085
 //输出查到的记录的各个字段的值
086
 System.out.println(name + " " + age + " " + sex + " " + address
087
 + " " + depart + " " + worklen + " " + wage);
088
 
089
 }
090
 conn.close(); //关闭数据库连接
091
 
092
 } catch (SQLException e) {
093
 System.out.println("查询数据失败");
094
 }
095
 }
096
 
097
 /* 删除符合要求的记录,输出情况*/
098
 public static void delete() {
099
 
100
 conn = getConnection(); //同样先要获取连接,即连接到数据库
101
 try {
102
 String sql = "delete from staff  where name = 'lili'";// 删除数据的sql语句
103
 st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量
104
 
105
 int count = st.executeUpdate(sql);// 执行sql删除语句,返回删除数据的数量
106
 
107
 System.out.println("staff表中删除 " + count + " 条数据\n"); //输出删除操作的处理结果
108
 
109
 conn.close(); //关闭数据库连接
110
 
111
 } catch (SQLException e) {
112
 System.out.println("删除数据失败");
113
 }
114
 
115
 }
116
 
117
 /* 获取数据库连接的函数*/
118
 public static Connection getConnection() {
119
 Connection con = null; //创建用于连接数据库的Connection对象
120
 try {
121
 Class.forName("com.mysql.jdbc.Driver");// 加载Mysql数据驱动
122
 
123
 con = DriverManager.getConnection(
124
 "jdbc:mysql://localhost:3306/myuser", "root", "root");// 创建数据连接
125
 
126
 } catch (Exception e) {
127
 System.out.println("数据库连接失败" + e.getMessage());
128
 }
129
 return con; //返回所建立的数据库连接
130
 }
131
}
132
</PRE><BR>
133
<PRE></PRE>
134
<P></P>
135
<P><STRONG>项目部署到服务器,然后运行结果:</STRONG></P>
136
<P></P>
137
<PRE></PRE>
138
<PRE></PRE>
139
<PRE></PRE>
140

JAVA采用JDBC连接操作数据库详解的更多相关文章

  1. JAVA通过JDBC连接Oracle数据库详解【转载】

    JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...

  2. ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库

    1.MySQL存储过程   1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if  while)等等 的sql语句   1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...

  3. java用JDBC连接MySQL数据库的详细知识点

    想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...

  4. JAVA连接各种数据库详解

    Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...

  5. Java使用JDBC连接MySQL数据库

    1.引用 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...

  6. 使用JDBC连接操作数据库

    JDBC简介 Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDBC ...

  7. 【转】Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  8. Java 通过JDBC连接Mysql数据库的方法和实例

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  9. Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

随机推荐

  1. [Mugeda HTML5技术教程之1] HTML5: 生存还是毁灭

    [Mugeda HTML5技术教程] 开篇: HTML5 - 生存,还是毁灭 摘要:HTML5并不试图解决所有问题.但是在很多适合的场合,HTML5是不二选择. To be, or not to be ...

  2. python文件_读取

    1.文件的读取和显示 方法1: f=open(r'G:\2.txt') print f.read() f.close() 方法2: try: t=open(r'G:\2.txt') print t.r ...

  3. laravel实现发送qq邮件

    首先修改config/mail.php 'from' => [ 'address' => 'hello@example.com', 'name' => 'Example', ], 修 ...

  4. 那年曾让我哭笑不得抓狂的C语言

    1.关于+=以及-= 这是两个运算符,但你否有过这种经历: int temp; char i ;i<MAX;i++) { ... temp=+; //这里本意是每次循环,temp都自增2,但是却 ...

  5. BOT、BT、PPP形式介绍(2)

    BT1.什么是BT     BT投资是BOT的一种变换形式,即Build-Transfer(建设—转让),政府通过特许协议,引入国外资金或民间资金进行专属于政府的基础设施建设,基础设施建设完工后,该项 ...

  6. 【Latex】怎么写中文?

    最近总有这么几种情况:一.作业很简单,想用Latex敲,但是英语不过硬,用中文吧配中文环境就要配置半天.二.越来越多的朋友问我怎么搞中文输入,我也确实没啥帮助人家的好办法,所以只好自己研究研究怎么配置 ...

  7. Bugscan学习笔记------关于urlparse

    urlparse模块主要是把url拆分为6部分,并返回元组.并且可以把拆分后的部分再组成一个url.主要有函数有urljoin.urlsplit.urlunsplit.urlparse等. ***** ...

  8. html p标签换行问题

    /*p标签自动换行*/ p{ word-wrap:break-word; word-break:normal; } /*p强制不换行*/ p{ white-space:nowrap; } /*块级元素 ...

  9. c语言通过时间种子产生随机数并选出最大值以及下标

    1 #include <stdio.h> #include <stdlib.h> #include <time.h> //2016 10 10 void main( ...

  10. c指针点滴三(指针运算)

    #include <stdio.h> #include <stdlib.h> void main3() { ; int *p = &num; p++;//不可预测的值 ...