java 根据实体对象生成 增删改的SQL语句

<pre name="code" class="java">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;
/**
 * @author Gary Huang
 * 博客地址:http://blog.csdn.net/hfmbook/article/details/41290641
 *
 * */
public class UpdateSql {
	private Object target ; 

	private String idName ; 

	private Object idValue ; 

	private SqlType currentType ; 

	public enum SqlType {
		INSERT, UPDATE, DELETE
	}

	public UpdateSql(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 ;
		}
	}
	/**
	 * 创建跟删除
	 * */
	private void createDelete() {
		String tableName = getTableName() ;
		Field[] fields = target.getClass().getDeclaredFields() ;
		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));
				}
			}
		}
		this.sqlBuffer = sqlBuffer.toString();
	}

	public 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() ;
		Field[] fields = target.getClass().getDeclaredFields() ;
		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)   ;
					}
				}
			}
			if(idName == null){
				throw new RuntimeException( "not found of " + target.getClass() + "'s ID") ;
			}
			sqlBuffer.append(" WHERE ").append(idName)
			.append("=?") ;
			param.add( idValue );

		this.sqlBuffer = sqlBuffer.toString() ;
	}

	/**
	 * 根据注解获取表名
	 * */
	private String getTableName() {
		String tableName = null ;
		Class<?> clazz = target.getClass() ;
		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() ;
		Field[] fields = target.getClass().getDeclaredFields() ;
		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(")");

		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;
	}

	@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 "";
	}

	@java.lang.annotation.Target(value={java.lang.annotation.ElementType.FIELD})
	@java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
	public @interface ID{
	}
}
				
时间: 2024-10-16 15:05:04

java 根据实体对象生成 增删改的SQL语句的相关文章

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

查看数据库 show databases; 使用数据库 use 数据库名;创建数据库 CREATE DATABASE 数据库名;删除数据库 DROP DATABASE 数据库名;创建表 create table 表名(    列名1 类型(长度) [约束],    列名2 类型(长度) [约束],    ……);长度区别int类型带长度:不影响存取值,即使设定的值超出了长度的范畴,也能存,如果没有达到设定的长度,则使用空格自动填充到设定的长度char类型:不可变字符,设定的长度就是规定当前字段能

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

一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdents (姓名,性别,出生日期) values ('王伟华','男','1983/6/15')  注意:如果省略表名,将依次插入所有列 2.使用insert,select语句将现有表中的 数据添加到已有的新表中 语法:insert into <已有的新表> <列名> select <

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

前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在需要存储一些数据,或者拿到一些数据的时候,就需要往数据库里存取数据,那么java如何连接数据库呢?需要哪些步骤? 1.注册驱动 什么是驱动? 驱动就是JDBC实现类,通俗点讲,就是能够连接到数据库功能的东西就是驱动,由于市面上有很多数据库,Oracle.MySql等等,所以java就有一个连接数据库

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

本章课程描述了vs2015的三个特点,其中主要将描述在vs2015下面,使用命令自动生成增删改查界面,具体如下: 1.web.config文件不在存在,用config.json替代,以适应支撑vs的插件化. 即config.json可以在项目中不存在,你可以用xml文件或其他方式创建数据库连接. 2.获取nuget包更便捷 打开project.json,在dependencies节点输入“Newtonsoft.json”,并选择好相应版本,保存后,vs的引用就会自动从nuget上下载newton

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

原文链接:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger 上面的只是原文的上面的链接,右边的 没有链接,不能点击,不知道为什么.不过大家可以点击下面的下载PDF,下载后打开看就可以了 准备工作 VS2017需要15.3以后的版本,且安装完NetCore2.0 SDK Net Core 2.0 SDK下载链接:https://www.microsoft.com/net/c

BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面

前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4的语法,虽然没有完全掌握,但是算是有了一个大致的了解.于是乎有了今天的这篇文章:通过T4模板快速生成页面. KnockoutJS系列文章: JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) JS组件系列——BootstrapTable+KnockoutJS

hibernate关联对象的增删改查------查

本篇博客是之前博客hibernate关联对象的增删改查------查 的后继,本篇代码的设定都在前文已经写好,因此读这篇之前,请先移步上一篇博客 //代码片5 SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); session.beginTransa

MVC自动生成增删改查

1)创建控制器 生成代码如下(增删改查...) using MvcApplication32.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApplication32.Controllers { public class UserController : Controller { // /

Java API实现Hadoop文件系统增删改查

Java API实现Hadoop文件系统增删改查 Hadoop文件系统可以通过shell命令hadoop fs -xx进行操作,同时也提供了Java编程接口 maven配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap