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