当前位置:Gxlcms > 数据库问题 > Java 动态拼接sql 放弃xml文件 直接连接jdbc

Java 动态拼接sql 放弃xml文件 直接连接jdbc

时间:2021-07-01 10:21:17 帮助过:7人阅读

package com.cn.sdjr.common;

import java.util.List;
import java.util.Map;

public class Config {
// 参数名称/参数值/值补充/是否必填/字段类型/是否主键
//默认值 / / /F不必填 /F字符串 /F不是主键
//默认值 / / /T必填 /T数字、布尔 /T是主键
public static String getOrder(String sort,Map<String,Object> m){
String[] condArray = sort.split(":");
if("".equals(condArray[0])){
return condArray[1]+" "+ condArray[2];
}else{
return condArray[1]+" "+ m.get(condArray[0].trim())+" "+condArray[2];
}
}
//分页有三种可能 limit "" "index#page" limit 1,2 "index#OFFSET#page" limit 1 offset 2
//:index:page::F:F
//offset:index:page::T:D
public static String getPaging(String paging,Map<String,Object> m){
String[] condArray = paging.split(":");
return " LIMIT "+m.get(condArray[1])+" "+condArray[0]+" "+ m.get(condArray[2]);
}
// 参数名称/参数值/值补充/是否必填/字段类型/是否主键
// name:a.name=:‘‘:s:F:F
// 例 :nodeid:a.nodeid=:D:i:F:#
// 例 : nodeid:a.nodename like ‘%:%‘D:s:F:#
public static String getCondition(String cond,Map<String,Object> m){
if(cond==null || cond ==""){//空值过滤
return "";
}
String[] condArray = cond.split("#");
StringBuffer sb = new StringBuffer();
for(int i = 0; i < condArray.length; i++) {
String[] condA = condArray[i].split(":");
if (condA.length == 1) {
sb.append(condA[0]);
continue;
}
Object val = m.get(condA[0]);
if (val == null || "".equals(val)) {//为空需要判断 是否为必填
if ("T".equals(condA[3])) {//默认不是必填
throw new RuntimeException("参数‘" + condA[0] + "’是必填项!");
}
}
if ("T".equals(condA[4])) {//判断是否是 数字 布尔
if (val instanceof Integer || val instanceof Boolean || val instanceof Float) {
sb.append(condA[1]).append(val).append(condA[2]).append(" ");
continue;
}
throw new RuntimeException("sql字段‘" + condA + "’类型定义错误!");
}
if (val.toString().contains(" or ")) {
throw new RuntimeException("参数" + val + "存在违法字符 or!");
}
sb.append(condA[1]).append(val).append(condA[2]).append(" ");
}
return sb+"";
}

public static String getInsert(String cond,Map<String,Object> m){
String[] condArray = cond.split("#");
StringBuffer sbKey = new StringBuffer();
StringBuffer sbVal = new StringBuffer();
Boolean flag = true;// 第一个不加逗号
for(int i = 0; i < condArray.length; i++){
String[] condA = condArray[i].split(":");
Object val= m.get(condA[0].trim());
if("".equals(val) && val==null){
if("T".equals(condA[5])){//判断主键
if(flag){
flag=false;
}else{
sbKey.append(",");
sbVal.append(",");
}
//sbKey.append(condA[0]).append(" ");
//sbVal.append("‘").append(priKey()).append("‘");
continue;
}
if("T".equals(condA[3])){//默认F不是必填
throw new RuntimeException("参数‘"+val+"’不能为空!");
}
continue;
}

if(flag){
flag=false;
}else{
sbKey.append(",");
sbVal.append(",");
}
sbKey.append(condA[0]).append(" ");
if("T".equals(condA[4])) {
if (val instanceof Integer || val instanceof Boolean) {
sbVal.append(val);
continue;
}
throw new RuntimeException("sql字段‘"+condA+"’类型定义错误!");
}
sbVal.append("‘").append(val).append("‘");
}
return "(" +sbKey+") VALUES (" +sbVal +")";
}
public static String[] batchInsert(String cond,List<Map<String,Object>> map){
String[] sqls={};
int num =0;
String sql="";
List<Map<String,Object>> newmap= null ;
for (Map<String,Object> m :map){
num++;
newmap.add(m);
if(num % 10==0){
sql=getMoreInsert(cond, newmap);
sqls[(num/10)-1]=sql;
sql="";
}
}
sqls[num/10]=sql;
return sqls;
}
public static String getMoreInsert(String cond,List<Map<String,Object>> map) {
String[] condArray = cond.split("#");
StringBuffer sbKey = new StringBuffer();
StringBuffer sbVal = new StringBuffer();
boolean flag = false;
for (Map<String, Object> m : map) {
boolean isFirst=true;
if (flag) {// 非第一个 不需要再便历一遍数据字段
sbVal.append(",(");
for (int i = 0; i < condArray.length; i++) {
String[] condA = condArray[i].split(":");
Object val = m.get(condA[0].trim());
//不是第一个字段 必须添加逗号
if(isFirst){
isFirst=false;
}else{
sbVal.append(",");
}
// 判断值是否为空
if ("".equals(val) || val == null) {
if ("T".equals(condA[3])) { //是必填项 报出错误
throw new RuntimeException("参数‘" + val + "’不能为空!");
}
if ("T".equals(condA[5])) { // 是主键 添加主键
// sbVal.append("‘").append(priKey()).append("‘");
continue;
}
sbVal.append(" null "); continue;
}
if ("T".equals(condA[4])) { //判断字段类型 是否符合定义1
if (val instanceof Integer || val instanceof Boolean || val instanceof Boolean) {
sbVal.append(val);
continue;
}
throw new RuntimeException("sql字段‘" + condA + "’类型定义错误!");
}
sbVal.append("‘").append(val).append("‘");
}
}
//第一次遍历需要 insert into (id,name,birth,gae,) values (‘101‘,‘小米‘,‘2021-01-01‘,1);
sbVal.append("(");
sbKey.append("(");
flag = true;
for (int i = 0; i < condArray.length; i++) {
String[] condA = condArray[i].split(":");
Object val = m.get(condA[0].trim());
//每个字段都需要便历
if(isFirst){
isFirst=false;
}else{
sbVal.append(",");
sbKey.append(",");
}
// 判断值是否为空
if ("".equals(val) || val == null) {
if ("T".equals(condA[3])) { //是必填项 报出错误
throw new RuntimeException("参数‘" + val + "’不能为空!");
}
if ("T".equals(condA[5])) { // 是主键 添加主键
sbKey.append(condA[0]).append(" ");
// sbVal.append("‘").append(priKey()).append("‘");
continue;
}
sbKey.append(condA[0]).append(" ");
sbVal.append(" null ");
continue;
}
if ("T".equals(condA[4])) { //判断字段类型 是否符合定义
if (val instanceof Integer || val instanceof Boolean || val instanceof Boolean) {
sbKey.append(condA[0]).append(" ");
sbVal.append(val);
continue;
}
throw new RuntimeException("sql字段‘" + condA + "’类型定义错误!");
}
sbVal.append("‘").append(val).append("‘");
}
sbVal.append(")");
sbKey.append(")");
}
return sbKey + " VALUES " + sbVal + ";";
}

}



//////////////////////////////////////////////////////////////////////////////////////////////////////
//组装 删除sql
public class BuildDeleteSql {
public static String getDeletesql(Map<String,String> sqlslice, Map<String,Object> param){
String keyword = sqlslice.get("keyword");//关键字 必须
String mtable = sqlslice.get("mtable");//表 必须 不加工
String statecond = sqlslice.get("statecond");//附加部分 不加工
String dynconds = sqlslice.get("dynconds");//条件 过滤条件
String ending = sqlslice.get("ending");//结束的部分
StringBuffer sb = new StringBuffer();
statecond=statecond==null?"":statecond;
ending =ending==null?"":ending;
dynconds = dynconds==null||dynconds==""?"":Config.getCondition(dynconds,param);
sb.append(keyword).append(" ").append(mtable).append(" ")
.append(statecond).append(" ").append(dynconds).append(" ").append(ending);
return sb+"";
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//组装 查询sql
public class BuildSelectSql {
public static String getQuerySql(Map<String,String> sqlslice, Map<String,Object> param){
String rank = sqlslice.get("rank");//关键字 必须
String keyword = sqlslice.get("keyword");//关键字 必须
String mtable = sqlslice.get("mtable");//表 必须 不加工
String mindynfactor = sqlslice.get("mindynfactor");// 增改字段 查询字段的条件
String related = sqlslice.get("related");//附加部分 不加工
String majdynfactor = sqlslice.get("majdynfactor");//条件 过滤条件
String ending = sqlslice.get("ending");//结束的部分
StringBuffer sb = new StringBuffer();
related=related==null?"":related;
ending =ending==null?"":ending;
String sort = param.get("sort")==null?"":param.get("sort")+"";//排序
String paging =param.get("paging")==null?"":param.get("paging")+""; //分页
// String sort = sqlslice.get("sort");//排序
//String paging =sqlslice.get("paging"); //分页
// sort =sort==null||sort==""?"":Config.getOrder(sort,param);//排序
//paging = Config.getPaging(paging,param); //分页
majdynfactor = majdynfactor==null||majdynfactor==""?"":Config.getCondition(majdynfactor,param);
mindynfactor = mindynfactor==null||mindynfactor==""?"":Config.getCondition(mindynfactor,param);
sb.append(keyword).append(" ").append(mtable)
.append(" ").append(mindynfactor).append(" ").append(related).append(" ")
.append(majdynfactor).append(" ").append(sort).append(" ").append(paging)
.append(" ").append(ending);
return sb.toString();
}
}

///////////////////////////////////////////////////////////////////////////////////////////////

//组装更新sql
public class BuildUpdateSql {
public static String getUpdatesql(Map<String,String> sqlslice, Map<String,Object> param) {
String keyword = sqlslice.get("keyword");//关键字 必须
String mtable = sqlslice.get("mtable");//表 必须 不加工
String joinon = sqlslice.get("joinon");// 增改字段 查询字段的条件
String statecond = sqlslice.get("statecond");//附加部分 不加工
String dynconds = sqlslice.get("dynconds");//条件 过滤条件
String ending = sqlslice.get("ending");//结束的部分
StringBuffer sb = new StringBuffer();
statecond=statecond==null?"":statecond;
ending =ending==null?"":ending;
dynconds = dynconds==null||dynconds==""?"":Config.getCondition(dynconds,param);
joinon = joinon==""?"":Config.getCondition(joinon,param);
sb.append(keyword).append(" ").append(mtable).append(" ")
.append(joinon).append(" ").append(statecond).append(" ")
.append(dynconds).append(" ").append(ending);
return sb+"";
}
}

///////////////////////////////////////////////////////////////////////////////////////////////
//组装插入sql
public class BulidInsertSql {
public static String getAddSql(Map<String,String> sqlslice, Map<String,Object> param) {
String keyword = sqlslice.get("keyword");//关键字 必须
String mtable = sqlslice.get("mtable");//表 必须 不加工
String dynconds = sqlslice.get("dynconds");//条件 过滤条件
StringBuffer sb = new StringBuffer();
dynconds = dynconds==null||dynconds==""?"":Config.getInsert(dynconds,param);
sb.append(keyword).append(" ").append(mtable).append(" ")
.append(dynconds).append(" ");
return sb+"";
}
}




//多逻辑在同一个方法执行
 public Map Logic(String[] sqlids, Map param) {
Map m = new HashMap();
m.putAll(param);
m.putAll(redisUtil.hmget(param.get("token")+""));
for (String sqlid : sqlids) {//循环sqlid
Map<String, String> sql = redisService.getSqlSplit(sqlid);//redis 读取; //获取sql片段 和指定有关的参数 名称
String handler = sql.get("handler")+"";// 获取指定的参数名称
Map<String,Object> sqlParam = (Map<String, Object>) param.get(handler);// 获取当前sql片段的参数
m.putAll(sqlParam);
/* 将数据 填充到 sqlParam*/
for (String key:sqlParam.keySet()) {
Object valuse=sqlParam.get(key);
if(valuse!=null && !"".equals(valuse.toString())){
Object newobj =m.get(key);
sqlParam.put(key,newobj);
}
}
if("update".equalsIgnoreCase(sql.get("keyword"))){
String exeSql= BuildUpdateSql.getUpdatesql(sql,sqlParam);
int n =jdbcTemplate.update(exeSql);
continue;
}
if("insert".equalsIgnoreCase(sql.get("keyword"))){
String exeSql= BulidInsertSql.getAddSql(sql, sqlParam);
jdbcTemplate.execute(exeSql);
continue;
}
if("delete".equalsIgnoreCase(sql.get("keyword"))){
String exeSql= BuildDeleteSql.getDeletesql(sql,sqlParam);
jdbcTemplate.execute(exeSql);
continue;
}
if("select".equalsIgnoreCase(sql.get("keyword"))){
String exeSql= BuildSelectSql.getQuerySql(sql,sqlParam);
Map resMap =jdbcTemplate.queryForMap(exeSql);
continue;
}
// String exeSql = SqlBuild.getMiddleSql(sql, sqlParam);
// Map ret = ret = jdbc.execsql
// if (ret == null) {
// m.putAll(sqlParam);
// } else {
// m.putAll(ret);//添加数据到参数表
// }
}
return m;
}

Java 动态拼接sql 放弃xml文件 直接连接jdbc

标签:gets   执行   state   nta   getc   LIDS   空值   sql   stat   

人气教程排行