如何使用反射和抽象工厂模式来写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;
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
- 如何使用反射和抽象工厂模式来写JDBC
- 简单工厂模式+反射来改进抽象工厂模式
- 抽象工厂模式下使用反射
- 抽象工厂模式+反射
- 抽象工厂模式+反射+配置文件
- 抽象工厂模式:简单工厂模式、工厂方法模式对比;在工厂方法模式中使用反射创建对象实例
- 抽象工厂模式,BLL层如何使用工厂的代码?
- java 反射和 工厂模式结合使用
- 设计模式---抽象工厂模式+反射+配置文件
- 设计模式之反射+抽象工厂模式
- 使用C++写抽象工厂模式涉及到的一些问题
- 使用Java反射跟简单工厂模式改进抽象工厂模式
- 利用“工厂模式+反射+配置文件”来实现解耦和
- 设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)
- 简单工厂、工厂模式和抽象工厂
- Java--用简单工厂来改进抽象工厂(反射)
- 05.抽象工厂模式+反射--AbstractFactory&Reflect
- 05.抽象工厂模式+反射--AbstractFactory&Reflect
- OpenCV3.2.0-----训练数据/分类
- 给定一个数组,返回这个数组的所有子数组
- 将html页改成jsp的两种方式
- 让Idea本地服务器可以被外部访问
- in future 和 in the future用法的区别
- 如何使用反射和抽象工厂模式来写JDBC
- java反射(5)通过反射拷贝对象
- sklearn 抽样
- 【SQL Server学习笔记】21:四种表表达式的基本使用
- 磁条卡相关
- 面向对象三大特征-封装
- seo关键词的选取原则,关键词的拓展方法,关键词的分析筛选
- JAVA并发编程(六)——性能优化(下)
- GIT