BaseDAO增删改查通用代码

实习已经两三个月了,在这两三个月中见到了很多以前没有见到过的东西,也学到了很多的东西。其中,我觉得最神奇的地方就是我们公司的框架了,在学校的时候以为所有代码都是要手写的,但是万万没想到很多通用的代码竟然可以提取出来自动生成!!!

正好马上要开始做毕业设计了,我准备自己也把通用代码提取出来,也实现自动生成。这样一来能够提高自己,二来也能少写点代码。

下面就是我提取DAO层思路,公司里的DAO层只提取了分页,计数等通用功能。其增删改查功能是通过自己写maven插件自动生成的,这样的一个好处是对于具体的某一个JavaBean可以随意的修改其增删改查方法。其缺点也显而易见,如果没有对应的代码自动生成插件,这是一个很大的工作量。

因此,针对以上的不足之处,我这次把增删改查功能也单独提取出来了。但是这样的缺点也显而易见的暴露出来了,无法很方便的修改具体的某一个JavaBean的增删改查方法。而且在实现这些方法时,增删改查中用到的主键都是自动获取的,使用起来比较呆板,灵活性较差。因此这断程序还需要进行修改,这里暂时记录下来。

下面贴出我的代码

package com.msw.framework.base;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.msw.framework.entity.Entity;
import com.msw.framework.entity.JdbcExecute;
import com.msw.framework.utils.FrameWorkUtils;

/**
 * DAO操作基础类
 * <p>
 * 自动处理增删改查操作,其中对时间日期格式未处理,如果实体类中有时间日期格式数据请重写方法进行操作
 * </p>
 * 
 * @author mashengwei
 * @date 2018年11月17日
 * @version 0.0.1
 * @param <T>
 */
@Repository
@SuppressWarnings("all")
public abstract class BaseDAO<T extends Entity> {
	Logger logger = LoggerFactory.getLogger(BaseDAO.class);
	@Autowired
	protected JdbcTemplate jdbcTemplate;

	/**
	 * 数据库新增操作
	 * 
	 * @param bean 新增实体类对象
	 * @return
	 */
	public int insert(T bean) throws Exception {
		Class<T> beanClass = (Class<T>) bean.getClass();
		Map<String, Object> map = FrameWorkUtils.entityToMap(bean);
		StringBuffer sql = new StringBuffer();
		List<Object> parameter = new ArrayList<Object>();
		String tableName = FrameWorkUtils.camelToUnderline(bean.getClass().getSimpleName());
		System.err.println("数据库的表名为:" + tableName);
		sql.append("INSERT INTO " + tableName + "(");
		Set<Entry<String, Object>> entrySet = map.entrySet();
		for (Entry<String, Object> entry : entrySet) {
			sql.append(FrameWorkUtils.camelToUnderline(entry.getKey()) + ",");
		}
		sql.deleteCharAt(sql.length() - 1);
		sql.append(") VALUES(");
		for (Entry<String, Object> entry : entrySet) {
			sql.append("?,");
			parameter.add(entry.getValue());
		}
		sql.deleteCharAt(sql.length() - 1);
		sql.append(")");
		logger.info("新增操作SQL【" + sql.toString() + "】");
		logger.info("新增操作参数【" + parameter + "】");
		return jdbcTemplate.update(sql.toString(), parameter.toArray());
	}

	/**
	 * 
	 * 数据库删除操作
	 * 
	 * @param bean 删除实体类对象
	 * @return
	 */
	public int delete(T bean) {
		Class<T> beanClass = (Class<T>) bean.getClass();
		Map<String, Object> map = FrameWorkUtils.entityToMap(bean);
		StringBuffer sql = new StringBuffer();
		List<Object> parameter = new ArrayList<Object>();
		String tableName = beanClass.getSimpleName();
		tableName = FrameWorkUtils.camelToUnderline(tableName);
		sql.append("DELETE FROM " + tableName);
		sql.append(" WHERE 1=0 OR ");
		Set<Entry<String, Object>> entrySet = map.entrySet();
		for (Entry<String, Object> entry : entrySet) {
			if (entry.getValue() != null) {
				sql.append(FrameWorkUtils.camelToUnderline(entry.getKey()) + "=? AND");
				parameter.add(entry.getValue());
			}
		}
		sql.delete(sql.length() - 3, sql.length());
		logger.info("删除操作SQL【" + sql.toString() + "】");
		logger.info("删除操作参数【" + parameter + "】");
		return jdbcTemplate.update(sql.toString(), parameter.toArray());
	}

	/**
	 * 
	 * 数据库修改操作
	 * 
	 * @param bean 更新实体类对象
	 * @return
	 * @throws Exception
	 */
	public int update(T bean) throws Exception {
		Class<T> beanClass = (Class<T>) bean.getClass();
		Map<String, Object> map = FrameWorkUtils.entityToMap(bean);
		StringBuffer sql = new StringBuffer();
		List<Object> parameter = new ArrayList<Object>();
		String tableName = FrameWorkUtils.camelToUnderline(beanClass.getSimpleName());
		String primaryKey = FrameWorkUtils.getPrimKeyByNameTableName(jdbcTemplate.getDataSource().getConnection(),
				tableName).toUpperCase();
		sql.append("UPDATE " + tableName + " SET ");
		Set<Entry<String, Object>> entrySet = map.entrySet();
		for (Entry<String, Object> entry : entrySet) {
			if (primaryKey.equals(FrameWorkUtils.camelToUnderline(entry.getKey()))) {
				continue;
			} else if (entry.getValue() != null) {
				sql.append(FrameWorkUtils.camelToUnderline(entry.getKey()) + "=?,");
				parameter.add(entry.getValue());
			}
		}
		sql.deleteCharAt(sql.length() - 1);
		sql.append(" where " + primaryKey + "=? ");
		parameter.add(map.get(FrameWorkUtils.underlineToCamel(primaryKey)));
		logger.info("修改操作SQL【" + sql.toString() + "】");
		logger.info("修改操作参数【" + parameter + "】");
		return jdbcTemplate.update(sql.toString(), parameter.toArray());
	}

	/**
	 * 
	 * 数据库查询多个对象操作
	 * 
	 * @param bean 查询实体类对象
	 * @return
	 * @throws Exception
	 */
	public List<T> queryList(T bean) throws Exception {
		Class<T> beanClass = (Class<T>) bean.getClass();
		Map<String, Object> map = FrameWorkUtils.entityToMap(bean);
		StringBuffer sql = new StringBuffer();
		List<Object> parameter = new ArrayList<Object>();
		String tableName = bean.getClass().getSimpleName();
		tableName = FrameWorkUtils.camelToUnderline(tableName);
		sql.append("SELECT ");
		Set<Entry<String, Object>> entrySet = map.entrySet();
		for (Entry<String, Object> entry : entrySet) {
			sql.append(FrameWorkUtils.camelToUnderline(entry.getKey()) + ",");
		}
		sql.deleteCharAt(sql.length() - 1);
		sql.append(" FROM " + tableName);
		sql.append(" WHERE 1=1 AND ");
		for (Entry<String, Object> entry : entrySet) {
			if (entry.getValue() != null) {
				if (entry.getValue().getClass() == String.class) {
					//String类型全部模糊查询处理
					sql.append(FrameWorkUtils.camelToUnderline(entry.getKey()) + " LIKE ? AND ");
					parameter.add("%" + entry.getValue() + "%");
				} else{
					//其余类型暂不处理
					sql.append(FrameWorkUtils.camelToUnderline(entry.getKey()) + "=? AND ");
					parameter.add(entry.getValue());
				}
			}
		}
		sql.delete(sql.length() - 4, sql.length());
		logger.info("查询操作SQL【" + sql.toString() + "】");
		logger.info("查询操作参数【" + parameter + "】");
		return jdbcTemplate.query(sql.toString(), parameter.toArray(), new BeanPropertyRowMapper<T>(beanClass));
	}
	/**
	 * 万能的SQL执行平台
	 * @param bean	实体类对象
	 * @param execute	执行对象
	 * @return
	 */
	public Object execute(T bean,JdbcExecute execute){
		return execute.execute(jdbcTemplate, bean);
	}
}
package com.msw.framework.utils;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

public class FrameWorkUtils {
	/**
	 * 驼峰转下划线
	 * 
	 * @return
	 */
	public static String camelToUnderline(String line) {
		if (StringUtils.isBlank(line)) {
			return "";
		} else {
			line = String.valueOf(line.charAt(0)).toUpperCase().concat(line.substring(1));
			StringBuffer sb = new StringBuffer();
			Pattern pattern = Pattern.compile("[A-Z]([a-z\\d]+)?");
			Matcher matcher = pattern.matcher(line);
			while (matcher.find()) {
				String word = matcher.group();
				sb.append(word.toLowerCase());
				sb.append(matcher.end() == line.length() ? "" : "_");
			}
			return sb.toString().toUpperCase();
		}
	}
	/**
	 * 下划线转驼峰
	 * 
	 * @return
	 */
	public static String underlineToCamel(String line) {
		if (StringUtils.isBlank(line)) {
			return "";
		} else {
			StringBuffer sb = new StringBuffer();
			String[] words = line.split("_");
			for (String word:words) {
				word = word.toLowerCase();
				word = String.valueOf(word.charAt(0)).toUpperCase().concat(word.substring(1));
				sb.append(word);
			}
			return sb.replace(0, 1, String.valueOf(sb.charAt(0)).toLowerCase()).toString();
		}
	}

	/**
	 * javaBean转Map
	 * 
	 * @param bean
	 * @return
	 */
	public static Map<String, Object> entityToMap(Object entity) {
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		Field[] fields = entity.getClass().getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			Object object = null;
			try {
				object = field.get(entity);
			} catch (Exception e) {
				e.printStackTrace();
			}
			map.put(field.getName(), object);
		}
		return map;
	}
	/**
	 * 根据数据库表名获取主键名称
	 * @param connection 数据库连接句柄
	 * @param tableName	表名
	 * @return
	 */
	public static String getPrimKeyByNameTableName(Connection connection,String tableName) {
		String primkey = null;
		try {
			ResultSet rs = connection.getMetaData().getPrimaryKeys(connection.getCatalog(), null, tableName.toUpperCase());
			while (rs.next()) {
				primkey = rs.getString("COLUMN_NAME");
			}
		} catch (SQLException e1) {
			try {
				connection.close();
			} catch (SQLException e) {
			}
		}
		return primkey;
	}
}

猜你喜欢

转载自blog.csdn.net/mmma2501/article/details/84488744
今日推荐