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 ...
随机推荐
- 网站架构(LNMP)
说明: 1)LNMP架构的组成(作用) 2)LNMP架构的部署 3)LNMP架构通讯原理 4)LNMP服务之间如何建立管理 nginx+php 运维负责 php+mysql 开发负责 5) 运 ...
- 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性
大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...
- IO-file-06 文件夹的遍历
/** * 列出下一级 * 1.list(): 列出下级名称 String[] list = dir.list(); * 2.listFiles():列出下级File对象 File[] listF ...
- Python基础——numpy库的使用
1.numpy库简介: NumPy提供了许多高级的数值编程工具,如:矩阵数据类型.矢量处理,以及精密的运算库.专为进行严格的数字处理而产生. 2.numpy库使用: 注:由于深度学习中存在大量的 ...
- 数值类型与std::string的相互转换
1.使用std::stringstream: //将in_value值转换成out_type类型 template<class out_type, class in_value> out_ ...
- Django多对多关系建立及Form组件
目录 Django多对多关系 1.创建方式一全自动 2.创建方式二纯手撸 3.半自动(推荐使用) forms校验组件 使用forms组件实现注册功能 form常用字段和插件 数据校验 钩子函数 HOO ...
- 四、poll()、select()和epoll()
在用户程序中,poll()和select()系统调用用于对设备进行无阻塞访问.poll()和select()最终会调用设备驱动中的poll()函数,在我所使用的Linux内核中,还有扩展的poll() ...
- docker部署Eurake服务,服务节点无法注册服务
前言 昨天在部署一个docker项目时遇到了一个问题,故记录下来. 环境说明 Centos7 Docker version 18.06.3-ce, build d7080c1 问题说明 该项目分别启动 ...
- WinRAR 去广告的姿势
一直在使用WinRAR解压文件,感觉非常的好用,可是现在WinRAR添加了广告,每次打开压缩包都会弹出广告,有时候甚至在解压的时候弹出来,而每次弹出广告都会卡顿一下,忍了很长时间今天实在是受够了,准备 ...
- java多线程:继承Thread和实现Runable接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...