java sql xml_Java动态拼接组装sql 多条件动态配置 放弃xml文件 直接连接jdbc

这个博客介绍了如何使用Java动态地拼接和组装SQL查询,包括排序、分页和条件过滤,避免了XML配置,直接通过Map参数连接JDBC执行SQL。
摘要由CSDN通过智能技术生成

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值