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

来源:互联网 发布:疯狂的美工助手注册码 编辑:程序博客网 时间:2024/05/15 14:25

前两天正好学到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 0
原创粉丝点击