前两天正好学到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;
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 ? "成功!" : "失败!"));
}