如何使用反射和抽象工厂模式来写JDBC

前两天正好学到JDBC,用普通的方法基于MySQL写了之后发现复用性非常差,如果更换数据库和表的话,基本还要重新写一遍,

于是就重温了一下抽象工厂模式和反射,通过这样写出来之后,代码的复用性大大提升,后期只需不断的新增每个表的DAO层操作,

就算变更数据库或者使用Oracle,SQLServer的话也只需要改改配置文件就行了

DataAccessFactory.java 这是最核心的类

package com.ljxt.demo5.dao;

import java.sql.Connection;

public class DataAccessFactory {
	
	/**
	 * 因为只是测试,所以直接写固定值,其实还可以通过配置文件获取参数
	 */
	/** 加载数据库连接的地址*/
	private static String db = "com.ljxt.demo5.dao.MySQLAccess";
	/** DAO层的地址*/
	private static String tab = "com.ljxt.demo5.dao.UserDao";
	/** 数据库url地址*/
	private static String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
	/** 数据库用户名*/
	private static String user = "root";
	/** 数据库密码*/
	private static String pwd = "root";
	
	/**
	 * 创建MySQL数据库的连接
	 * @return 返回连接到数据库的Connection对象
	 */
	public IDAO createMySQLConnection() {
		Connection conn = null;
		IDAO dao = null;
		try {
			Class<?> clsDb = Class.forName(db);
			conn = (Connection) clsDb.getMethod("createConnection", String.class, String.class, String.class).invoke(clsDb, url, user, pwd);
			Class<?> clsDao = Class.forName(tab);
			dao = (IDAO) clsDao.getConstructor(Connection.class).newInstance(conn);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dao;
	}
	
	/**
	 * 创建Oracle数据库的连接
	 * @return 返回连接到数据库的Connection对象
	 */
	public Connection createOracleConnection() {
		Connection conn = null;
		try {
			conn = null;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	 * 创建SQLServer数据库的连接
	 * @return 返回连接到数据库的Connection对象
	 */
	public Connection createSQLServerConnection() {
		Connection conn = null;
		try {
			conn = null;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}


MySQLAccess.java 这是用来和MySQL数据库连接和释放数据库资源的

package com.ljxt.demo5.dao;

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

public class MySQLAccess {
	
	// 注册驱动
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建数据库连接
	 * @param url 数据库url地址
	 * @param user 数据库用户名
	 * @param pwd 数据库密码
	 * @return 连接到数据库的Connection对象
	 */
	public static Connection createConnection(String url, String user, String pwd) {
		
		Connection conn = null;
		
		try {
			conn = DriverManager.getConnection(url, user, pwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return conn;
	}
	
	/**
	 * 释放数据库资源
	 * @param conn 数据库连接对象
	 * @param stmt 传输器对象
	 * @param rs 结果集对象
	 */
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		// 释放数据库连接
		try {
			if(conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			conn = null;
		}
		// 释放传输器
		try {
			if(stmt != null) {
				stmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			stmt = null;
		}
		// 释放结果集
		try {
			if(rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			rs = null;
		}
		
	}
}

IDAO.java 每张表的操作的接口,例如UserDAO就是IDAO的实现

package com.ljxt.demo5.dao;

import java.util.List;

public interface IDAO {
	
	/**
	 * 新增记录
	 * @param obj
	 * @return 返回一个新增结果的数据
	 */
	public Integer add(Object obj);
	
	/**
	 * 删除记录
	 * @param obj
	 * @return 返回一个删除结果的数据
	 */
	public Integer delete(Object obj);
	
	/**
	 * 更新记录
	 * @param obj
	 * @return 返回一个更新结果的数据
	 */
	public Integer update(Object obj);
	
	/**
	 * 查询单个记录
	 * @param obj
	 * @return
	 */
	public Object query(Object obj);
	
	/**
	 * 查询多个记录
	 * @param obj 要查询的数据
	 * @return 返回一个记录的list集合
	 */
	public List<Object> queryList(Object obj);
}


这是User表中添加用户的实现

PreparedStatement stmt = null;
		int result = 0;
		User user = (User)obj;
		try {
			String sql = "INSERT INTO user(name,birthday,money) VALUES(?,?,?)";
			stmt = conn.prepareStatement(sql);
			stmt.setObject(1, user.getName());
			stmt.setObject(2, user.getBirthday());
			stmt.setObject(3, user.getMoney());
			result = stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			MySQLAccess.close(null, stmt, null);
		}
		
		return result;



最后附上怎么使用,一次性添加了50个用户,不过还是有一些缺陷

public static void main(String[] args) {
		DataAccessFactory dAccessFactory = new DataAccessFactory();
		IDAO dao = dAccessFactory.createMySQLConnection();
		User user = new User();
		user.setName("lisi");
		user.setBirthday(new Date(System.currentTimeMillis()));
		user.setMoney(13000);
		int result = 0;
		for(int i = 0; i < 50; i++) {
			result = dao.add(user);			
		}
		System.out.println("信息录入" + (result > 0 ? "成功!" : "失败!"));
	}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值