JavaWeb学习-JDBC系列-7-封装一个DB工具类

我们前面在多个单元测试用例的时候,每个用例里都需要写加载驱动,创建连接,创建执行sql的stmt对象,创建结果集rs对象。这些很多重复的代码,我们可以提出来,写成一个静态工具类。这样,在使用的时候看起来很简洁。

1.我们尝试提取出来的连接数据库方法效果

我在项目src下创建一个com.anthony.utils的包,然后在这个包下创建DBUtils.java文件。

package com.anthony.utils;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtils {
	//得到连接的方法
	public static Connection getConnection() throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		return conn;
	}
}

我们第一次抽取成这样,其实效果达到了,只是还不够完美。因为,我们数据库连接信息和驱动文件随时都可能发生改变,但是,这里我们采用硬编码,直接写死,这个是不合理。所以,下面我们来看看提取数据库连接信息到配置文件的效果。

2.采用配置文件保存数据库信息的优化效果

我首先在src下新建一个dbinfo.properties文件,写入下面这些内容。

classDriver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydatabase
user=root
password=123456

有了配置文件,我们继续优化连接数据库方法。

package com.anthony.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DBUtils {
	private static String classDriver;
	private static String url;
	private static String user;
	private static String password;
	
	static {
		Properties pro = new Properties();
		InputStream in = DBUtils.class.getResourceAsStream("/dbinfo.properties");
		try {
			pro.load(in);
			classDriver = pro.getProperty("classDriver");
			url = pro.getProperty("url");
			user = pro.getProperty("user");
			password = pro.getProperty("password");
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			Class.forName(classDriver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//得到连接的方法
	public static Connection getConnection() throws Exception{
		return DriverManager.getConnection(url, user, password);
	}
	
	//关闭资源方法
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null; //赶紧垃圾回收
		}
		if(stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
}

我写了一个测试类来测试下上面使用InputStream读取properties文件代码对不对。

package demo;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

import com.anthony.utils.DBUtils;

public class CURD {
	
	@Test
	public void testSelect() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			conn = DBUtils.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery("SELECT * FROM student");
			while (rs.next()) {
				System.out.println(
						rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4));
			} 
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

我这边能打印查询内容,这种写法是没问题,唯一有点就是读取propeties文件这块有点啰嗦,下面我们换ResourceBundle类来读取properties文件会简单很多。

3.使用ResourceBundle类来获取配置文件key的value

这里我们来学习一个新的类,这个ResourceBundle是在G11n(国际化)开发中必须使用到的一个类。做过国际化测试的人应该知道,一个String,先是有英文,然后会翻译成日语,法语,德育,中文等不同本地化语言,靠的就是不同语言版本的资源文件。

package com.anthony.utils;

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 DBUtils {
	private static String classDriver;
	private static String url;
	private static String user;
	private static String password;
	
	static {
		// 用于加载properties文件
		ResourceBundle rb = ResourceBundle.getBundle("dbinfo"); //注意这里不需要文件扩展名.properties
		classDriver = rb.getString("classDriver");
		url = rb.getString("url");
		user = rb.getString("user");
		password = rb.getString("password");
		
		try {
			Class.forName(classDriver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//得到连接的方法
	public static Connection getConnection() throws Exception{
		return DriverManager.getConnection(url, user, password);
	}
	
	//关闭资源方法
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null; //赶紧垃圾回收
		}
		if(stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
}

使用了ResourceBundle类加载properties文件之后,代码少了好几行,以后如果需要Java解析properties文件,建议使用这个,这个也很好记住,比那个InputStream好记多了。DBUtils工具类封装好了,下一篇,我们来写四个Junit单元测试用例,也就是SQL的CURD,增删改查四个用例。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package com.hexiang.utils.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.log4j.Logger; public class DBConnection { /** * 获得与数据库的连接 * * @param path * @return Connection */ public static Connection getConn(String classDriver, String url, String user, String pwd) { try { Class.forName(classDriver); return DriverManager.getConnection(url, user, pwd); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } public static Connection getConn(DataSource dataSource) { try { return dataSource.getConnection(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } public static Connection getConn(String jndiName) { try { Context ctx; ctx = new InitialContext(); DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/" + jndiName); return dataSource.getConnection(); } catch (NamingException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } public static Connection getConn(Properties properties) { try { String driver = properties.getProperty("jdbc.driverClassName"); String url = properties.getProperty("jdbc.url"); String user = properties.getProperty("jdbc.username"); String password = properties.getProperty("jdbc.password"); Class.forName(driver); return DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } return null; } /** * oracle连接 * * @param path * @return Connection */ public static Connection getOracleConn(String

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值