一、业务代码的优化:(使用创建数据库连接工具类)
- 将获取Connection的代码抽取
a.先抽取驱动,把驱动写在静态代码块中,提升运行效率,不用每次都加载驱动
b.在抽取getConnection的方法。放回Connection(获得的连接对象) - 将驱动等配置提取成配置文件
a.由于数据库的连接信息都是相同的,所有把数据库连接的参数信息抽取成配置文件,方便作为参数读取使用。(比如连接路径,数据库密码等)
b.读取配置文件有很多方法(主要知道的四种)//传统的读取方式,使用Properties对象的load方法读取
public void test1() throws Exception{
InputStream in = new FileInputStream("F:\\workspace\\android_web05\\src\\jdbc.properties");
Properties p = new Properties();
p.load(in);
System.out.println(p.get("driver"));
System.out.println(p.get("url"));
System.out.println(p.get("username"));
System.out.println(p.get("password"));
}
//由于路径在服务器端会时时变化,所以使用类的加载器动态获取路径
public void test2() throws Exception{
//类加载器:加载的是类路径的代码(.class字节码文件所在的目录)
String path = ReadFileDemo.class.getClassLoader().getResource("jdbc.properties").getPath();
System.out.println(path);
InputStream in = new FileInputStream(path);
Properties p = new Properties();
p.load(in);
System.out.println(p.get("driver"));
System.out.println(p.get("url"));
System.out.println(p.get("username"));
System.out.println(p.get("password"));
}
//这种方式和第2中方式相似,不过是直接通过类的加载器获得文件的输入流。
public void test3() throws Exception{
//类加载器:加载的是类路径的代码(.class字节码文件所在的目录)
InputStream in = ReadFileDemo.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties p = new Properties();
p.load(in);
System.out.println(p.get("driver"));
System.out.println(p.get("url"));
System.out.println(p.get("username"));
System.out.println(p.get("password"));
}
//通过创建ResourceBundle对象来读取配置文件,ResourceBundle底层也是封装了类的加载器专门读取配置文件使用,开发者一般使用这种方法,最为简单。
public void test4() throws Exception{
ResourceBundle rb = ResourceBundle.getBundle("jdbc");//这里直接写文件名,不用加扩展名
System.out.println(rb.getString("driver"));
System.out.println(rb.getString("username"));
System.out.println(rb.getString("password"));
System.out.println(rb.getString("url"));
}
- 关闭资源进行方法抽取
public static void close(Connection conn,Statement stmt,ResultSet rs){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
rs = null;
try {
if(stmt!=null){
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
stmt = null;
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn = null;
}
}
}
}
注意:需要判断连接是否为空,同时在finally里,把上一个try块中的对象置为空(null),已经本次try块中的对象关闭。
- 完整优化代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
public class JDBCUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static{
ResourceBundle rb = ResourceBundle.getBundle("jdbc");
driver = rb.getString("driver");
url = rb.getString("url");
username = rb.getString("username");
password = rb.getString("password");
}
static{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws Exception{
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
public static void close(Connection conn,Statement stmt,ResultSet rs){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
rs = null;
try {
if(stmt!=null){
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
stmt = null;
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn = null;
}
}
}
}
}
时间: 2024-10-15 13:23:00