实习已经两三个月了,在这两三个月中见到了很多以前没有见到过的东西,也学到了很多的东西。其中,我觉得最神奇的地方就是我们公司的框架了,在学校的时候以为所有代码都是要手写的,但是万万没想到很多通用的代码竟然可以提取出来自动生成!!!
正好马上要开始做毕业设计了,我准备自己也把通用代码提取出来,也实现自动生成。这样一来能够提高自己,二来也能少写点代码。
下面就是我提取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;
}
}