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

18 篇文章 2 订阅

前言


    说道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到了吗?



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值