BaseDAO增刪改查通用程式碼
阿新 • • 發佈:2018-11-25
實習已經兩三個月了,在這兩三個月中見到了很多以前沒有見到過的東西,也學到了很多的東西。其中,我覺得最神奇的地方就是我們公司的框架了,在學校的時候以為所有程式碼都是要手寫的,但是萬萬沒想到很多通用的程式碼竟然可以提取出來自動生成!!!
正好馬上要開始做畢業設計了,我準備自己也把通用程式碼提取出來,也實現自動生成。這樣一來能夠提高自己,二來也能少寫點程式碼。
下面就是我提取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; } }