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