BeanUtil里利用反射来写增、删、改、查

MapStruct使用及性能测试,秒杀BeanUtil MapStruct 一、MapStruct是什么 MapStruct是一款对象转换的工具,比如在日常开发种DTO,DO,VO对象转换; 官方接入指南:https://mapstruct.org/documentation/stable/reference/html/ 二、为什么要使用MapStruct 1.传统的BeanUtil是使用反射实现,众所周知反射效率低,而MapStruct则是在编译时自动生成get,set方法; 2.MapStruct还可以进行灵活配置,比如:某些字段不转,字符串转枚举,字符转其 阅读详情
import java.lang.reflect.*;
import java.text.SimpleDateFormat;






public class BeanUtil {
private static BeanUtil bean=null;
private BeanUtil(){

}
public static BeanUtil getNew()
{
if(bean==null)
{
bean = new BeanUtil();

}
return  bean;
}


   public String getSelectSQL(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
  Class<? extends Object> classzz = obj.getClass();
  String tableName = classzz.getSimpleName();
  StringBuffer sbsql = new StringBuffer();
  sbsql.append("Select * From "+tableName+" ");
  sbsql.append(" Where 1=1 ");
  Field[] fields = classzz.getDeclaredFields();//获取所定义的字段
  for(Field f:fields){
 f.setAccessible(true);
 Object o= f.get(obj);
  if(o!=null)
  {
  if(f.isAnnotationPresent(PrimaryKey.class))
  {
  if(o instanceof String)
  {
     sbsql.append(" And "+f.getName() +"='"+o+"' ");
  }
  else
  {
 sbsql.append(" And "+f.getName()+"="+o);
  }
  }
  else if(!f.isAnnotationPresent(NonField.class))
  {
  if(o instanceof String)
  {
     sbsql.append(" And "+f.getName() +"='"+o+"' ");
  }
  else
  {
 sbsql.append(" And "+f.getName()+"="+o);
  }
  }
  
  
  }
  }
  System.out.println(sbsql.toString());
  return sbsql.toString();
  
   }
   public  String getUpdate(Object obj) throws IllegalArgumentException, IllegalAccessException{
  Class<? extends Object> classzz = obj.getClass();
  String sql="Update "+ classzz.getSimpleName() + " Set ";
  String sql2=" ";
  String sql3=" Where ";
  Field[] fields = classzz.getDeclaredFields();
  for(Field f:fields){
  f.setAccessible(true);//可以访问private值
  Object value = f.get(obj);
  //如果该字段具备PrimaryKey的注解
  if(f.isAnnotationPresent(PrimaryKey.class)){//该字段是主键字段
  if(value instanceof String){
  sql3 += f.getName() +"='"+value+"'";
  }else{
  sql3 += f.getName()+"="+value+"";
  }
  }else if(!f.isAnnotationPresent(NonField.class)){
  if(value instanceof String){
  sql2 += f.getName() +"='"+value+"',";
  }else{
  sql2 +=f.getName()+"="+value+", ";
  }
  }
  }
  sql2 = sql2.substring(0,sql2.length()-1);
  sql = sql + sql2 +sql3;
  return sql;
  
   }


public  String getInsertSQL(Object obj)
throws IllegalArgumentException, IllegalAccessException {


Class<? extends Object> objClass = obj.getClass();
String strSQL = new String("insert into " + objClass.getSimpleName()
+ "(#COLS) values (#VALS)");


Field fields[] = objClass.getDeclaredFields();
StringBuffer cols = new StringBuffer("");
StringBuffer values = new StringBuffer("");


for (Field field : fields) {
field.setAccessible(true);// 访问的私有字段
if(field.isAnnotationPresent(NonField.class)){
continue;
}
if (field.isAnnotationPresent(PrimaryKey.class)) {// 说明是主键列
String seqname = field.getAnnotation(PrimaryKey.class).seqname();
cols.append(field.getName() + ",");
if (seqname.isEmpty()) {// 说明是空的


Object objectvalue = field.get(obj);
if (objectvalue instanceof String) {
values.append("'" + objectvalue + "',");
} else {
values.append("" + objectvalue + ",");
}
} else { // 说明是有序列的
values.append("" + seqname + ".nextval,");
}
} else {
cols.append(field.getName() + ",");
Object objectvalue = field.get(obj);
if (objectvalue instanceof String) {
values.append("'" + objectvalue + "',");
} else {
values.append("" + objectvalue + ",");
}
}


}
if (cols.length() > 1 && values.length() > 1) {
cols.delete(cols.length() - 1, cols.length());
values.delete(values.length() - 1, values.length());
strSQL = strSQL.replace("#COLS", cols).replace("#VALS", values);
} else {


return null;
}


return strSQL;
}
   public  String getDeleteSQL(Object obj) throws IllegalArgumentException, IllegalAccessException{
  Class<? extends Object> objClass = obj.getClass();
  String sql=" Delect From "+objClass.getSimpleName()+" Where ";
  String sql2="";
  Field[] fields = objClass.getDeclaredFields();
  for(Field f:fields){
  f.setAccessible(true);
  Object value=f.get(obj);
  if(value!=null)
  {
  if(f.isAnnotationPresent(PrimaryKey.class))
  {
  if(value instanceof String)
  {
  sql2+=" "+f.getName()+"= '"+value+"' ";
  }
  else
  {
  sql2+=" "+f.getName()+"= "+value+" ";
  }
 
  }
  }
  
  }
  return sql+sql2;
   }
   
}
commons-beanutils-1.9.4.jar 注意:本资源用于学习而非盈利,第三方若认为版权受侵可联系官方删帖 立即下载

相关推荐

【Unity游戏开发】SDK接入与集成——小白入门篇

一、简介   通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成,对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,而熟悉SDK接入的同学又觉得不断地重复做接入SDK工作这样没有成就感,太尼玛无聊了(Android渠道一弄就十几个,直接吐血)。其实通常情况下接入SDK都是很简单的一个过程,本系列博客就让马三和大家从小白开始,从零基础开始学习如何接入SDK以及一些常见的SDK的...

weixin_34195142的博客 5764

使用BeanUtils工具类操作JavaBean

一、字段与属性     1、Java类的属性         Java类的属性,它和之前的类中的成员变量不一样,在之前的文章中,有时我也将属性称之为别名,Java类的属性是通过类中的getter()与setter()方法来确定的,例如  getXxx() ,在这个getter方法中,去除方法名前面的"get"后,剩下的字母的第一个字母小写即为Java类的属性     2、字段

鲸鱼programmer的博客 2119

ESP32实战指南:SPI驱动ADXL345三轴加速度传感器的精准数据采集与姿态解算

本文详细介绍了如何使用ESP32通过SPI接口驱动ADXL345三轴加速度传感器,实现精准数据采集与姿态解算。从硬件连接到SPI通信优化,再到数据处理和低功耗策略,提供了全面的实战指南。特别适合物联网开发者和硬件工程师参考,帮助快速掌握传感器数据采集技术。

vim8coder的博客 1042

Java反射技术——字段的获取

关于获取类的字段有两种方式:getFields()和getDeclaredFields()。我们先来看看这两者的区别吧: getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。 getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。 同样类似的还有getCons

专注、专心、专业 9248

大陆毫米波雷达ARS408-21xx实战:从零搭建ROS环境下的目标检测与可视化

本文详细介绍了大陆毫米波雷达ARS408-21xx在ROS环境下的实战部署全流程。从硬件连接、CAN总线配置,到ROS驱动节点开发、CAN报文解析,再到RViz三维可视化实现,提供了完整的代码示例与调试技巧,帮助开发者快速搭建毫米波雷达目标检测与可视化系统。

open4的博客 636

(侧边抽屉)移动端APP汉堡页设计全解:从规范落地到体验优化

汉堡页是一种隐藏式侧边导航组件,由汉堡图标(三条水平横线)、侧边抽屉面板、主界面遮罩层三部分构成。点击汉堡图标后,面板通常从左侧滑入,覆盖主界面部分区域(或悬浮于主界面之上);关闭时可通过点击关闭按钮、遮罩层、返回键或侧滑手势完成,是移动端特有的空间优化设计模式。

qq_67370502的博客 617

BeanUtils

BeanUtilsBeanUtils是Apache Commons组件的成员之一, 主要用于简化JavaBean封装数据的操作。 ​ ​ 简化反射封装参数的步骤,给对象封装参数。 好处: BeanUtils给对象封装参数的时候会进行类型自动转换。JavaBean//JavaBean就是一个类,但该类需要满足以下三个条件: ​ 1. 类//必须使用public修饰。 ​ 2. 提供无参数的构造器。 ...

h294590501的专栏 1万+

泛微ecology9 利用字段值动态控制明细表显示与隐藏

本文详细介绍了在泛微ecology9中,如何利用WfForm.bindFieldChangeEvent监听字段变化,结合jQuery动态控制明细表显示与隐藏的实战方法。通过五步操作,可实现根据字段值(如报销类型)智能切换明细表,提升表单交互体验与开发效率,并确保PC与移动端完美兼容。

7z8x2c4v6b9的博客 585

BeanUtils的使用

Commons BeanUtils 是Apache组织提供的一个对Bean进行操作的开源工具类库,它主要用于简化JavaBean 封装数据的操作。

小异常的博客 2820

《【一看就会】Autoware.universe的“规划”部分源码梳理》系列文章目录(持续更新中)

第零章:Planning综述 第一章:【一】全局路径生成模块——mission_planner 第二章:【二】路径行为规划模块——behavior_path_planner第一部分——behavior_path_planner模块 第三章:【二】路径行为规划模块——behavior_path_planner第二部分——behavior_path_planner_common模块(1) 第四章:【二】路径行为规划模块——behavior_path_planner第三部分——behavior_path_plan

weixin_48386130的博客 2340

代码复现5——VLMaps

报错“AttributeError: module 'clip' has no attribute 'load'”,运行下述命令解决。运行后接着报错:“ModuleNotFoundError: No module named 'pytorch_lightning'”运行后命令后会弹出一个RGB窗口,可以用键盘上的“W”“A”“D”键控制移动视角的变化,“空格”键开始记录,“q”键停止。并更改相关代码文件,vlmaps/vlmaps/lseg/modules/models/lseg_vit.py。

qq_44100524的博客 603

BeanUtils简介

一、BeanUtils工具类的作用是什么? 用于简化JavaBean的封装,也就是简化数据的封装 二、那什么是JavaBean呢? javabean其实就是一个标准的java类 1、标准如下 ① 类必须被public修饰 ② 必须提供空参构造器 ③ 成员变量必须使用private修饰 ④ 提供公共的setter和getter方法 2、功能 功能就是封装数据 三、什么是成员变量什么又是属性? 成员变量就是我们所理解的成员变量 属性是什么? 属性就是setter和getter方法截取后的产物 例如getUser

技术积累,技术分享 1万+

【YOLO部署Android安卓手机APP】YOLOv8部署到安卓实时目标检测识别——官方/自训练模型YOLOv8人脸/车辆等目标检测(可自定义更换其他目标)

本文首先讲解如何直接使用官方训练好的模型部署到手机APP进行人脸检测,然后讲解如何修改其他目标进行检测,以车辆检测为例进行讲解如何训练自己的模型部署到手机APP。本文为详细设计/配置文档,包含完整所需的环境配置搭建,项目工程配置步骤等,手把手记录使用pycharm和Android studio的工程开发过程,实现YOLO部署到安卓。实战开发,亲测无误。本项目实现了人脸检测和车辆检测,当然,以此你可以按照本项目开发步骤扩展更换为其他目标进行检测,例如更换为车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人等

嵌入式阿齐Archie 1万+

java代码简单实现本地用户在浏览器端增、删、改、查

java代码简单实现用户在浏览器端增、删、改、查1 准备1.1 需要的软件、jar包、网页样式等1.1.1 软件1.1.2 jar包1.2 提前准备工作1.3 项目结构总览2 实现步骤2.1创建web三层架构、以及工厂包、工具包、javaBean包2.2 导入web中的资源2.3 敲代码2.3.1 编写思想3 总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题...

MainPoser的博客 3745

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

使用反射实现BeanUtil工具类

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util....

xiaobao5214的博客 637

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

BeanUtil.copyProperties真的很慢吗?

我们都知道java反射会比对象实例直接通过set方法设值更耗时,那么BeanUtil.copyProperties是否也是如此,但实际上通过源码可知,BeanUtil.copyProperties是做了缓存优化的,具体怎么优化的,对其性能提升有多大影响,我们一探究竟

qq_24297093的博客 5571

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

更快的BeanUtil(对比BeanUtils,Cglib)

可能是最好用的BeanUtil(吹牛的) BeanUtil算是个高频使用工具类了,很多地方都用得到,大家常用的BeanUtil大概有Spring的BeanUtils以及cglib的BeanCopier,前者使用反射进行getter、setter方法调用,后者使用CGLIB代理直接操作字节码调用getter、setter方法。 BeanCopier的性能要高出Spring的BeanUtils很多,我实测大概有5倍多的差距,但是BeanCopier用起来也更加繁琐一些,需要先传入source类和target类创

ZDLW5的博客 3878

Java JDBC基本操作(增,删,改,查)总结

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

月夜归醉 7153

C#反射——模仿BeanUtil属性复制

反射工具类请参见:https://www.cnblogs.com/threadj/p/10535796.html using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Reflection; namespace ReligionSe...

weixin_30429201的博客 550

BeanUtil和BeanUtils有什么区别

BeanUtil和BeanUtils是Java中常用的对象属性复制工具类,主要区别在于来源和性能。BeanUtils来自Apache Commons,功能简单但性能较低;而BeanUtil常见于Hutool等第三方库,性能更优且功能丰富,支持对象与Map转换等操作。开发新项目推荐使用BeanUtil,传统项目可继续使用BeanUtils。两者都基于反射实现,但BeanUtil通过缓存优化了性能。

qq_68981706的博客 1096

利用设计模式、反射写代码

第一种代码重复是,有多个并行的类实现相似的代码逻辑。我们可以考虑提取相同逻辑在父类中实现,差异逻辑通过抽象方法留给子类实现。使用类似的模板方法把相同的流程和逻辑固定成模板,保留差异的同时尽可能避免代码重复。同时,可以使用 Spring 的 IoC 特性注入相应的子类,来避免实例化子类时的大量if…else代码。第二种代码重复是,使用硬编码的方式重复实现相同的数据处理算法。

qq_38730338的博客 860

关于BeanUtil.copyProperties性能

BeanUtil.copyProperties 方法确实很方便,代码写出来非常优美,不会有很多的get set,但由于用到反射,可能存在潜在的性能问题。因此对spring 和 commons的BeanUtil.copyProperties进行了对照测试,代码大致如下: Java代码   @Test        public   void ...

wzhw2008的专栏 337

自制简易的BeanUtil工具

在学习了request对象获取前端数据时;老师提到了通常会利用request.getParameterMap()获取map集合,在通过工具BeanUtil解析成一个值对象 在学习类反射后已经好久没练习了,今日就自制了一个简易的Beanutil工具实现前端数据解析成值对象 note:基于request.getParameterMap()获取的Map模式编写,只能解析常规的基本类型及基本类型数组的

听听丶的博客 509

BeanUtils和 BeanUtil 有什么区别

工具类来源参数顺序(性能功能丰富度HutoolBeanUtilHutool 工具库源对象 -> 目标对象中高(支持动态 Bean、类型转换)SpringBeanUtils源对象 -> 目标对象高基础ApacheBeanUtils目标对象 -> 源对象低基础。

weixin_45920874的博客 742

BeanUtil 反射机制 拷贝对象类或list

BeanUtil 反射机制 拷贝对象类或list

英雄汉孑的博客 6936
上一篇: 关于集合以及集合的简单用法示例
下一篇: c3p0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值