前言
说道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
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() ;
}
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到了吗?