JDBC连接数据库的技术演进

JDBC连接数据库的技术演进

帅宏军

1.下载sqlserver驱动程序

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

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

3.创建Jdbc测试类

packagecn.uhj.jdbc; 

importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement; 
importorg.junit.Test;
 
public class JdbcTest {      
       @Test
       public void TestJdbc() throwsClassNotFoundException, SQLException{
              //1、加载sqlserver数据库驱动
              DriverManager.registerDriver(new SQLServerDriver());
             
              //2、创建数据库连接
              Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.1.6:1433;DatabaseName=CpadLine", "sa", "123");
             
              //3、创建状态
              Statement state =con.createStatement();
             
              //4、查询数据库并返回结果
              ResultSet result =state.executeQuery("select * from Member.UserBasicInfo");
             
              //5、输出查询结果
              while(result.next()){
                     System.out.println(result.getString("email"));
              }
             
              //6、关闭数据库
              result.close();
              state.close();
              con.close();
             
       }
}


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

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

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
       // 这是静态代码块,在类加载时运行,这里已经完成了驱动的加载
       static {
              try {
                     java.sql.DriverManager.registerDriver(new Driver());
              } catch (SQLException E) {
                     throw newRuntimeException("Can't register driver!");
              }
       }
 
 
       public Driver() throws SQLException {
              // Required forClass.forName().newInstance()
       }
}


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

 public void TestJdbc() throwsClassNotFoundException, SQLException{
              //1、通过反射机制加载sqlserver驱动对象
              Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
             
              //2、创建数据库连接
              Connection con = DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
             
              //3、创建状态
              Statement state =con.createStatement();
             
              //4、查询数据库并返回结果
              ResultSet result =state.executeQuery("select * from users");
             
              //5、输出查询结果
              while(result.next()){
                     System.out.println(result.getString("email"));
              }
             
              //6、关闭数据库
              result.close();
              state.close();
              con.close();             
       }

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

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

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

2)数据更换为mysql或者oracle

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

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

       DRIVERCLASS= com.microsoft.sqlserver.jdbc.SQLServerDriver
       URL= jdbc:sqlserver://192.168.2.6:1433
       USER=sa
       PWD=123

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

package cn.uhj.jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle; 
import org.junit.Test;
 
 
public class JdbcTest {
    private static final String DRIVERCLASS;
    private static final String URL;
    private static final String USER;
    private static final String PWD;
 
    static {
        ResourceBundlebundle = ResourceBundle.getBundle("dbconfig");
        DRIVERCLASS =bundle.getString("DRIVERCLASS");
        URL = bundle.getString("URL");
        USER = bundle.getString("USER");
        PWD = bundle.getString("PWD");
    }  
       
    @Test
    public void TestJdbc() throws ClassNotFoundException,SQLException{
        //1、通过反射机制加载sqlserver驱动对象
        Class.forName(DRIVERCLASS);
       
        //2、创建数据库连接
        Connectioncon = DriverManager.getConnection(URL, USER, PWD);
       
        //3、创建状态
        Statementstate = con.createStatement();
       
        //4、查询数据库并返回结果
        ResultSetresult = state.executeQuery("select * from users");
       
        //5、输出查询结果
        while(result.next()){
            System.out.println(result.getString("email"));
        }
       
        //6、关闭数据库
        result.close();
        state.close();
        con.close();       
    } 
}

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

转载请注明出处:http://blog.csdn.net/shuaihj/article/details/14002129


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值