BaseDao增删改查自动化的制作

表名为  t_XXXX.  若表明没有以  t_  开头的,则报错.这样在后面大量的数据表中的就不需要再写那么多麻烦的代码量了.
不过单一的数据查询,则可以用到代码,多表查询的情况下则需要另行再写.
package com.demo.dao;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public abstract class ABaseDao {
	protected java.sql.Connection conn;
	protected PreparedStatement pstmt;

	private String uri;
	private String drivername;
	private String username;
	private String pwd;

	public ABaseDao() {

		// 1.读取配置文件
		java.util.Properties config = new Properties();
		try {
			config.load(this.getClass().getClassLoader()
					.getResourceAsStream("dbconfig.prop"));

			uri = config.getProperty("DBURI");
			drivername = config.getProperty("DRIVERNAME");
			username = config.getProperty("USERNAME");
			pwd = config.getProperty("DBPWD");

			// System.out.println(uri);

			// 2.加载驱动
			Class.forName(drivername);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void checkConn() {

		try {
			if (conn == null || conn.isClosed()) {

				conn = DriverManager.getConnection(uri, username, pwd);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void closeDB() {
		try {
			if (conn != null && !conn.isClosed()) {
				if (pstmt != null && !pstmt.isClosed()) {
					pstmt.close();
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 查询的方法 变参
	protected ResultSet query(String sql, Object... objects) {
		checkConn();
		try {

			pstmt = conn.prepareStatement(sql);
			if (objects != null) {
				// 设置参数
				for (int i = 0; i < objects.length; i++) {
					pstmt.setObject(i + 1, objects[i]);
				}
			}
			return pstmt.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;
	}

	

	// 通过反射去自动封装POJO的方法
	private Object autoSetter(ResultSet rs) {
		Object result = null;
		Object val = null;
		// 取得自己 XXXDao
		Class daoClz = this.getClass();

		// 取得自己对应的pojo
		try {
			Class pojoClz = Class.forName(daoClz.getName()
					.replace("dao", "pojo").replace("Dao", ""));
			// 生成实例
			result = pojoClz.newInstance();// pojo必须要有默认参构造器
			// 取得pojo中的全部属性
			Field[] fields = pojoClz.getDeclaredFields();
			Method setter = null;
			for (Field field : fields) {
				// 通过Field取得对应的setter方法名--->取得方法
				setter = pojoClz
						.getMethod("set"
								+ field.getName().substring(0, 1).toUpperCase()
								+ field.getName().substring(1), field.getType());
				// 动态调用设置
				if ("oracle.jdbc.driver.OracleDriver".equals(drivername)) {
					if (field.getType().equals(java.lang.Integer.class)) {
						val = rs.getInt(field.getName());
					} else if (field.getType().equals(Double.class)) {
						val = rs.getDouble(field.getName());
					} else if (field.getType().equals(java.util.Date.class)) {
						val = rs.getDate(field.getName());
					} else {
						val = rs.getObject(field.getName());
					}
				} else {
					val = rs.getObject(field.getName());
				}

				if (val != null) {
					// System.out.println(field.getName()+":"+val.getClass());
					setter.invoke(result, val);
				}

			}
			// System.out.println(pojoClz);
			return result;

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	// 更新的方法 merge合并
	protected int merge(String sql, Object... objects) {
		checkConn();
		try {
			pstmt = conn.prepareStatement(sql);
			if (objects != null) {
				for (int i = 0; i < objects.length; i++) {
					pstmt.setObject(i + 1, objects[i]);
				}
			}
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return -1;
	}

	protected Object findOne(String sql, Object... objects) {
		ResultSet rs = query(sql, objects);
		Object rslt = null;
		try {
			if (rs.next()) {
				rslt = autoSetter(rs);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		closeDB();
		return rslt;
	}

	// 通用的返回多值的方法
	public List findSome(String sql, Object... objects) {
		ResultSet rs = query(sql, objects);
		Object tmp = null;
		List rslt = new ArrayList();
		try {

			while (rs.next()) {
				tmp = autoSetter(rs);
				rslt.add(tmp);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		closeDB();
		return rslt;
	}

	public int save(Object pojo) {

		try {
			// 取得DAO自己
			Class daoClz = this.getClass();
			// 取得自己对应的pojo
			Class pojoClz = Class.forName(daoClz.getName()
					.replace("dao", "pojo").replace("Dao", ""));

			// 构建sql
			StringBuilder sql = new StringBuilder("insert into t_");
			sql.append(pojoClz.getName().substring(
					pojoClz.getName().indexOf("pojo") + 5));
			Field[] fields = pojoClz.getDeclaredFields();
			sql.append("(");
			// ID 是自增长的.所以I为1.若为0则显示有ID
			for (int i = 1; i < fields.length; i++) {
				sql.append(fields[i].getName());
				sql.append(",");
			}
			sql.delete(sql.length() - 1, sql.length());
			sql.append(")");
			sql.append("values (");
			// 生成参数
			Object[] agrs = new Object[fields.length - 1];
			for (int i = 1; i < fields.length; i++) {
				sql.append("?");
				sql.append(",");
				// 通过pojo的getter方法取值
				String a = "get"
						+ fields[i].getName().substring(0, 1).toUpperCase()
						+ fields[i].getName().substring(1);
				System.out.println(a);
				agrs[i - 1] = pojoClz.getMethod(
						"get"
								+ fields[i].getName().substring(0, 1)
										.toUpperCase()
								+ fields[i].getName().substring(1)).invoke(
						pojo, null);

				System.out.println(agrs[i - 1]);
			}
			sql.delete(sql.length() - 1, sql.length());
			sql.append(")");
			System.out.println(sql);

			return this.merge(sql.toString(), agrs);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {

			closeDB();
		}
		return -1;
	}

	// 通用的删除方法
	public int delete(Integer id) {
		try {
			// 取得dao自己
			Class daoClz = this.getClass();
			// 取得对应的pojo
			Class pojoClz = Class.forName(daoClz.getName()
					.replace("dao", "pojo").replace("Dao", ""));
			// 生成实例
			Object result = pojoClz.newInstance();// pojo必须要有默认参构造器
			// 取得pojo中的全部属性
			Field[] fields = pojoClz.getDeclaredFields();
			// 构建sql
			return merge(
					"delete t_"
							+ pojoClz.getName().substring(
									pojoClz.getName().indexOf("pojo") + 5)
							+ " where " + fields[0].getName() + "=?", id);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return -1;
	}

	// 通用的更新的方法
	public int update(Object pojo) {
		try {
			// 取得dao自己
			Class daoClz = this.getClass();
			// /取得自己对应的pojo
			Class pojoClz = Class.forName(daoClz.getName()
					.replace("dao", "pojo").replace("Dao", ""));

			// 构建sql
			StringBuilder sql = new StringBuilder("update t_");
			sql.append(pojoClz.getName().substring(
					pojoClz.getName().indexOf("pojo") + 5));
			// 取得pojo中的全部属性
			Field[] flieds = pojoClz.getDeclaredFields();
			sql.append(" set ");
			// 跳过ID
			for (int i = 1; i < flieds.length; i++) {
				sql.append(flieds[i].getName());
				sql.append("=?,");
			}
			sql.delete(sql.length() - 1, sql.length()); // 删除最后一个“,”
			sql.append("  where ");
			sql.append(flieds[0].getName());
			sql.append("=? ");

			// System.out.println(sql);

			// /生成参数
			Object[] agrs = new Object[flieds.length];
			for (int i = 1; i < flieds.length; i++) {
				// 通过pojo的getter方法取值
				agrs[i - 1] = pojoClz.getMethod(
						"get"
								+ flieds[i].getName().substring(0, 1)
										.toUpperCase()
								+ flieds[i].getName().substring(1)).invoke(
						pojo, null);
				// System.out.println(agrs[i-1]);
			}
			// where id=?
			agrs[flieds.length - 1] = pojoClz.getMethod(
					"get" + flieds[0].getName().substring(0, 1).toUpperCase()
							+ flieds[0].getName().substring(1)).invoke(pojo,
					null);
			return this.merge(sql.toString(), agrs);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return -1;
	}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的BaseDao类,封装了增加、删除、询、更新四个方法: ``` import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class BaseDao { // 定义数据库连接对象 private Connection conn = null; // 构造方法,初始化数据库连接对象 public BaseDao() { conn = DBUtil.getConnection(); } // 增加数据方法 public int add(String sql, Object... params) { int count = 0; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); // 设置占位符参数 for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } // 执行增加操作 count = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.closeAll(null, pstmt, null); } return count; } // 删除数据方法 public int delete(String sql, Object... params) { int count = 0; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); // 设置占位符参数 for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } // 执行删除操作 count = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.closeAll(null, pstmt, null); } return count; } // 询数据方法 public ResultSet query(String sql, Object... params) { ResultSet rs = null; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); // 设置占位符参数 for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } // 执行询操作 rs = pstmt.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } // 更新数据方法 public int update(String sql, Object... params) { int count = 0; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); // 设置占位符参数 for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } // 执行更新操作 count = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.closeAll(null, pstmt, null); } return count; } } ``` 在使用该类时,可以通过继承的方式来实现具体的操作,例如: ``` public class UserDao extends BaseDao { // 添加用户 public int addUser(User user) { String sql = "insert into user(username, password, age) values(?,?,?)"; return super.add(sql, user.getUsername(), user.getPassword(), user.getAge()); } // 删除用户 public int deleteUser(int id) { String sql = "delete from user where id=?"; return super.delete(sql, id); } // 询用户 public User getUser(int id) { User user = null; String sql = "select * from user where id=?"; ResultSet rs = super.query(sql, id); try { if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setAge(rs.getInt("age")); } } catch (SQLException e) { e.printStackTrace(); } return user; } // 更新用户 public int updateUser(User user) { String sql = "update user set username=?, password=?, age=? where id=?"; return super.update(sql, user.getUsername(), user.getPassword(), user.getAge(), user.getId()); } } ``` 这样,我们就可以通过继承BaseDao类来实现具体的增、删、操作了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值