JDBC专题(四)-JDBC封装工具类

1.为什么要封装工具类

在实际JDBC的使用中,存在着大量的重复代码:例如连接数据库、关闭数据库等这些操作!!
急需把传统的JDBC代码进行重构,抽象出一个通用的JDBC工具类!以后连接任何数据库,操作任何表都可以使用这个工具类来简化开发!!!

2.工具类代码

/**
 * @author bruceliu
 * @time 2019年4月2日上午9:59:27
 * @Description JDBC操作的工具类,有一个传统的名字:BaseDao.java , 有些程序喜欢取别的名字: JDBCUtils.java
 * Base:基础的
 * Dao:数据库访问层  
 */
public class BaseDao {

	private Connection conn=null; //连接对象
	private PreparedStatement ps=null; //执行SQL对象
	private ResultSet rs=null; //结果集
	
	/**
	 * 01-打开数据库连接
	 */
	private void openConn(){
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/filmdb?useUnicode=true&characterEncoding=utf-8","root", "123");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 02-通用的执行增删改的方法
	 * 
	 * String sql="update stars set name=?,age=?,birthday=?,sex=? where id=?";
	 * Object[] params={"张三",18,"2010-10-10","男",1};
	 * 
	 * String sql="insert into stars values (null,?,?,?,?,?,?)";
	 * Object[] params={"张三",18,"2010-10-10","冬季热","男","34534531534543534543543"};
	 * 
	 * String sql="delete from stars where id=?";
	 * Object[] params={2};
	 */
	public int myexecuteUpdate(String sql,Object[] params){
		this.openConn();//打开数据库连接
		try {
			ps=conn.prepareStatement(sql);
			//有参数
			if(params!=null){
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i+1, params[i]);
				}
			}
			return ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			this.closConn();//关闭数据库
		}
		return 0;
	}
	
	/**
	 * 03-通用的执行查询的方法
	 * 
	 * String sql="select * from stars where age>? and id<?";
	 * Object[] parms={18,5};
	 * 
	 * @return
	 */
	public ResultSet myexecuteQuery(String sql,Object[] parms){
		this.openConn();
		try {
			ps=conn.prepareStatement(sql);
			if(parms!=null){
				for (int i = 0; i < parms.length; i++) {
					ps.setObject(i+1, parms[i]);
				}
			}
			rs=ps.executeQuery();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//查询的此处不能提前关闭数据库。不然话结果集合没法遍历
		}
		return rs;
	}
	
	
	/**
	 * 03-关闭数据库
	 */
	protected void closConn(){
		try {
			if(rs!=null){
				rs.close();
			}
			if(ps!=null){
				ps.close();
			}
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

3.工具类测试

/**
 * @author bruceliu
 * @time 2019年4月2日上午10:40:05
 * @Description 测试工具类 Java中有一个测试工具 单元测试:Junit
 */
public class TestBaseDao extends BaseDao {

	/*
	 * 01-测试新增数据库 表示这个方法是一个测试方法
	 */
	@Test
	public void testAdd() {
		String sql = "insert into stars values (null,?,?,?,?,?,?)";
		Object[] params = { "张三", 18, "2010-10-10", "冬季热", "男", "345345345433" };
		int count = this.myexecuteUpdate(sql, params);
		System.out.println(count > 0 ? "新增成功" : "新增失败");
	}

	/*
	 * 02-测试更新
	 */
	@Test
	public void testUpdate() {
		String sql = "update stars set name=?,age=?,birthday=?,sex=? where id=?";
		Object[] params = { "张三", 18, "2010-10-10", "男", 1 };
		int count = this.myexecuteUpdate(sql, params);
		System.out.println(count > 0 ? "更新成功" : "更新失败");
	}

	/*
	 * 03-测试删除
	 */
	@Test
	public void testDelete() {
		String sql = "delete from stars where id=?";
		Object[] params = { 1 };
		int count = this.myexecuteUpdate(sql, params);
		System.out.println(count > 0 ? "删除成功" : "删除失败");
	}

	/*
	 * 04-测试查询所有
	 */
	@Test
	public void testQueryAll() {
		try {
			String sql = "select * from stars";
			ResultSet rs = this.myexecuteQuery(sql, null); // null表示没有参数
			while (rs.next()) {
				int id = rs.getInt(1);
				String name = rs.getString(2);
				int age = rs.getInt(3);
				String birthday = rs.getString(4);
				String works = rs.getString(5);
				String sex = rs.getString(6);
				String idcard = rs.getString(7);
				System.out.println(id + "\t" + name + "\t" + age + "\t" + birthday + "\t" + works + "\t" + sex + "\t" + idcard);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.closConn();
		}
	}

	/*
	 * 05-带条件查询
	 */
	@Test
	public void testQuery1() {
		try {
			String sql = "select * from stars where age>=? and id<=?";
			Object[] params = { 4, 5 };
			ResultSet rs = this.myexecuteQuery(sql, params); // null表示没有参数
			while (rs.next()) {
				int id = rs.getInt(1);
				String name = rs.getString(2);
				int age = rs.getInt(3);
				String birthday = rs.getString(4);
				String works = rs.getString(5);
				String sex = rs.getString(6);
				String idcard = rs.getString(7);
				System.out.println(id + "\t" + name + "\t" + age + "\t" + birthday + "\t" + works + "\t" + sex + "\t" + idcard);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.closConn();
		}
	}
}

4.工具类优化

在src目录下创建jdbc.properties 文件
如果不想使用原来的数据库,需要修改java源码,可以将连接的4个要素配置到配置文件中,然后用java代码来读取配置文件。这样就不需要修改源代码,而仅仅修改配置文件即可,配置文件一般使用.properties文件

4.1.jdbc.properties文件里面的内容
url=jdbc:mysql://127.0.0.1:3306/web10?useUnicode=true&characterEncoding=UTF-8
username=root
password=root
driverName=com.mysql.jdbc.Driver

注意:书写属性的时候,不要书写双引号和空格。

4.2.最终版工具类

静态块中完成的功能:
1、读取外部的配置文件(读取properties)
2、把properties的内容 赋值 到 当前变量 例如 url = prop.getProperty(“url”);
3、加载驱动

/**
 * @author bruceliu
 * @time 2019年4月2日上午9:59:27
 * @Description JDBC操作的工具类,有一个传统的名字:BaseDao.java , 有些程序喜欢取别的名字: JDBCUtils.java
 * Base:基础的
 * Dao:数据库访问层  
 */
public class BaseDao {

	private Connection conn=null; //连接对象
	private PreparedStatement ps=null; //执行SQL对象
	private ResultSet rs=null; //结果集
	
	private static String driverClass;
	private static String url;
	private static String username;
	private static String password;
	
	static{
		//静态代码块,性能高,只加载一次!
		try {
			Properties p=new Properties();
			p.load(BaseDao.class.getClassLoader().getResourceAsStream("jdbc.properties"));
			driverClass=p.getProperty("driverClass");
			url= p.getProperty("url");
			username= p.getProperty("username");
			password= p.getProperty("password");
			Class.forName(driverClass);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 01-打开数据库连接
	 */
	private void openConn(){
		try {
			conn=DriverManager.getConnection(url,username,password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 02-通用的执行增删改的方法
	 * 
	 * String sql="update stars set name=?,age=?,birthday=?,sex=? where id=?";
	 * Object[] params={"张三",18,"2010-10-10","男",1};
	 * 
	 * String sql="insert into stars values (null,?,?,?,?,?,?)";
	 * Object[] params={"张三",18,"2010-10-10","冬季热","男","34534531534543534543543"};
	 * 
	 * String sql="delete from stars where id=?";
	 * Object[] params={2};
	 */
	public int myexecuteUpdate(String sql,Object[] params){
		this.openConn();//打开数据库连接
		try {
			ps=conn.prepareStatement(sql);
			//有参数
			if(params!=null){
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i+1, params[i]);
				}
			}
			return ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			this.closConn();//关闭数据库
		}
		return 0;
	}
	
	/**
	 * 03-通用的执行查询的方法
	 * 
	 * String sql="select * from stars where age>? and id<?";
	 * Object[] parms={18,5};
	 * 
	 * @return
	 */
	public ResultSet myexecuteQuery(String sql,Object[] parms){
		this.openConn();
		try {
			ps=conn.prepareStatement(sql);
			if(parms!=null){
				for (int i = 0; i < parms.length; i++) {
					ps.setObject(i+1, parms[i]);
				}
			}
			rs=ps.executeQuery();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//查询的此处不能提前关闭数据库。不然话结果集合没法遍历
		}
		return rs;
	}
	
	
	/**
	 * 03-关闭数据库
	 */
	protected void closConn(){
		try {
			if(rs!=null){
				rs.close();
			}
			if(ps!=null){
				ps.close();
			}
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫-IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值