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的更多相关文章

  1. MySQL数据库增删改查SQL语句(2018整理集合大全)

    查看数据库 show databases;  使用数据库 use 数据库名; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 DROP DATABASE 数据库名; 创建表 cre ...

  2. 转载-增删改查sql语句语法

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...

  3. Oracle增删改查sql语句

    --创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m --创 ...

  4. mysql增删改查sql语句

    未经允许,禁止转载!!!未经允许,禁止转载!!! 创建表   create table 表名删除表    drop table 表名修改表名   rename table 旧表名 to 新表名字创建数 ...

  5. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  6. 微软Connect教程系列--自动生成增删改查页面工具介绍(二)

    本章课程描述了vs2015的三个特点,其中主要将描述在vs2015下面,使用命令自动生成增删改查界面,具体如下: 1.web.config文件不在存在,用config.json替代,以适应支撑vs的插 ...

  7. java对xml文件做增删改查------摘录

    java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...

  8. Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码

    关于T4代码生成这块,我之前写过几篇帖子,如:<Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)>(http://www.cnblogs.co ...

  9. NetCore2.0 RozarPage自动生成增删改查

    原文链接:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger 上面的只是原文 ...

随机推荐

  1. 13 Tensorflow API主要功能

    要想使用Tensorflow API,首先要知道它能干什么.Tensorflow具有Python.C++.Java.Go等多种语言API,其中Python的API是最简单和好用的. Tensor Tr ...

  2. 在go modules里使用go get进行包管理

    上一篇文章里我们介绍了go modules的初步使用,现在我们来更深入的了解一下如何使用go get在module中管理依赖. module下的包管理 首先我们介绍过go mod edit修改go.m ...

  3. C# 动态代码生成控件后其他事件不能获取该控件的值

    1.新建web项目,添加两个Button控件,结果如图. 2.Button按钮控件点击事件代码如下 protectedvoid Button1_Click(object sender, EventAr ...

  4. 【worker】js中的多线程

    因为下个项目中要用到一些倒计时的功能,所以就提前准备了一下,省的到时候出现一下界面不友好和一些其他的事情.正好趁着这个机会也加深一下html5中的多线程worker的用法和理解. Worker简介 J ...

  5. MyBatis:事务回滚

    事务的隔离级别:DEFAULT.READ_UNCOMMITED.READ_COMMITTED.REPEATABLE_READ.SERIALIZABLE 事务的传播行为:REQUIRED.SUPPORT ...

  6. 学习HttpClient,从两个小例子开始

    前言 HTTP(Hyper-Text Transfer Protocol,超文本传输协议)在如今的互联网也许是最重要的协议,我们每天做的很多事情都与之有关,比如,网上购物.刷博客.看新闻等.偶尔你的上 ...

  7. crontab 配置文件

    1.系统配置文件 etc/crontab 2.vim打开crontab 以上配置解释 1. 代表用bash去执行shell command line2.代表crontab 默认的环境变量3.cront ...

  8. 微信小程序使用wxParse,解决图片显示路径问题

    我们经常用到发布文章,用的是UEditor百度富文本编辑器,方便排版,存储的也是html代码,这样小程序解析出来的也是排版的样式,但是使用wxParse解析html的时候,因为存储的是图片的相对路径, ...

  9. springboot 集成 mybatis

    1,添加依赖 <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId& ...

  10. C# 实现FTP客户端

    本文是利用C# 实现FTP客户端的小例子,主要实现上传,下载,删除等功能,以供学习分享使用. 思路: 通过读取FTP站点的目录信息,列出对应的文件及文件夹. 双击目录,则显示子目录,如果是文件,则点击 ...