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 上面的只是原文 ...
随机推荐
- jvm详情——1、堆中存什么?栈中存什么?
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...
- 教你一个vue小技巧,一般人我不说的
本文由云+社区发表 1. 需求 最近的项目中,需要实现在vue框架中动态渲染带提示框的单选/多选文本框,具体的效果如下图所示,在输入框聚焦时,前端组件通过接收的kv参数渲染出选项,用户点击选项,可以将 ...
- 读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥
介绍 DK1.5之后,提供了读写锁ReentrantReadWriteLock,读写锁维护了一对锁:一个读锁,一个写锁.通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升.在读多写少的情况下, ...
- RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用
深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...
- 第6章 LVM详解
6.1 LVM相关概念和机制 LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的. lvm需要使用的软件包为lvm2 ...
- 翻译:ZooKeeper OverView
ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk ZooKeeper: 分布式协调服务 ZooKeeper是一个开 ...
- 如何扩展VS2017未安装的功能
扩展VS2017未安装的功能 我们在使用VS2017时,由于VS2017该ide功能过于强大,使用范围涵盖多个领域,我们在安装VS2017时很多时候只需要安装自己需要的某部分的功能即可,这个步骤在软件 ...
- 从零开始学安全(十五)●DHCP服务
DHCP,全名为:Dynamic Host Configuration Protocol,动态主机配置协议,它是一种基于UDP的局域网协议,其作用主要有:给主机自动分配IP地址,管理员通过该协议管理内 ...
- Prism 学习:从本地目录加载 Module
在 Prism 中,将外部模块加载到主程序有以下几种方式:Code.XAML.配置文件.指定模块目录:其中,如果要使用 Code 方式来加载 Module,则需要将该 Module 引用到当前项目中: ...
- [android] android下创建一个sqlite数据库
Sqlite数据库是开源的c语言写的数据库,android和iphone都使用的这个,首先需要创建数据库,然后创建表和字段,android提供了一个api叫SQLiteOpenHelper数据库的打开 ...