最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射 JavaBean對象自動生成插入,更新,刪除,查詢sql語句操作

 更新時(shí)間:2020年08月20日 10:07:39   作者:三朵耳朵  
這篇文章主要介紹了Java反射 JavaBean對象自動生成插入,更新,刪除,查詢sql語句操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

通過反射根據(jù)提供的表名、POJO類型、數(shù)據(jù)對象自動生成sql語句。

如名為 User 的JavaBean與名為 user 的數(shù)據(jù)庫表對應(yīng),可以提供一個(gè)封裝有數(shù)據(jù)的User對象user,根據(jù)user中含有的數(shù)據(jù)自動生成sql語句。

1、生成插入語句(插入user中包含的非空數(shù)據(jù)的語句):

String insertSql = getInsertSql("user", User.class, user);

2、生成更新語句(user中id不能為空):

String updateSql = getUpdateSql("user", User.class, user);

3、生成刪除語句(根據(jù)user中第一個(gè)非空屬性值作為查找條件刪除):

//生成刪除id為1的語句
User user = new User();
user.setId(1);
String deleteSql = getDeleteSql("user", User.class, user);

4、生成查詢語句(根據(jù)user中第一個(gè)非空屬性值為查找條件):

//生成查詢id為1的語句
User user = new User();
user.setId(1);
String selectSql = getSelectSql("user", User.class, user);
package com.hims.util;
 
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.hims.bean.User;
import java.lang.reflect.Field;
 
public class ProduceSql {
 //String insertSql = getInsertSql("user", User.class, user);
 
 /**
 * 生成插入語句
 * @param tablename 表明
 * @param t 有數(shù)據(jù)的實(shí)體
 * @param <T> 數(shù)據(jù)實(shí)體類型 如 User
 */
 public static <T> String getInsertSql(String tablename, T t) throws IllegalArgumentException {
 //insert into table_name (column_name1,column_name2, ...) values (value1,value2, ...)
 boolean flag = false;
 String sql = "";
 Field[] fields = ReflectUtil.getFieldsDirectly(t.getClass(), false);
 StringBuffer topHalf = new StringBuffer("insert into "+tablename+" (");
 StringBuffer afterAalf = new StringBuffer("values (");
 for (Field field : fields) {
  if ("ID".equals(field.getName()) || "id".equals(field.getName())){
  continue; //id 自動生成無需手動插入
  }
  topHalf.append(field.getName() + ",");
  if (ReflectUtil.getFieldValue(t, field.getName()) instanceof String) {
  afterAalf.append("'" + ReflectUtil.getFieldValue(t, field.getName()) + "',");
  flag = true;
  } else {
  afterAalf.append(ReflectUtil.getFieldValue(t, field.getName()) + ",");
  flag = true;
  }
 }
 if (!flag) {
  throw new IllegalArgumentException(t.getClass() + "NullException.\nThere is no attribute that is not empty.You must provide an object with at least one attribute.");
 }
 topHalf = new StringBuffer(StrUtil.removeSuffix(topHalf.toString(), ","));
 afterAalf = new StringBuffer(StrUtil.removeSuffix(afterAalf.toString(), ","));
 topHalf.append(") ");
 afterAalf.append(") ");
 sql = topHalf.toString() + afterAalf.toString();
 return sql;
 }
 
 /**
 * 生成更新語句
 * 必須含有id
 * 數(shù)據(jù)實(shí)體中 null 與 空字段不參與更新
 * @param tablename 數(shù)據(jù)庫中的表明
 * @param t 有數(shù)據(jù)的實(shí)體
 * @param <T> 數(shù)據(jù)實(shí)體類型,如 User
 */
 public static <T> String getUpdateSql(String tablename, T t) throws IllegalArgumentException {
 //UPDATE table_name SET column_name1 = value1, column_name2 = value2, ... where ID=xxx
 //or
 //UPDATE table_name SET column_name1 = value1, column_name2 = value2, ... where id=xxx
 boolean flag = false;
 String sql = "";
 String id = ""; //保存id列名:ID or id
 Field[] fields = ReflectUtil.getFieldsDirectly(t.getClass(), false);
 sql = "update "+tablename+" set ";
 for (Field field : fields) {
  StringBuffer tmp = new StringBuffer();
  if ("ID".equals(field.getName()) || "id".equals(field.getName())){
  id = field.getName();
  continue;//更新的時(shí)候無需set id=xxx
  }
  if (ReflectUtil.getFieldValue(t, field.getName()) != null && (String)ReflectUtil.getFieldValue(t, field.getName()) != "") {
  tmp.append( field.getName() + "=");
  if (ReflectUtil.getFieldValue(t, field.getName()) instanceof String) {
   tmp.append( "'" + ReflectUtil.getFieldValue(t, field.getName()) + "',");
   flag = true;
  } else {
   tmp.append(ReflectUtil.getFieldValue(t, field.getName()) + ",");
   flag = true;
  }
  sql += tmp;
  }
 }
 if (!flag) {
  throw new IllegalArgumentException(t.getClass() + "NullException.\nThere is no attribute that is not empty except for ID.You must provide an object with at least one attribute exclude ID.");
 }
 sql = StrUtil.removeSuffix(sql, ",") + " where " + id + "='" + ReflectUtil.getFieldValue(t, id)+"'";
 return sql;
 }
 
 /**
 * 生成刪除語句
 * 根據(jù) user 中第一個(gè)不為空的字段刪除,應(yīng)該盡量使用 id,提供至少一個(gè)非空屬性
 * @param tablename 表明
 * @param t 有數(shù)據(jù)的實(shí)體
 * @param <T> 數(shù)據(jù)實(shí)體類型 如 User
 */
 public static <T> String getDeleteSql(String tablename, T t) throws IllegalArgumentException {
 //delete from table_name where column_name = value
 return getSelectOrDeleteSql(tablename, t, "delete");
 }
 
 /**
 * 生成查詢語句
 * 根據(jù) user 中第一個(gè)不為空的字段查詢
 * @param tablename 表名
 * @param t 有數(shù)據(jù)的實(shí)體
 * @param <T> 數(shù)據(jù)實(shí)體類型 如 User
 */
 public static <T> String getSelectSql(String tablename, T t) throws IllegalArgumentException {
 //delete from table_name where column_name = value
 return getSelectOrDeleteSql(tablename, t, "select *");
 }
 
 /**
 * 根據(jù) operation 生成一個(gè)如:operation from table_name where column_name = value 的sql語句
 * @param tablename
 * @param t
 * @param operation "select *" or "delete"
 * @param <T>
 * @return
 * @throws IllegalArgumentException
 */
 private static <T> String getSelectOrDeleteSql(String tablename, T t, String operation) throws IllegalArgumentException {
 //operation from table_name where column_name = value
 boolean flag = false;
 String sql = "";
 Field[] fields = ReflectUtil.getFieldsDirectly(t.getClass(), false);
 StringBuffer topHalf = new StringBuffer(operation + " from " + tablename + " where ");
 for (Field field : fields) {
  if ("ID".equals(field.getName()) || "id".equals(field.getName())) {
  if (ReflectUtil.getFieldValue(t, field.getName()) != null && (int)ReflectUtil.getFieldValue(t, field.getName()) != 0) {
   //id 不為空
   topHalf.append(field.getName() + " = " + ReflectUtil.getFieldValue(t, field.getName()));
   flag = true;
   break;
  }
  }
  else {
  if (ReflectUtil.getFieldValue(t, field.getName()) != null && (String)ReflectUtil.getFieldValue(t, field.getName()) != "") {
   topHalf.append(field.getName() + " = '" + ReflectUtil.getFieldValue(t, field.getName()) + "'");
   flag = true;
   break;
  }
  }
 }
 if (!flag) {
  throw new IllegalArgumentException(t.getClass() + "NullException.\nThere is no attribute that is not empty.You must provide an object with at least one attribute.");
 }
 sql = topHalf.toString();
 return sql;
 }
}
 

補(bǔ)充知識:通過java反射實(shí)現(xiàn)對javabean生成各種sql語句

通過java反射實(shí)現(xiàn)對javabean生成各種sql語句,有請大家評論,更改

package com.pdt.util;
 
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; 
 
public class BeanUtil {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		System.out.println(getBeanFilesList("com.pdt.bean.Dictionary"));
		
		System.out.println(genCreateTableSql("com.pdt.bean.Dictionary"));
		
		System.out.println(genInsertSql("com.pdt.bean.Dictionary"));
	}
	
	public static String getBeanName(String bean){
		try {
			Class clz = Class.forName(bean);
			String clzStr = clz.toString();
			//得到類名
			String beanName = clzStr.substring(clzStr.lastIndexOf(".")+1).toLowerCase();
			return beanName;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return "";
		}
	}
	
	public static List<String> getBeanPropertyList(String bean){
		try {
			Class clz = Class.forName(bean);
			Field[] strs = clz.getDeclaredFields();
			List<String> propertyList = new ArrayList<String>();
			for (int i = 0; i < strs.length; i++) {
				String protype = strs[i].getType().toString();
				propertyList.add(protype.substring(protype.lastIndexOf(".")+1)+"`"+strs[i].getName());
			}
			return propertyList;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static String getBeanFilesList(String bean){
		try {
			Class clz = Class.forName(bean);
			Field[] strs = clz.getDeclaredFields();
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < strs.length; i++) {
				String protype = strs[i].getType().toString();
				if (!strs[i].getName().equals("tableName")&&!strs[i].getType().equals("List")) {
				 sb.append(strs[i].getName()+",");
				}
			}
			sb.deleteCharAt(sb.toString().lastIndexOf(","));
			return sb.toString();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 生成建表語句
	 * @param bean
	 * @return
	 */
	public static String genCreateTableSql(String bean){
		List<String> beanPropertyList = getBeanPropertyList(bean);
		StringBuffer sb = new StringBuffer("create table wnk_pdt_"+getBeanName(bean)+"(\n");
		for (String string : beanPropertyList) {
			String[] propertys = string.split("`");
			if (!propertys[1].equals("tableName")&&!propertys[1].equals("param")&&!propertys[0].equals("List")) {
				if (propertys[1].equals("id")) {
					sb.append(" id bigint primary key auto_increment,\n");
				} else {
					if (propertys[0].equals("int")) {
						sb.append(" " + propertys[1] + " int default 0 comment '',\n");
					} else if (propertys[0].equals("String")) {
						sb.append(" " + propertys[1] + " varchar(2000) default '' comment '',\n");
					} else if (propertys[0].equals("double")) {
						sb.append(" " + propertys[1] + " double(10,2) default 0.0 comment '',\n");
					} else if (propertys[0].equals("Date")) {
						sb.append(" " + propertys[1] + " datetime comment '',\n");
					}
				}
			}
		}
		sb.append(")");
		sb.deleteCharAt(sb.lastIndexOf(","));
		return sb.toString();
	}
	
	/**
	 * 生成查詢語句
	 * @param bean
	 * @return
	 */
	public static String genSelectAllSql(String bean){
		String filesList = getBeanFilesList(bean);
		return "select \n "+filesList+" \n from \n wnk_pdt_"+getBeanName(bean)+"";
	}
	
	/**
	 * 生成插入語句
	 * @param bean
	 * @return
	 */
	public static String genInsertSql(String bean){
		String filesList = getBeanFilesList(bean);
		int fl = DataUtil.getCountSonStr(filesList,",")+1;
		String wenhao = "";
		for (int i = 0; i < fl; i++) {
			if(i==fl-1){
				wenhao = wenhao+"?";
			}else{
				wenhao = wenhao+"?,";
			}
		}
		return "insert into wnk_pdt_"+getBeanName(bean)+"("+filesList+") values("+wenhao+")";
	}
}

以上這篇Java反射 JavaBean對象自動生成插入,更新,刪除,查詢sql語句操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中json處理工具JsonPath的使用教程

    Java中json處理工具JsonPath的使用教程

    JsonPath類似于XPath,是一種json數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)定位和導(dǎo)航表達(dá)式語言,這篇文章主要為大家介紹了JsonPath的基本使用,需要的小伙伴可以參考下
    2023-08-08
  • 舉例詳解用Java實(shí)現(xiàn)web分頁功能的方法

    舉例詳解用Java實(shí)現(xiàn)web分頁功能的方法

    這篇文章主要介紹了舉例詳解用Java實(shí)現(xiàn)web分頁功能的方法,這種基本功能現(xiàn)一般通過Hibernate框架來完成,需要的朋友可以參考下
    2015-10-10
  • Java學(xué)習(xí)隨記之多線程編程

    Java學(xué)習(xí)隨記之多線程編程

    這篇文章主要介紹了Java中的多線程編程的相關(guān)知識,文中的示例代碼介紹詳細(xì),對我們的學(xué)習(xí)或工作有一定的價(jià)值,感興趣的小伙伴可以了解一下
    2021-12-12
  • Java局部打印效果不同問題解決方案

    Java局部打印效果不同問題解決方案

    這篇文章主要介紹了Java局部打印效果不同問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中AIO、BIO、NIO應(yīng)用場景及區(qū)別

    Java中AIO、BIO、NIO應(yīng)用場景及區(qū)別

    本文主要介紹了Java中AIO、BIO、NIO應(yīng)用場景及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器

    這篇文章主要介紹了使用IDEA如何打包發(fā)布SpringBoot并部署到云服務(wù)器問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 淺談Java如何實(shí)現(xiàn)一個(gè)基于LRU時(shí)間復(fù)雜度為O(1)的緩存

    淺談Java如何實(shí)現(xiàn)一個(gè)基于LRU時(shí)間復(fù)雜度為O(1)的緩存

    這篇文章主要介紹了淺談Java如何實(shí)現(xiàn)一個(gè)基于LRU時(shí)間復(fù)雜度為O(1)的緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 基于springEL表達(dá)式詳解及應(yīng)用

    基于springEL表達(dá)式詳解及應(yīng)用

    這篇文章主要介紹了springEL表達(dá)式詳解及應(yīng)用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 十五道tomcat面試題,為數(shù)不多的機(jī)會!

    十五道tomcat面試題,為數(shù)不多的機(jī)會!

    這篇文章主要介紹了十五道tomcat面試題,Tomcat的本質(zhì)是一個(gè)Servlet容器。一個(gè)Servlet能做的事情是:處理請求資源,并為客戶端填充response對象,需要的朋友可以參考下
    2021-08-08
  • java郵件發(fā)送的實(shí)現(xiàn)

    java郵件發(fā)送的實(shí)現(xiàn)

    本篇是用于java來實(shí)現(xiàn)郵件的發(fā)送的實(shí)例代碼,基于smtp服務(wù),有需要的可以參考一下。
    2016-10-10

最新評論

孝感市| 定结县| 乐陵市| 杭州市| 景宁| 博爱县| 军事| 祁门县| 中江县| 开阳县| 积石山| 固镇县| 雅江县| 民乐县| 桐庐县| 和龙市| 姜堰市| 仙居县| 武宣县| 大关县| 承德县| 阜康市| 南京市| 如皋市| 尚志市| 尉犁县| 鄂尔多斯市| 勐海县| 永善县| 济阳县| 克山县| 长阳| 陇南市| 通海县| 客服| 龙山县| 西丰县| 西乡县| 樟树市| 上虞市| 迁西县|