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