[学习笔记]JDBC连接数据库

JDBC连接数据库的技术演进

                                                                                                                                                         帅宏军

1.下载sqlserver驱动程序

    http://msdn.microsoft.com/zh-cn/data/aa937724.aspx

 

2.使用MyEclipse创建Web程序,在Lib中引用上面下载的sqljdbc4.jar驱动

 

3.创建Jdbc测试类

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. packagecn.uhj.jdbc;   
  2.   
  3. importjava.sql.Connection;  
  4. importjava.sql.DriverManager;  
  5. importjava.sql.ResultSet;  
  6. importjava.sql.SQLException;  
  7. importjava.sql.Statement;   
  8. importorg.junit.Test;  
  9.    
  10. public class JdbcTest {        
  11.        @Test  
  12.        public void TestJdbc() throwsClassNotFoundException, SQLException{  
  13.               //1、加载sqlserver数据库驱动  
  14.               DriverManager.registerDriver(new SQLServerDriver());  
  15.                
  16.               //2、创建数据库连接  
  17.               Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.1.6:1433;DatabaseName=CpadLine""sa""123");  
  18.                
  19.               //3、创建状态  
  20.               Statement state =con.createStatement();  
  21.                
  22.               //4、查询数据库并返回结果  
  23.               ResultSet result =state.executeQuery("select * from Member.UserBasicInfo");  
  24.                
  25.               //5、输出查询结果  
  26.               while(result.next()){  
  27.                      System.out.println(result.getString("email"));  
  28.               }  
  29.                
  30.               //6、关闭数据库  
  31.               result.close();  
  32.               state.close();  
  33.               con.close();  
  34.                
  35.        }  
  36. }  


4.研究MySql的Driver源码,优化数据库操作

   没有SqlServer下的源码,我们权且研究一下MySql的源码,来分析一下驱动加载的过程。      

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
  2.        // 这是静态代码块,在类加载时运行,这里已经完成了驱动的加载  
  3.        static {  
  4.               try {  
  5.                      java.sql.DriverManager.registerDriver(new Driver());  
  6.               } catch (SQLException E) {  
  7.                      throw newRuntimeException("Can't register driver!");  
  8.               }  
  9.        }  
  10.    
  11.    
  12.        public Driver() throws SQLException {  
  13.               // Required forClass.forName().newInstance()  
  14.        }  
  15. }  


       从上面的源码中我们可以看出,在静态代码块中,已经使用  DriverManager.registerDriver(new Driver());语句完成了驱动的加载,如果我们再调用一次DriverManager.registerDriver(new Driver());语句,则该语句执行了两次。那么如何规避这个问题呢?使用反射技术加载驱动。将代码重构如下:

      

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. public void TestJdbc() throwsClassNotFoundException, SQLException{  
  2.              //1、通过反射机制加载sqlserver驱动对象  
  3.              Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
  4.               
  5.              //2、创建数据库连接  
  6.              Connection con = DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer""sa""123");  
  7.               
  8.              //3、创建状态  
  9.              Statement state =con.createStatement();  
  10.               
  11.              //4、查询数据库并返回结果  
  12.              ResultSet result =state.executeQuery("select * from users");  
  13.               
  14.              //5、输出查询结果  
  15.              while(result.next()){  
  16.                     System.out.println(result.getString("email"));  
  17.              }  
  18.               
  19.              //6、关闭数据库  
  20.              result.close();  
  21.              state.close();  
  22.              con.close();               
  23.       }  

     

5.如何兼容数据库的更换

       使用上述代码时,发生下面两种需求变更,必然要修改代码。

       1)数据库的用户名和密码发生了变化

       2)数据更换为mysql或者oracle

 

       如何解决这个问题呢?使用配置文件技术:

      

       1)新建一个dbconfig.properties文件,内容清单如下:

       

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. DRIVERCLASS= com.microsoft.sqlserver.jdbc.SQLServerDriver  
  2. URL= jdbc:sqlserver://192.168.2.6:1433  
  3. USER=sa  
  4. PWD=123  

 

       2)重构数据库操作代码如下

[java]  view plain  copy  print ? 在CODE上查看代码片 派生到我的代码片
  1. package cn.uhj.jdbc;  
  2.    
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Statement;  
  8. import java.util.ResourceBundle;   
  9. import org.junit.Test;  
  10.    
  11.    
  12. public class JdbcTest {  
  13.     private static final String DRIVERCLASS;  
  14.     private static final String URL;  
  15.     private static final String USER;  
  16.     private static final String PWD;  
  17.    
  18.     static {  
  19.         ResourceBundlebundle = ResourceBundle.getBundle("dbconfig");  
  20.         DRIVERCLASS =bundle.getString("DRIVERCLASS");  
  21.         URL = bundle.getString("URL");  
  22.         USER = bundle.getString("USER");  
  23.         PWD = bundle.getString("PWD");  
  24.     }    
  25.          
  26.     @Test  
  27.     public void TestJdbc() throws ClassNotFoundException,SQLException{  
  28.         //1、通过反射机制加载sqlserver驱动对象  
  29.         Class.forName(DRIVERCLASS);  
  30.          
  31.         //2、创建数据库连接  
  32.         Connectioncon = DriverManager.getConnection(URL, USER, PWD);  
  33.          
  34.         //3、创建状态  
  35.         Statementstate = con.createStatement();  
  36.          
  37.         //4、查询数据库并返回结果  
  38.         ResultSetresult = state.executeQuery("select * from users");  
  39.          
  40.         //5、输出查询结果  
  41.         while(result.next()){  
  42.             System.out.println(result.getString("email"));  
  43.         }  
  44.          
  45.         //6、关闭数据库  
  46.         result.close();  
  47.         state.close();  
  48.         con.close();         
  49.     }   
  50. }  

经过重构的代码,没有显式使用数据库连接类型,用户名、密码等可能引起变化的数据。 通过修改配置文件,就可满足上述需求变更,而不需要修改代码。满足了系统灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值