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)实现。
例如:
//不同的数据库提供的驱动包是不一样的,在下面大家将会看到常用的驱动类。 |
Class.forName("com.mysql.jdbc.Driver") ; |
System.out.println("成功加载驱动"); |
}catch(ClassNotFoundException e){ |
System.out.println("找不到驱动程序类 ,加载驱动失败!"); |
-
成功加载后,会将Driver类的实例注册到DriverManager类中,我们在下一步中,就可以直接调用类中的方法。
2、提供JDBC连接的URL
•连接URL定义了连接数据库时的协议、子协议、数据源标识。
•书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
下面列出常用的数据库连接URL:
Oracle8/8i/9i数据库(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); |
String url="jdbc:oracle:thin:@localhost:1521:orcl"; |
-
DB2数据库
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); |
String url="jdbc:db2://localhost:5000/sample"; |
-
Sql Server7.0/2000数据库
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); |
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; |
-
Sybase数据库
Class.forName("com.sybase.jdbc.SybDriver").newInstance(); |
String url =" jdbc:sybase:Tds:localhost:5007/myDB"; |
-
Informix数据库
Class.forName("com.informix.jdbc.IfxDriver").newInstance(); |
String url ="jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; |
-
MySQL数据库
Class.forName("com.mysql.jdbc.Driver").newInstance(); |
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" |
-
PostgreSQL数据库
Class.forName("org.postgresql.Driver").newInstance(); |
String url ="jdbc:postgresql://localhost/myDB" |
-
说明:useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为gb2312或GBK,本参数必须设置为true 。aracterEncoding=gbk:字符编码方式。
3、创建数据库的连接
•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
•使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
例如:
String url = "jdbc:mysql://localhost:3306/test" ; |
String username = "root" ; |
String password = "root" ; |
DriverManager.getConnection(url , username , password ) ; |
System.out.println("数据库连接失败!"); |
-
也可以不单独定义上面username和password,直接将用户名、密码附加在url上,作为参数发送给数据库服务器,例如
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实例实现。
具体的实现方式:
Statement stmt = con.createStatement() ; |
PreparedStatement pstmt = con.prepareStatement(sql) ; |
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):用于执行返回多个结果集、多个更新计数或二者组合的
语句。
具体实现的代码:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; |
int rows = stmt.executeUpdate("INSERT INTO ...") ; |
boolean flag = stmt.execute(String sql) ; |
-
6、处理结果
两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:
String name = rs.getString("name") ; |
String pass = rs.getString(1) ; // 此方法比较高效 |
-
(列是从左到右编号的,并且从列1开始)
7、关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(stmt != null){ // 关闭声明 |
if(conn != null){ // 关闭连接对象 |
-
三、JDBC应用示例实验
实验使用mysql数据库,使用myeclipse工具新建一个类,命名为 JDBCTest,可以使用Navicat for MySQL可视化数据库操作,新建数据库users,在数据库users里添加 表user_table( UserId,UserName,PassWord)),有三个字段,本示例主要用于演示数据库连接,连接成功后,插入一条数据。具体内容如下
* @throws ClassNotFoundException |
public static void main(String[] args) throws ClassNotFoundException, SQLException { |
//第一步:打开数据库 需要用户名,密码,数据库地址,数据库名称; |
String username = "root"; |
String password = "123456"; |
String url = "jdbc:mysql://localhost:3306/users"; |
Class.forName("com.mysql.jdbc.Driver"); |
Connection conn = DriverManager.getConnection(url, username, password); |
System.out.println("数据库连接成功!"); |
String sql=" insert into user_table ( UserId,UserName,PassWord) values (5,'song','ss') "; |
PreparedStatement pt=conn.prepareStatement( sql ); |
System.out.println("数据库操作成功!"); |
-
更多关于数据库的操作,如增删改查,参考网友sererin写的如下代码,很详细:
<PRE class=java name="code">package chp07; |
import java.sql.Connection; |
import java.sql.DriverManager; |
import java.sql.ResultSet; |
import java.sql.SQLException; |
import java.sql.Statement; |
public static void main(String[] args) { |
public static void insert() { |
conn = getConnection(); // 首先要获取连接,即连接到数据库 |
String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" |
+ " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插入数据的sql语句 |
st = (Statement) conn.createStatement(); // 创建用于执行静态sql语句的Statement对象 |
int count = st.executeUpdate(sql); // 执行插入操作的sql语句,并返回插入数据的个数 |
System.out.println("向staff表中插入 " + count + " 条数据"); //输出插入操作的处理结果 |
} catch (SQLException e) { |
System.out.println("插入数据失败" + e.getMessage()); |
/* 更新符合要求的记录,并返回更新的记录数目*/ |
public static void update() { |
conn = getConnection(); //同样先要获取连接,即连接到数据库 |
String sql = "update staff set wage='2200' where name = 'lucy'";// 更新数据的sql语句 |
st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量 |
int count = st.executeUpdate(sql);// 执行更新操作的sql语句,返回更新数据的个数 |
System.out.println("staff表中更新 " + count + " 条数据"); //输出更新操作的处理结果 |
} catch (SQLException e) { |
System.out.println("更新数据失败"); |
public static void query() { |
conn = getConnection(); //同样先要获取连接,即连接到数据库 |
String sql = "select * from staff"; // 查询数据的sql语句 |
st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量 |
ResultSet rs = st.executeQuery(sql); //执行sql查询语句,返回查询数据的结果集 |
System.out.println("最后的查询结果为:"); |
while (rs.next()) { // 判断是否还有下一个数据 |
String name = rs.getString("name"); |
int age = rs.getInt("age"); |
String sex = rs.getString("sex"); |
String address = rs.getString("address"); |
String depart = rs.getString("depart"); |
String worklen = rs.getString("worklen"); |
String wage = rs.getString("wage"); |
System.out.println(name + " " + age + " " + sex + " " + address |
+ " " + depart + " " + worklen + " " + wage); |
} catch (SQLException e) { |
System.out.println("查询数据失败"); |
public static void delete() { |
conn = getConnection(); //同样先要获取连接,即连接到数据库 |
String sql = "delete from staff where name = 'lili'";// 删除数据的sql语句 |
st = (Statement) conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量 |
int count = st.executeUpdate(sql);// 执行sql删除语句,返回删除数据的数量 |
System.out.println("staff表中删除 " + count + " 条数据\n"); //输出删除操作的处理结果 |
} catch (SQLException e) { |
System.out.println("删除数据失败"); |
public static Connection getConnection() { |
Connection con = null; //创建用于连接数据库的Connection对象 |
Class.forName("com.mysql.jdbc.Driver");// 加载Mysql数据驱动 |
con = DriverManager.getConnection( |
"jdbc:mysql://localhost:3306/myuser", "root", "root");// 创建数据连接 |
System.out.println("数据库连接失败" + e.getMessage()); |
return con; //返回所建立的数据库连接 |
<P><STRONG>项目部署到服务器,然后运行结果:</STRONG></P> |
-
- JAVA通过JDBC连接Oracle数据库详解【转载】
JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- java用JDBC连接MySQL数据库的详细知识点
想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...
- JAVA连接各种数据库详解
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...
- Java使用JDBC连接MySQL数据库
1.引用 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...
- 使用JDBC连接操作数据库
JDBC简介 Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDBC ...
- 【转】Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Java 通过JDBC连接Mysql数据库的方法和实例
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
随机推荐
- 关于vis标记
原来写题目的时候对vis标记都是先memset在标记,今天看见一个只要每次对T值修改,然后看看等不等于T就可以了,真好!
- Python同时向控制台和文件输出日志logging的方法 Python logging模块详解
Python同时向控制台和文件输出日志logging的方法http://www.jb51.net/article/66756.htm 1 #-*- coding:utf-8 -*- 2 import ...
- jquery实现复选框全选反选
实现原理: 给所有的复选框取相同的名字,当点击全选的时候把chenked属性全部设置为true;当点击全不选的时候把checked属性设置为false; 源代码如下: html代码: <form ...
- div弹出登录窗口
<meta charset="utf-8"/> <script type="text/javascript"> //弹出式登录 func ...
- flask开发restful api系列(5)-短信验证码
我们现在开发app,注册用户的时候,不再像web一样,发送到个人邮箱了,毕竟个人邮箱在移动端填写验证都很麻烦,一般都采用短信验证码的方式.今天我们就讲讲这方面的内容. 首先,先找一个平台吧.我们公司找 ...
- Leakcanary
一.什么是内存泄漏 垃圾回收器无法回收应被回收的对象比如:在Activity生命周期过程中,旋转屏幕时应新建activity,原activity应被销毁.但如果线程一直在引用此activity,则会出 ...
- IOS多线程 总结 -------------核心代码(GCD)
//NSObject //在子线程中执行代码 // 参数1: 执行的方法 (最多有一个参数,没有返回值) //参数2: 传递给方法的参数 [self performSelectorInBackgrou ...
- BZOJ1628: [Usaco2007 Demo]City skyline
1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 256 Solved: 210[Su ...
- Linux企业级项目实践之网络爬虫(4)——主程序流程
当我们设计好程序框架之后就要开始实现它了.第一步当然是要实现主程序的流程框架.之后我们逐渐填充每个流程的细节和其需要调用的模块. 主程序的流程如下: 1. 解析命令行参数,并根据参数跳转到相应的处理 ...
- Centos 6.5中安装后不能打开emacs的问题
问题的发现过程: 安装了最新的centos版本后发现居然打不开emacs,然后在终端中输入emacs后还是不能打开,出现了下面的提示: emacs: error while loading share ...