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 上面的只是原文 ...
随机推荐
- Eclipse For JavaEE安装、配置、测试
Eclipse For JavaEE安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.安装与配置 4.JavaSE开发测试(确保JDK已正确安装) 5.JavaEE开发 ...
- leetcode — anagrams
import java.util.*; /** * * Source : https://oj.leetcode.com/problems/anagrams/ * * Created by lverp ...
- MySQL中间件之ProxySQL(9):ProxySQL的查询缓存功能
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的 ...
- 南大算法设计与分析课程复习笔记(3)L3 - Recursion
一.递归方程 按照分治的思想,可以将一个递归的复杂度写成递归方程 一.解递归方程--猜然后证明 该方法又称为代入法,步骤如下: 1.猜解的形式 2.数学归纳法证明正确 例子: 我们假设有如下递归式: ...
- html5入门:教你用canvas写一个时钟
今天的时间比较充裕,心血来潮,为大家分享一个html5的小例子,希望对刚学html5或者是没学html5正准备学的“童鞋们”展示一个小案例,希望对你们的学习有帮助!高手嘛!请跳过吧! 好了,闲话少数, ...
- 【转载】IIS报错不是有效的Win32应用程序
今天在IIS中部署ASP.NET网站后,访问网站报错,提示信息为:未能加载文件或程序集XXX.dll或它的某一个依赖项,不是有效的Win32应用程序(异常来至HRESULT:0x800700C1).通 ...
- c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错
如果一个对象的值为null,那么它调用扩展方法时会报错吗? Person p = null ; p.ExtendMethod(); 上述代码出现的情况不会报错,刚开始遇到这种情况时很纳闷,就去问了大牛 ...
- python网络编程-udp
目录 1. 创建socket 2. udp网络程序-发送数据 3. udp网络程序-接收数据 4. python3中的编码转换 5. udp端口绑定 1. 创建socket 在 Python 中 使用 ...
- ANOVA (paper from the onlinestat)
Introduction Author(s) David M. Lane Prerequisites Variance, Significance Testing,All Pairwise Compa ...
- 构造方法为private与类修饰符为final
构造方法为private的:在这个类外1:不能继承这个类2:不能用new来产生这个类的实例 在这个类内:1:可以继承这个类2:可以用new来产生这个类的实例 类修饰符为final的:在这个类外1:不能 ...