您的位置:首页 > 数据库

看JDBC轻松连接数据库,你值得拥有

2016-02-28 11:34 295 查看

前言

    说道JDBC,是不是感觉很熟悉呢?哪里用到过呢?猜对了,我们曾经在学习SQL Server时曾经用过ODBC。二者有什么不同呢?又猜对了,没有什么大的不同。在Java中,连接数据库是利用JDBC提供的接口实现的。这又是为什么呢?详情请看下面分析。

什么是JDBC

    说到什么是JDBC,应该先说说咱们比较熟悉的ODBC。

    ODBC:Open DataBase Connectivity,开放的数据库连接,提供了强大的对数据库访问的API,我们可以直接将SQL语句传给ODBC,也可以通过可视化界面配置。

    JDBC:Java DataBase Connectivity,是Java的数据库连接,为Java提供了访问数据库的API,使用方便操作简单。

JDBC连接数据库

    还记得ODBC是怎么连接数据库的吗?首先选择ODBC驱动,然后配置要连接的数据库信息,测试成功后即可连接。那么JDBC呢?其实过程是一样的。

1、加载JDBC驱动程序

    JDBC也是需要驱动程序的,所以首先要加载JDBC驱动。加载驱动程序有不同的方式,可以通过写代码的方式,也可以在xml文件中进行配置。最后将驱动程序加载到JVM中,使用DriverManager的getConnectin(String url , String username ,String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。

 

写代码的方式:

//连接MySql数据库,用户名和密码都是root   
String url = "jdbc:mysql://localhost:3306/test" ;    
String username = "root" ;   
String password = "root" ;   
try{   
  Connection con = DriverManager.getConnection(url , username , password );   
}catch(SQLException se){   
   System.out.println("数据库连接失败!");   
  se.printStackTrace() ;   
}


xml文件配置:

<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@localhost:orcl</url>
<user-name>drp1</user-name>
<password>system</password>
</db-info>
</config>


2、提供JDBC连接的URL

    JDBC连接数据库必须要有数据库的地址,URL可以理解为地址,但是在Web开发中,URL一般认为是资源请求。也就是说,必须得有数据库资源,有到达数据库资源的路径才能到达数据库。

    连接URL定义了数据库连接串的协议、子协议、数据源标识,也就是连接串的规范。

    协议:连接串总是以jdbc开头

    子协议:表示驱动程序或数据库管理系统名称

    数据源标识:标记数据库的来源地址和端口

jdbc:mysql://localhost:3306/test?use Unicode=true & characterEncoding=gbk; useUnicode=true

    jdbc是连接串的协议开头,mysql是驱动程序,后面紧接着是数据库地址和端口以及数据库名称,Unicode表示是否使用字符集,characterEncoding表示编码方式。

3、创建数据库连接

    上面的准备工作做好后,就要创建数据库连接了。在ODBC中,我们曾经用到对数据库访问,开启多个连接,如果用完没有立马关闭,就会造成资源浪费的问题,在JDBC连接数据库这里依然存在。JDBC创建数据库连接,需要向java.sql.DriverManager请求并获得Connection对象,一个Connection代表一个数据库连接。

String url = "jdbc:oracle://localhost:1521/orcl" ;    
String username = "drp1" ;   
String password = "system" ;   
try{   
  Connection conn = DriverManager.getConnection(url , username , password );   
}catch(SQLException e){   
  System.out.println("数据库连接失败!");   
  e.printStackTrace() ;   
}

    在数据库访问过程中,会经常用到数据库连接的开和关,也有Statement对象的开和关,所以我们会添加一个工具类,这个类中引入java.sql.DriverManager包,封装数据库的常用操作。其实工具类中不止包含Connection和Statement的操作,也可以封装对事务的操作。

package com.bjpowernode.drp.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
* 封装数据库常用操作
* @author Fy-
*
*/
public class DbUtil {
/**
* 取得Connection
* @return
*/
public static Connection getConnection(){
Connection conn=null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:orcl";
String username="Scott";
String password="tiger";
conn = DriverManager.getConnection(url,username,password);
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return conn;
}

public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

public static void close(Statement pstmt){
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

public static void close(ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

public static void beginTransaction(Connection conn){
try{
if(conn != null){
if(conn.getAutoCommit()){
conn.setAutoCommit(false);
}
}
}catch(SQLException e){

}
}

public static void commitTransaction(Connection conn){
try{
if(conn != null){
if(conn.getAutoCommit()){
conn.commit();
}
}
}catch(SQLException e){

}
}

public static void rollbackTransaction(Connection conn){
try{
if(conn != null){
if(conn.getAutoCommit()){
conn.rollback();
}
}
}catch(SQLException e){

}
}

public static void resetConnection(Connection conn){
try{
if(conn != null){
if(conn.getAutoCommit()){
conn.setAutoCommit(false);
}else{
conn.setAutoCommit(true);
}
}
}catch(SQLException e){

}
}

public static void main(String[] args){
System.out.println(DbUtil.getConnection());

}
}


4、Statement操作

    要执行SQL语句,必须得有java.sql.Statement实例,Statement实例分为以下三种类型:

(1)、执行静态SQL语句,通常用Statement实例实现;

Connection conn = null;
Statement stmt = null;
conn = DriverManager.getConnection();
stmt = conn.prepareStatement(sql);


(2)、执行动态SQL语句,通常用PreparedStatement实例实现;

Connection conn = null;
PreparedStatement pstmt = null;
conn = DriverManager.getConnection();
pstmt = conn.createStatement();


(3)、执行存储过程,通常用CallableStatement实例实现;

CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;


关于这三者的详细讲解,请看下篇博客。

    接下来就是执行sql语句,Statement提供三种执行方法,executeQuery、executeUpdate和execute。

ResultSet executeQuery(String sql):执行查询类的sql语句,返回一个ResultSet结果集对象;

int executeQuery(String sql):用于执行Insert、Update、Delete类型的操作,返回一个影响行数;

execute(String sql):用于执行返回多个结果集、多个更新行数或者二者组合的sql语句。

String sql = "select count(*) from t_client where client_id=?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
boolean flag = false;
conn = DbUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, clientId);
rs = pstmt.executeQuery();


    执行完sql语句,就要对sql语句的执行结果进行处理,处理结果包括两种情况,一是返回操作的行数,二是返回查询的ResultSet对象。ResultSet对象就像当前项目中用的List泛型,是用来承接符合sql语句的所有查询结果行,但是二者实质是不同的。对操作行数的处理比较简单,就不介绍了。对ResultSet结果集操作,一般是循环结果集,取出里面每一列数据。

rs = pstmt.executeQuery();
if (rs.next()) {
client = new Client();
client.setId(rs.getInt("id"));
client.setPid(rs.getInt("pid"));
client.setName(rs.getString("name"));
client.setClientId(rs.getString("client_id"));

//分销商级别
ClientLevel clientLevel = new ClientLevel();
clientLevel.setId(rs.getString("client_level_id"));
clientLevel.setName(rs.getString("client_level_name"));
client.setClientLevel(clientLevel);

client.setBankAcctNo(rs.getString("bank_acct_no"));
client.setContactTel(rs.getString("contact_tel"));
client.setAddress(rs.getString("address"));
client.setZipCode(rs.getString("zip_code"));
client.setIsClient(rs.getString("is_client"));
client.setIsLeaf(rs.getString("is_leaf"));
}


5、关闭JDBC对象

    操作完成以后,要关闭所有使用的JDBC对象,释放资源。声明时是从大到小,先声明连接对象Connection,然后是声明Statement,最后是记录集ResultSet。关闭顺序恰好相反,先关闭结果集,然后是关闭声明,最后再关闭连接对象。

if(rs != null){   // 关闭记录集   
try{   
   rs.close() ;   
}catch(SQLException e){   
   e.printStackTrace() ;   
}   
}   
if(stmt != null){   // 关闭声明   
  try{   
    stmt.close() ;   
}catch(SQLException e){   
    e.printStackTrace() ;   
  }   
}  
if(conn != null){  // 关闭连接对象   
  try{   
    conn.close() ;   
}catch(SQLException e){   
    e.printStackTrace() ;   
  }   
}

Java中为什么不用ODBC?

    最大的原因是ODBC没有提供适合Java用的数据库连接的API,而JDBC是提供的纯属供Java用的API。具体的原因,还没有理解那么深入。如果有比较深入了解的,希望您不吝赐教。

总结

    JDBC是站在巨人肩膀上的一个很好的体现,在学习了ODBC的基础上,更容易理解JDBC是如何连接数据库的。事物都是由规律性的,也就是有模板可循,如果能抽出这个模板来,代码少了很多之后,再去看它就会越看越简单,这也是总结的艺术所在吧。JDBC连接数据库介绍完了,这个技能你Get到了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdbc