java 根据实体对象生成 增删改的SQL语句 ModelToSQL
package com.xxx.utils; import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Vector; import org.apache.commons.lang3.reflect.FieldUtils; public class ModelToSQL {
private Object target; private String idName; private Object idValue; private SqlType currentType; public enum SqlType {
INSERT, UPDATE, DELETE
} public ModelToSQL(SqlType sqlType, Object target) {
this.target = target;
switch (sqlType) {
case INSERT:
currentType = SqlType.INSERT;
createInsert();
break;
case UPDATE:
currentType = SqlType.UPDATE;
createUpdate();
break;
case DELETE:
currentType = SqlType.DELETE;
createDelete();
break;
}
} public ModelToSQL(Class<?> target) {
String tableName = getTableNameForClass(target);
getFields(target); StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("DELETE FROM ").append(tableName).append(" WHERE ");
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
ID id = field.getAnnotation(ID.class);
if (null != id) {
sqlBuffer.append(field.getName()).append("=?");
}
}
}
this.sqlBuffer = sqlBuffer.toString();
} /**
* 创建跟删除
*/
private void createDelete() {
String tableName = getTableName();
getFields(target.getClass());
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("DELETE FROM ").append(tableName).append(" WHERE ");
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
ID id = field.getAnnotation(ID.class);
if (null != id) {
sqlBuffer.append(field.getName()).append(" = ? ");
param.add(readField(field));
}
}
}
System.err.println("delete:\t"+sqlBuffer.toString());
this.sqlBuffer = sqlBuffer.toString();
} protected Object readField(Field field) {
try {
return FieldUtils.readField(field, target, true);
} catch (Exception e) {
throw new RuntimeException(currentType.name(), e);
}
} /**
* 创建更新语句
*/
private void createUpdate() {
String tableName = getTableName();
getFields(target.getClass());
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("UPDATE ").append(tableName).append(" SET "); for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
ID id = field.getAnnotation(ID.class);
if (id == null) {
sqlBuffer.append(field.getName()).append("=? , ");
param.add(readField(field));
} else {
idName = field.getName();
idValue = readField(field);
}
}
}
sqlBuffer.replace(sqlBuffer.length()-2, sqlBuffer.length()-1, " ");
if (idName == null) {
throw new RuntimeException("not found of " + target.getClass() + "'s ID");
}
sqlBuffer.append(" WHERE ").append(idName).append("=?");
param.add(idValue);
System.err.println("update:\t"+sqlBuffer.toString());
this.sqlBuffer = sqlBuffer.toString();
} /**
* 根据注解获取表名
*/
private String getTableName() {
String tableName = null;
Class<?> clazz = target.getClass();
tableName = getTableNameForClass(clazz);
return tableName;
} private String getTableNameForClass(Class<?> clazz) {
String tableName;
Table table = clazz.getAnnotation(Table.class);
if (null != table) {
tableName = table.name();
if ("".equalsIgnoreCase(tableName)) {
tableName = clazz.getSimpleName();
}
} else {
tableName = clazz.getSimpleName();
}
return tableName;
} /**
* 创建插入语句
*/
private void createInsert() {
String tableName = getTableName();
getFields(target.getClass());
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("INSERT INTO ").append(tableName).append("("); for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
ID id = field.getAnnotation(ID.class);
if (id == null) {
sqlBuffer.append(field.getName()).append(",");
param.add(readField(field));
}
}
}
int length = sqlBuffer.length();
sqlBuffer.delete(length - 1, length).append(")values(");
int size = param.size();
for (int x = 0; x < size; x++) {
if (x != 0) {
sqlBuffer.append(",");
}
sqlBuffer.append("?");
}
sqlBuffer.append(")");
System.err.println("insert:\t"+sqlBuffer.toString());
this.sqlBuffer = sqlBuffer.toString();
} private List<Object> param = new Vector<Object>(); private String sqlBuffer; public List<Object> getParam() {
return param;
} public String getSqlBuffer() {
return sqlBuffer;
} public String getIdName() {
return idName;
} public Object getIdValue() {
return idValue;
} List<Field> fields = new Vector<Field>(); protected void getFields(Class<?> clazz) {
if (Object.class.equals(clazz)) {
return;
}
Field[] fieldArray = clazz.getDeclaredFields();
for (Field file : fieldArray) {
fields.add(file);
}
getFields(clazz.getSuperclass());
} //创建注解,标识该model的table名
@java.lang.annotation.Target(value = { java.lang.annotation.ElementType.TYPE })
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface Table {
String name() default "";
} //创建注解,标识该model的id字段
@java.lang.annotation.Target(value = { java.lang.annotation.ElementType.FIELD })
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface ID {
}
}
java 根据实体对象生成 增删改的SQL语句 ModelToSQL的更多相关文章
- MySQL数据库增删改查SQL语句(2018整理集合大全)
查看数据库 show databases; 使用数据库 use 数据库名; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 DROP DATABASE 数据库名; 创建表 cre ...
- 转载-增删改查sql语句语法
一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...
- Oracle增删改查sql语句
--创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m --创 ...
- mysql增删改查sql语句
未经允许,禁止转载!!!未经允许,禁止转载!!! 创建表 create table 表名删除表 drop table 表名修改表名 rename table 旧表名 to 新表名字创建数 ...
- Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用
前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...
- 微软Connect教程系列--自动生成增删改查页面工具介绍(二)
本章课程描述了vs2015的三个特点,其中主要将描述在vs2015下面,使用命令自动生成增删改查界面,具体如下: 1.web.config文件不在存在,用config.json替代,以适应支撑vs的插 ...
- java对xml文件做增删改查------摘录
java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...
- Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码
关于T4代码生成这块,我之前写过几篇帖子,如:<Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)>(http://www.cnblogs.co ...
- NetCore2.0 RozarPage自动生成增删改查
原文链接:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger 上面的只是原文 ...
随机推荐
- [NewLife.XCode]数据初始化
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- 字符串不相同出现相同HashCode(算法)
转自:https://blog.csdn.net/fly_grass_fish/article/details/81742794 在Java中有HashCode的说法,以前以为HashCode是唯一的 ...
- go使用rpc
RPC是远程过程调用的缩写(Remote Procedure Call),通俗地说就是调用远处的一个函数,是分布式系统中不同节点间流行的通信方式.Go语言的标准库提供了一个简单的RPC实现 serve ...
- Python机器学习笔记——随机森林算法
随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...
- sshfs基于ssh挂载远程目录
为了像本地一样访问远程主机上的目录,通常我们会在远程主机上使用nfs来导出目录,并在本地主机上mount这个nfs文件系统.如果是windows系统,则使用cifs或samba的方式来访问. 但可能我 ...
- Tomcat(一):背景知识和安装tomcat
Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 基础背景知识 1.1 java和jdk概念 无论是何种程序,要能在计算机 ...
- mvc 中合并两个list集合
有时候,在进行查询操作的时候需要将从数据库中查询的两张表进行合并,成为一张表然后返回给前端.或者在原有的一张表基础上面加几个新的字段. 这个时候可以新建一个.class[model类],在这个新建的m ...
- ElasticSearch安装及HEAD插件配置
1. 安装 ElasticSearch 直接下载 zip 包解压即可,假设解压到 E:\ESTool\elasticsearch-5.6.3 2. 安装 nodejs 和 npm head 插件本身是 ...
- 《c#图解教程》
书名 <c#图解教程> 图片 时间 2017-10-12月 学习 第20章的异步编程很好,在项目里面很有用.东西有点多时间久了不用就忘了
- frp 初探
条件: (1) 服务器端要有公网 IP (2) 客户端能上网,能够访问服务器的公网 IP 下载 https://github.com/fatedier/frp/releases 根据服务器和客户端的操 ...