Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作
作者:三朵耳朵 发布时间:2022-04-05 20:07:11
标签:Java,反射,JavaBean,sql语句
通过反射根据提供的表名、POJO类型、数据对象自动生成sql语句。
如名为 User 的JavaBean与名为 user 的数据库表对应,可以提供一个封装有数据的User对象user,根据user中含有的数据自动生成sql语句。
1、生成插入语句(插入user中包含的非空数据的语句):
String insertSql = getInsertSql("user", User.class, user);
2、生成更新语句(user中id不能为空):
String updateSql = getUpdateSql("user", User.class, user);
3、生成删除语句(根据user中第一个非空属性值作为查找条件删除):
//生成删除id为1的语句
User user = new User();
user.setId(1);
String deleteSql = getDeleteSql("user", User.class, user);
4、生成查询语句(根据user中第一个非空属性值为查找条件):
//生成查询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 有数据的实体
* @param <T> 数据实体类型 如 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
* 数据实体中 null 与 空字段不参与更新
* @param tablename 数据库中的表明
* @param t 有数据的实体
* @param <T> 数据实体类型,如 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;//更新的时候无需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;
}
/**
* 生成删除语句
* 根据 user 中第一个不为空的字段删除,应该尽量使用 id,提供至少一个非空属性
* @param tablename 表明
* @param t 有数据的实体
* @param <T> 数据实体类型 如 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");
}
/**
* 生成查询语句
* 根据 user 中第一个不为空的字段查询
* @param tablename 表名
* @param t 有数据的实体
* @param <T> 数据实体类型 如 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 *");
}
/**
* 根据 operation 生成一个如: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;
}
}
补充知识:通过java反射实现对javabean生成各种sql语句
通过java反射实现对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+")";
}
}
来源:https://blog.csdn.net/qq_37499840/article/details/89599829
0
投稿
猜你喜欢
- 一、创建支付宝沙箱跳转 : 支付宝沙箱平台1、进入控制台2、创建小程序,编写名称和绑定商家即可3、返回第一个页面,往下滑进入沙箱4、进行相关
- springboot + docker + jenkins自动化部署项目,jenkins、mysql、redis都是docker运行的,并且
- springboot sqlSessionFactoryBean自定义1.新建一个配置类,加上configuration注解2.定制化Sql
- 一、lombok简介lombok 提供了使用注解的形式帮助简化消除java代码。在编写Java代码时,通过使用对应的注解,可以简化开发,同时
- Java 获取文件大小今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法;另外
- 在我们的服务中不可避免的需要使用到一些秘钥(数据库、redis等)开发和测试环境还好,但生产如果采用明文配置讲会有安全问题,jasypt是一
- 前言Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util
- 一些Java项目中在mybatis与spring整合中有MapperScannerConfigurer的使用,该类通过反向代理自动生成基于接
- 1、首先导入solrj需要的的架包2、需要注意的是低版本是solr是使用SolrServer进行URL实例的,5.0之后已经使用SolrCl
- 关于UIToolbarToolBar工具栏是视图View的属性,可以在工具栏上添加工具栏按钮Bar Button Item(可以是自定义的C
- 最近要做一个java web项目,因为页面不是很多,所以就没有前后端分离,前后端写在一起,这时候就用到thymeleaf了,以下是不动脑式的
- 前言多数据源的事务处理是个老生常谈的话题,跨两个数据源的事务管理也算是分布式事务的范畴,在同一个JVM里处理多数据源的事务,比较经典的处理方
- 前言最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,所以下面就来测试下面,话不多说了,来一起看看详细的介绍吧。示例代码p
- 用了MyBatis的同行,应该见过foreach,它一般是这样用的:<select id="foreachTest"
- 前言今天在逛某知名论坛的时候,看到一篇"请不要使用包装类型,避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是,
- Java Function的使用一、方法介绍表示接受一个参数并产生结果的函数。参数类型 T - 函数输入的类型R - 函数的结果类型方法介绍
- 已知字符串“aabbbcddddeeffffghijklmnopqrst”编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2)/**
- 前言本文主要给大家介绍了关于Spring中@Scheduled和HttpClient的坑,分享出来供大家参考学习,下面话不多说了,来一起看看
- AssertJ是我目前见过的最强大的断言api,没有之一。官网传送门为什么使用assertJ?1、流式断言,代码即用例,直观易懂。举个例子:
- 如果有哪一个做程序员的小伙伴说自己没有遇到中文乱码问题,我是不愿意相信的。今天在做微信订阅号的智能回复时,又一时迷乱的跳进了中文乱码这个火坑