Java 实现简单的SQL动态组装工具类
第一版
package com.zh.oukele.util; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; public class CreateSqlUtil { public static void main(String[] args) { Map<String ,Object> map = new HashMap<>();
map.put("stuName","欧可乐");
map.put("stuAge",20);
map.put("stuSex","男");
map.put("Key_stuId","ASDF");
map.put("Key_stuSex","ASDF");
try {
System.out.println(getSql("table_name", "delete", map, false, ""));
} catch (Exception e) {
e.printStackTrace();
} } /**
* 动态组装 简单sql语法
* @param tableName 表名
* @param operation 操作标识符 select|delete|update ,默认为 select
* @param mapData 数据的map集合
* @param useMySQL true|false , false 为使用动态组装SQL,true为使用自已的sql
* @param mySql 自已的sql
* 注意:update 这里,where xxx = xxx ,的时候,mapData 里的键必须要有 Key_ 前缀(其他的 并不影响到)
*
* @return
* @throws Exception
*/
public static String getSql(String tableName, String operation, Map<?,?> mapData,boolean useMySQL,String mySql) throws Exception {
String sql = null;
// 使用组装sql的功能
if( !useMySQL){
if( !(tableName != null && !tableName.equals("") && tableName.length() > 0 ) ){
throw new Exception(" 参数 tableName 的值为空!");
}else if( !(mapData != null && !mapData.equals("") && mapData.size() > 0 ) ){
throw new Exception(" 参数 mapData 的值为空!");
}
// 操作标识 默认为 select
String operations = "select";
String condition = " a.* from " + tableName + " a where ";
if( operation != null && !operation.equals("") ){
if( operation.equals("update") || operation.equals("UPDATE") ){
operations = "update";
condition = " " + tableName + " a set ";
}else if( operation.equals("delete") || operation.equals("DELETE") ){
operations = "delete";
condition = " from " + tableName + " a where ";
}else if( operation.equals("insert") || operation.equals("INSERT") ){
operations = "insert";
condition = " into " + tableName + " values (";
String link = "";
Iterator<?> iterator = mapData.keySet().iterator();
while (iterator.hasNext()) {
String next = (String) iterator.next();
condition += link + next;
link = ",";
}
condition += ") values( ";
}
}
String value= "";
String link ="";
String keyValueOperations = " where ";
Iterator<? extends Map.Entry<?, ?>> iterator = mapData.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<?, ?> next = iterator.next();
if( next.getValue() instanceof String ){
value = "'" + next.getValue() +"'";
}else {
value = "" + next.getValue() +"";
}
if( next.getKey().toString().lastIndexOf("Key_") == -1 ){
if( !operations.equals("insert")){
if( operations.equals("select") || operations.equals("delete")){
condition += link + "a." + next.getKey();
condition += "=" + value;
link = " and ";
}else {
condition += link + "a." + next.getKey();
condition += "=" + value;
link = ",";
}
}else {
condition += link + value;
link = ",";
}
}else {
continue;
}
} // 组装 insert sql 的结尾
if( operations.equals("insert") ){
condition += ")";
}else if(operations.equals("update")){ // 组装 update sql 的结尾
condition += " where ";
String and = "";
Iterator<? extends Map.Entry<?, ?>> iterator1 = mapData.entrySet().iterator();
while (iterator1.hasNext()) {
Map.Entry<?, ?> next = iterator1.next();
if( next.getValue() instanceof String ){
value = "'" + next.getValue() +"'";
}else {
value = "" + next.getValue() +"";
}
String key = next.getKey().toString();
if( key.lastIndexOf("Key_") != -1 ){
key = key.substring(key.indexOf("Key_")+ 4,key.length());
condition += and +"a." +key + "=" + value;
and = " and ";
}
}
} sql = operations + condition;
}else { // 不使用组装sql的功能
sql = mySql;
}
return sql;
}
}
使用案例:
public static void main(String[] args) throws Exception {
Map<String ,Object> map = new HashMap<>();
map.put("stuName","欧可乐");
map.put("stuAge",20);
map.put("stuSex","");
map.put("Key_stuId","XXX");
map.put("Key_stuSex","VVV");
String select = getSql1("table_name", "select", map, false, "");
System.out.println(select);
System.out.println();
String insert = getSql1("table_name", "insert", map, false, "");
System.out.println(insert);
System.out.println();
String delete = getSql1("table_name", "delete", map, false, "");
System.out.println(delete);
System.out.println();
String update = getSql1("table_name", "update", map, false, "");
System.out.println(update);
}
生成的SQL语句:

第二版
修改 版本一组装insert语法时的一些bug,新增组装查询SQL时, 可使用 a.xxx is not null 条件查询
/**
* 动态组装 简单sql语法
* @param tableName 表名
* @param operation 操作标识符 select|delete|update ,默认为 select
* @param mapData 数据的map集合
* @param useMySQL true|false , false 为使用动态组装SQL,true为使用自已的sql
* @param mySql 自已的sql
* 注意:update 这里,where xxx = xxx ,的时候,mapData 里的键必须要有 Key_ 前缀(其他的 并不影响到)
*
* @return
* @throws Exception
*/
public static String getSql2(String tableName, String operation, Map<?,?> mapData,boolean useMySQL,String mySql) throws Exception {
String sql = null;
// 使用组装sql的功能
if( !useMySQL){
if( !(tableName != null && !tableName.equals("") && tableName.length() > 0 ) ){
throw new Exception(" 参数 tableName 的值为空!");
}else if( !(mapData != null && !mapData.equals("") && mapData.size() > 0 ) ){
throw new Exception(" 参数 mapData 的值为空!");
}
// 键组装
// 操作标识 默认为 select
String operations = "select";
String condition = " a.* from " + tableName + " a where ";
if( operation != null && !operation.equals("") ){
if( operation.equals("update") || operation.equals("UPDATE") ){
operations = "update";
condition = " " + tableName + " a set ";
}else if( operation.equals("delete") || operation.equals("DELETE") ){
operations = "delete";
condition = " from " + tableName + " a where ";
}else if( operation.equals("insert") || operation.equals("INSERT") ){
operations = "insert";
condition = " into " + tableName + " values (";
String link = "";
Iterator<?> iterator = mapData.keySet().iterator();
while (iterator.hasNext()) {
String next = (String) iterator.next();
if( next.lastIndexOf("Key_") == -1){
condition += link + next;
link = ",";
}
}
condition += ") values( ";
}
} // 值组装
String value= "";
String link ="";
String keyValueOperations = " where ";
Iterator<? extends Map.Entry<?, ?>> iterator = mapData.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<?, ?> next = iterator.next();
if( next.getValue() instanceof String ){
value = "'" + next.getValue() +"'";
}else {
if( next.getValue() == null ){
value = "";
}else {
value = "" + next.getValue() +"";
}
}
if( next.getKey().toString().lastIndexOf("Key_") == -1 ){
if( !operations.equals("insert")){
if( operations.equals("select") || operations.equals("delete")){
condition += link + "a." + next.getKey();
if( value.equals("") ){
condition += value;
}else {
condition += "=" + value;
}
link = " and ";
}else {
condition += link + " a." + next.getKey();
condition += "=" + value;
link = ",";
}
}else {
condition += link + value;
link = ",";
}
}else {
continue;
}
} // 组装 insert sql 的结尾
if( operations.equals("insert") ){
condition += ")";
}else if(operations.equals("update")){ // 组装 update sql 的结尾
condition += " where ";
String and = "";
Iterator<? extends Map.Entry<?, ?>> iterator1 = mapData.entrySet().iterator();
while (iterator1.hasNext()) {
Map.Entry<?, ?> next = iterator1.next();
if( next.getValue() instanceof String ){
value = "'" + next.getValue() +"'";
}else {
value = "" + next.getValue() +"";
}
String key = next.getKey().toString();
if( key.lastIndexOf("Key_") != -1 ){
key = key.substring(key.indexOf("Key_")+ 4,key.length());
condition += and +"a." +key + "=" + value;
and = " and ";
}
}
} sql = operations + condition;
}else { // 不使用组装sql的功能
sql = mySql;
}
return sql;
}
使用案例:
public static void main(String[] args) throws Exception {
Map<String ,Object> map = new HashMap<>();
map.put("stuName","欧可乐");
map.put("stuAge",20);
map.put("stuSex","");
map.put("Key_stuId","XXX");
map.put("Key_stuSex","VVV");
String select = getSql2("table_name", "select", map, false, "");
System.out.println(select);
System.out.println();
String insert = getSql2("table_name", "insert", map, false, "");
System.out.println(insert);
System.out.println();
String delete = getSql2("table_name", "delete", map, false, "");
System.out.println(delete);
System.out.println();
String update = getSql2("table_name", "update", map, false, "");
System.out.println(update);
}
生成的SQL语句:

简单动态组装select语法案例:
public static void main(String[] args) throws Exception {
Map<String ,Object> map = new HashMap<>();
map.put("stuName","欧可乐");
map.put("stuSex","男");
map.put("stuSex is not null or a.stuAge > 19 ",null);
String select = getSql2("table_name", "select", map, false, "");
System.out.println(select);
}
生成的SQL语句:

Java 实现简单的SQL动态组装工具类的更多相关文章
- 简单了解Spring中常用工具类_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口, ...
- java调用kettle的job和transfer工具类
package com.woaiyitiaocai.util; import java.util.Map; import java.util.UUID; import org.apache.log4j ...
- Java Class与反射相关的一些工具类
package com.opslab.util; import org.apache.log4j.Logger; import java.io.File;import java.io.IOExcept ...
- Java语言Lang包下常用的工具类介绍_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都 ...
- java 生成简单word(利用Itext工具),生成简单Excel,以及下载笔记
1.java 生成简单word(包含图片表格) pom中加入itext 相关依赖 <dependency> <groupId>com.lowagie</groupId&g ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- java springboot调用第三方接口 借助hutoool工具类 爬坑
楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...
- php简单实用的操作文件工具类(创建、移动、复制、删除)
php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) { // 原目录,复制到的目录 $dir = opend ...
- Java操作zip压缩和解压缩文件工具类
需要用到ant.jar(这里使用的是ant-1.6.5.jar) import java.io.File; import java.io.FileInputStream; import java.io ...
随机推荐
- [转帖]Swagger介绍及使用
Swagger介绍及使用 32018.12.07 01:39:21字数 2241阅读 89207 https://www.jianshu.com/p/349e130e40d5 导语: 相信无论是前端还 ...
- 【51nod】2622 围绕着我们的圆环
[51nod] 2622 围绕着我们的圆环 kcz出的一道比赛题 第一次写带修改的线性基 ps:我觉得我计数计的好麻烦 首先是这个可以认为第二个矩阵是\(q\)个\(s\)位数,如果这\(q\)个数的 ...
- 只学python行吗
常言道:"流水的语言,铁打的Python",目前它可以说是已经"睥睨天下,傲视群雄"了.它天生丽质,易于读写,非常实用,从而赢得了 广泛的群众基础,被誉为&qu ...
- Java中 final和static解析
一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理 ...
- (1+x)^n
#include<stdio.h> int main() { int n,i; while(scanf("%d %d",&n,&i)!=EOF) { i ...
- 解决 windows oracle ORA-01113和ORA-01110错误
windows2008上的数据库版本为11.2.0.4.0,数据库打开为mount状态.报错如下: SQL> startup ORACLE instance started. Total Sys ...
- Thread,Task,async/await,IAsyncResult
1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主 ...
- 原来你是这样的PaaS!
啥叫PaaS? 许多人身处互联网领域,对PaaS仍然是雾里看花.它看似复杂,其实只要用对看法,人人都可以轻松的认识它. 网络上盛传着用pizza为例子帮助人们了解什么是PaaS,那么编者今天也不举栗子 ...
- Geometers Anonymous Club CodeForces - 1195F (闵可夫斯基和)
大意: 给定$n$个凸多边形, $q$个询问, 求$[l,r]$内闵可夫斯基区间和的顶点数. 要用到一个结论, 闵可夫斯基和凸包上的点等于向量种类数. #include <iostream> ...
- 游记-pkupc&cts2019
Day0 和boshi.Rayment组的队,昨天听学长说这次比赛可以加学分,他们信科的大部分人都会参加,估摸有两百多支队伍--然而奖品只有不到一百份 我要奖品呐! 上午十一点半到的北京,拉着行李提着 ...