1. 程式人生 > >BaseDAO增刪改查通用程式碼

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;
	}
}