package com.cn.sdjr.common;
import java.util.List;
import java.util.Map;
// 参数名称/参数值/值补充/是否必填/字段类型/是否主键
//默认值 / / /F不必填 /F字符串 /F不是主键
//默认值 / / /T必填 /T数字、布尔 /T是主键
public class Config {
public static String getOrder(String sort,Map m){
String[] condArray = sort.split(":");
String sor= m.get(condArray[1])+"";
if(sor==null||"".equals(sor)){
return condArray[0];
}
return condArray[0]+" "+ sor;
}
//分页有三种可能 limit "" "index#page" limit 1,2 "index#OFFSET#page" limit 1 offset 2
public static String getPaging(String paging,Map m){
String[] condArray = paging.split(":");
String pages= m.get(condArray[0])+"";
if(pages==null||"".equals(pages)){//第一个分页参数为空 就返回空的
return "";
}
String pagee= m.get(condArray[1])+"";
if(pagee==null||"".equals(pagee)){//第二个分页参数为空 limit 1
return " LIMIT "+pages;
}
return " LIMIT "+pages+" "+condArray[1]+" "+ pagee;
}
// 参数名称/参数值/值补充/是否必填/字段类型/是否主键
// 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 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 v = m.get(condA[0]);
if (v == null || "".equals(v)) {//值 为空需要判断 是否为 必填项
if ("T".equals(condA[3])) {//默认不是必填
throw new RuntimeException("参数‘" + condA[0] + "’是必填项!");
}
}
if ("T".equals(condA[4])) {//判断是否是 数字 布尔
if (v instanceof Integer || v instanceof Boolean || v instanceof Float) {
sb.append(condA[1]).append(v).append(condA[2]).append(" ");
continue;
}
throw new RuntimeException("sql字段‘" + condA + "’类型定义错误!");
}
if (v.toString().contains(" or ")) { //判断违法字符
throw new RuntimeException("参数" + v + "存在违法字符 or!");
}
sb.append(condA[1]).append(v).append(condA[2]).append(" ");
}
return sb+"";
}
public static String getInsert(String cond,Map 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[] sqls={};
int num =0;
String sql="";
List> newmap= null ;
for (Map 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[] condArray = cond.split("#");
StringBuffer sbKey = new StringBuffer();
StringBuffer sbVal = new StringBuffer();
boolean flag = false;
for (Map 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 + ";";
}
}
package com.cn.sdjr.common;
import java.util.HashMap;
import java.util.Map;
public class BulidSql {
/**
*
* @param sqlslice
* @param param keyword mtable statecond dynconds ending
* @return
*/
public static String getDeletesql(Map sqlslice, Map param){
String keyword = sqlslice.get("keyword");//关键字 必须
if(!keyword.equalsIgnoreCase("delete")){
throw new RuntimeException("keyword :关键字错误!"+keyword);
}
String mtable = sqlslice.get("mtable");//表 必须 不加工
if(mtable == null||"".equals(mtable)){
throw new RuntimeException("mtable :要删除的表不能为空!"+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+"";
}
/**
*
* @param sqlslice
* @param param keyword mtable joinon statecond dynconds ending sort paging
* @return
*/
public static String getQuerySql(Map sqlslice, Map param){
// String rank = sqlslice.get("rank");//关键字 必须
String keyword = sqlslice.get("keyword");//关键字 必须
if(!keyword.equalsIgnoreCase("select")){
throw new RuntimeException("keyword :关键字错误!"+keyword);
}
String mtable = sqlslice.get("mtable");//表 必须 不加工
if(mtable == null||"".equals(mtable)){
throw new RuntimeException("mtable :要查询的表不能为空!"+mtable);
}
String joinon = sqlslice.get("joinon");// 增改字段 join on查询字段的条件
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;
String sort = param.get("sort")==null?"":Config.getOrder(param.get("sort")+"",param);//排序
String paging =param.get("paging")==null?"":Config.getOrder(param.get("paging")+"",param); //分页
dynconds = dynconds==null||dynconds==""?"":Config.getCondition(dynconds,param);
joinon = joinon==null||joinon==""?"":Config.getCondition(joinon,param);
sb.append(keyword).append(" ").append(mtable)
.append(" ").append(joinon).append(" ").append(statecond).append(" ")
.append(dynconds).append(" ").append(sort).append(" ").append(paging)
.append(" ").append(ending);
return sb.toString();
}
/**
*
* @param sqlslice
* @param param keyword mtable joinon statecond dynconds ending
* @return
*/
public static String getUpdatesql(Map sqlslice, Map param) {
String keyword = sqlslice.get("keyword");//关键字 必须
if(!keyword.equalsIgnoreCase("update")){
throw new RuntimeException("keyword :关键字错误!"+keyword);
}
String mtable = sqlslice.get("mtable");//表 必须 不加工
if(mtable == null||"".equals(mtable)){
throw new RuntimeException("mtable :要更新的表不能为空!"+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+"";
}
/**
*
* @param sqlslice
* @param param keyword mtable dynconds ending
* @return
*/
public static String getAddSql(Map sqlslice, Map param) {
String keyword = sqlslice.get("keyword");//关键字 必须
if(!keyword.equalsIgnoreCase("insert")){
throw new RuntimeException("keyword :关键字错误!"+keyword);
}
String mtable = sqlslice.get("mtable");//表 必须 不加工
if(mtable == null||"".equals(mtable)){
throw new RuntimeException("mtable :要更新的表不能为空!"+mtable);
}
String dynconds = sqlslice.get("dynconds");//条件 过滤条件
String ending = sqlslice.get("ending");//结束的部分
ending =ending==null?"":ending;
StringBuffer sb = new StringBuffer();
dynconds = dynconds==null||dynconds==""?"":Config.getInsert(dynconds,param);
sb.append(keyword).append(" ").append(mtable).append(" ")
.append(dynconds).append(" ").append(ending);
return sb+"";
}
/
public static void main(String[] args) {
Map sqlslice =new HashMap();
sqlslice.put("keyword", "select");
sqlslice.put("mtable", "a.carteid,a.cartename from dcblm.carte a ");
sqlslice.put("joinon", "");
sqlslice.put("statecond", "where a.delete =1");
sqlslice.put("dynconds", "carteid:and a.partid=::F:F:F#cartename:and a.cartename like ':%':F:F#" +
"carteurl:and a.carteurl=':':F:F:F#id:and a.id in(:):F:F");
sqlslice.put("ending", "");
sqlslice.put("paging", "index");
sqlslice.put("sort", "");
Map param =new HashMap();
param.put("carteid", "3");
param.put("id", "'1','3','4'");
param.put("cartename", "添加菜单");
param.put("index", "2");
param.put("page", 2);
param.put("carteurl", "httn");
// Long l = System.currentTimeMillis();
String sql = getQuerySql(sqlslice,param);
System.out.println(sql);
}
}