}
2. 执行sql的上下文内容,返回执行sql的语句及参数
import java.util.List;
/**
* 执行sql的上下文内容
*
* User: dking
*/
public class SqlContext {
/** 执行的sql */
private StringBuilder sql;
/** 主键名称 */
private String primaryKey;
/** 参数,对应sql中的?号 */
private List
3.entity 映射成 sql 语句
import java.beans.BeanInfo;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
/**
* entity 映射成 sql 语句
*
* User: dking
*/
public class SqlUtils {
/** 日志对象 */
private static final Logger LOG = Logger.getLogger(SqlUtils.class);
/**
* 构建insert语句
*
* @param entity 实体映射对象
* @return
*/
public static SqlContext buildInsertSql(Object entity) {
Class> clazz = entity.getClass();
String tableName = ClassUtils.getTableName(clazz);
String primaryName = ClassUtils.getMethodNameColumn(clazz, "id");
//String primaryName = ClassUtils.getMethodNameColumn(clazz, "getId");
StringBuilder sql = new StringBuilder("insert into ");
List
sql.append(tableName);
//获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("(");
StringBuilder args = new StringBuilder();
args.append("(");
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
sql.append(ClassUtils.getMethodNameColumn(clazz, pd.getName()));
args.append("?");
params.add(value);
sql.append(",");
args.append(",");
}
sql.deleteCharAt(sql.length() - 1);
args.deleteCharAt(args.length() - 1);
args.append(")");
sql.append(")");
sql.append(" values ");
sql.append(args);
return new SqlContext(sql, primaryName, params);
}
/**
* 构建更新sql
*
* @param entity
* @param nameHandler
* @return
*/
public static SqlContext buildUpdateSql(Object entity) {
Class> clazz = entity.getClass();
StringBuilder sql = new StringBuilder();
List
String tableName = ClassUtils.getTableName(clazz);
String primaryName = ClassUtils.getMethodNameColumn(clazz, "id");
//获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(clazz);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
sql.append("update ");
sql.append(tableName);
sql.append(" set ");
Object primaryValue = null;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
String columnName = ClassUtils.getMethodNameColumn(clazz, pd.getName());
if (primaryName.equalsIgnoreCase(columnName)) {
primaryValue = value;
}
sql.append(columnName);
sql.append(" = ");
sql.append("?");
params.add(value);
sql.append(",");
}
sql.deleteCharAt(sql.length() - 1);
sql.append(" where ");
sql.append(primaryName);
sql.append(" = ?");
params.add(primaryValue);
return new SqlContext(sql, primaryName, params);
}
/**
* 构建查询条件
*
* @param entity
* @param nameHandler
*/
public static SqlContext buildQueryCondition(Object entity) {
//获取属性信息
BeanInfo beanInfo = ClassUtils.getSelfBeanInfo(entity.getClass());
// PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(entityClass);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
StringBuilder condition = new StringBuilder();
List
int count = 0;
for (PropertyDescriptor pd : pds) {
Object value = getReadMethodValue(pd.getReadMethod(), entity);
if (value == null) {
continue;
}
if (count > 0) {
condition.append(" and ");
}
condition.append(ClassUtils.getMethodNameColumn(entity.getClass(), pd.getName()));
condition.append(" = ?");
params.add(value);
count++;
}
return new SqlContext(condition, null, params);
}
/**
* 获取属性值
*
* @param readMethod
* @param entity
* @return
*/
private static Object getReadMethodValue(Method readMethod, Object entity) {
if (readMethod == null) {
return null;
}
try {
if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
readMethod.setAccessible(true);
}
return readMethod.invoke(entity);
} catch (Exception e) {
LOG.error("获取属性值失败", e);
try {
throw new Exception(e);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return null;
}
}
4.测试用例
System.out.println("ssss");
SportNewsEntity dd = new SportNewsEntity();
dd.setId("222");
SqlContext context = SqlUtils.buildInsertSql(dd);
System.out.println("sql"+context.getSql()+"args "+context.getParams().toArray());
@RequestMapping(params = "doAddSql")
@ResponseBody
public AjaxJson doAddSql(OperateSportsAppEntity operateSportsApp, HttpServletRequest request) {
String message = null;
AjaxJson j = new AjaxJson();
message = "经营高危险性体育项目申请书添加成功";
try{
//必须生成uuid
operateSportsApp.setId(UUIDGenerator.generate());
//动态数据源【缓存】 多数据源主键 详情在多数据源管理模块
DynamicDataSourceEntity dynamicSourceEntity = ResourceUtil.dynamicDataSourceMap.get("mysql");
// DynamicDataSourceEntity dynamicSourceEntity = operateSportsAppService.getEntity(DynamicDataSourceEntity.class, "40288a5e5d3067b9015d306b828d0001");
//动态获取数据源 Spring实现动态数据源
JdbcTemplate jdbcTemplate = DynamicDBUtil.getJdbcTemplate(dynamicSourceEntity);
//sql 上下文件 生成sql语句
SqlContext context = SqlUtils.buildInsertSql(operateSportsApp);
//执行入库操作
jdbcTemplate.update(context.getSql().toString(), context.getParams().toArray());
systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
}catch(Exception e){
e.printStackTrace();
message = "经营高危险性体育项目申请书添加失败";
throw new BusinessException(e.getMessage());
}
j.setMsg(message);
return j;
}