Hutool BeanUtil工具使用及SQL中AND与OR优先级解析

这篇具有很好参考价值的文章主要介绍了Hutool BeanUtil工具使用及SQL中AND与OR优先级解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先,文章解释了在SQL查询中AND运算符优先级高于OR,并通过实例展示了如何正确地使用它们以获取预期的查询结果。接着,文章详细介绍了BeanUtil工具,它能够方便地在Map和JavaBean对象之间进行转换,以及实现对象属性的拷贝。通过具体的代码示例,展示了如何将对象转换为Map,将Map转换回对象,以及在不同场景下如何使用BeanUtil进行对象拷贝。文章还提供了Hutool的官方文档链接,供读者进一步学习。

SQL中的and和OR的优先级

首先and的优先级大于or,通俗理解其实or查询其实会把条件分为左右两边来查。
如select * from user where id = 1 and status = 2 or status = 3,本来想查询user表中id为1的状态为2或者3的数据,其实只会这样执行,and比or优先,结果是查询id为1和状态为2,或者状态为3的数据。
解决办法,如果是同字段,如上例子,可Select * from user where id=1 and status in (2,3),或者select * from user where id = 1 and (status = 2 or status = 3),就可以了

hutool包下的BeanUtil工具使用

链接:https://doc.hutool.cn/pages/index/
BeanUtil:用于Map与JavaBean对象的互相转换以及对象属性的拷贝。
1、新建实体类对象

package com.heima.item.test.hutool;
import lombok.Data;
@Data
public class User {
  private String name;
  private Integer age;
}

package com.heima.item.test.hutool;
import cn.hutool.core.bean.BeanUtil;
import java.util.Map;
public class TestBeanUtil {
  public static void main(String[] args) {
    User user = new User();
    user.setAge(1);
    user.setName("张三");

    // 对象转化为map
    Map<String, Object> map = BeanUtil.beanToMap(user);
    System.out.println(map);
    // map转化为对象
    User user1 = BeanUtil.toBean(map, User.class);
    System.out.println(user1);
    // 对象拷贝
    User user2 = new User();
    BeanUtil.copyProperties(user,user2);
    System.out.println(user2);
  }
}

Hutool BeanUtil工具使用,SQL中AND与OR优先级解析
beanToMap
将对象映射为map
实现有以下几种方式:
实现一:

//最简单的一种,直接将bean对象转换为map(若为null则对应的map的value为null) 
public static Map beanToMap(Object bean);

实现二:

/*
isToUnderlineCase:对于驼峰的属性名称,其对应的key是否用'_'分割开
ignoreNullValue:对于空的属性值,是否忽略
这两个值默认都为false
*/
public static Map<String, Object> beanToMap(Object bean, boolean isToUnderlineCase, 
                                            boolean ignoreNullValue)

User user = new User();
user.setAge(1);
user.setUserName("张三");

Map<String, Object> map = BeanUtil.beanToMap(user, true, false);
System.out.println(map);

``
运行结果:
{user_name=张三, age=1}

    User user = new User();
//    user.setAge(1);
    user.setUserName("张三");

    Map<String, Object> map = BeanUtil.beanToMap(user, true, true);
    System.out.println(map);

运行结果:{user_name=张三}
实现三:

/*
targetMap:表示要添加到的map,也就是可以自己传输一个map。
          然后再将封装后的map键值对一一封装到里面返回。
*/
public static Map<String, Object> beanToMap(Object bean, Map<String, Object> targetMap,
                           boolean isToUnderlineCase, boolean ignoreNullValue);

    User user = new User();
    user.setAge(1);
    user.setUserName("张三");

    Map<String, Object> map = new HashMap<>();
    map.put("MyKey", 100);
    Map<String, Object> map1 = BeanUtil.beanToMap(user, map, false, true);
    System.out.println(map1);

运行结果: {MyKey=100, userName=张三, age=1}
实现四:

/*
keyEditor:对key自定义编辑。也就是可以对map中的key进行改变。
是一个接口,要自定义实现类(内部实现类)
*/
public static Map<String, Object> beanToMap(Object bean, Map<String, Object> targetMap,
                           boolean ignoreNullValue, Editor<String> keyEditor);

    User user = new User();
    user.setAge(1);
    user.setUserName("张三");

    HashMap<String,Object> map = new HashMap<>();
    Map<String, Object> map1 = BeanUtil.beanToMap(user, map, false, new Editor<String>() {
      @Override
      public String edit(String s) {
        return s.toLowerCase() + s.length();
      }
    });
    System.out.println(map1);

运行结果: {username8=张三, age3=1}
实现五:

/*
copyOptions:通过这个参数可以自定义任何转换规则,如“忽略某字段”、“设置editor等”
*/
public static Map<String, Object> beanToMap(Object bean, Map<String, Object> targetMap,
                           CopyOptions copyOptions);

    User user = new User();
    user.setAge(1);
    user.setUserName("张三");
    
    // 假设不将user对象中的age属性映射到map,可以这样实现
    HashMap<String,Object> map = new HashMap<>();
    CopyOptions copyOptions = new CopyOptions();
    copyOptions.setIgnoreProperties("age");
    Map<String, Object> map1 = BeanUtil.beanToMap(user, map, copyOptions);
    System.out.println(map1);

运行结果: {userName=张三}

    User user = new User();
    user.setAge(1);
    user.setUserName("张三");

    HashMap<String,Object> map = new HashMap<>();
    CopyOptions copyOptions = new CopyOptions();
    // 设置editor改变map中的key名称
    copyOptions.setFieldNameEditor(s -> s.toUpperCase());
    Map<String, Object> map1 = BeanUtil.beanToMap(user, map, copyOptions);
    System.out.println(map1);

运行结果: {USERNAME=张三, AGE=1}

toBean

toBean是将map中的某一些字段转换为user中的某个属性。
实现一:

public static <T> T toBean(Object source, Class<T> clazz);

    User user = new User();
    user.setAge(1);
    user.setUserName("张三");

    HashMap<String,Object> map = new HashMap<>();
    map.put("age",1);
    map.put("userName","张三");

    User user1 = BeanUtil.toBean(map, User.class);
    System.out.println(user1);

运行结果:
User(userName=张三, age=1)
这里map中的key一定要跟User中完全相同。比如:user中的属性名称为“userName”,如果写成“UserName”。那么注入就会为null。
实现二:

public static <T> T toBean(Object source, Class<T> clazz, CopyOptions options)

    HashMap<String,Object> map = new HashMap<>();
    map.put("age",1);
    map.put("userName","张三");
    // map中age不转化为user中的age属性
    CopyOptions copyOptions = new CopyOptions();
    copyOptions.setIgnoreProperties("age");
    User user = BeanUtil.toBean(map, User.class, copyOptions);
    System.out.println(user);

运行结果: User(userName=张三, age=null)

copyProperties

将一个变量属性拷贝到另一个对象上
实现一:

/*
source:源变量
targer:目标变量
ignoreProperties:需要忽略的字段名称
*/
public static void copyProperties(Object source, Object target, String... ignoreProperties);

新增copy对象

@Data
@ToString
public class TestUser {
  private String userName;
  private Integer age;
  private Integer id;
}

 User user = new User();
    user.setAge(100);
    user.setUserName("张三");

    TestUser testUser = new TestUser();
    BeanUtil.copyProperties(user,testUser);
    System.out.println(testUser);

运行结果: TestUser(userName=张三, age=100, id=null)
spring中的BeanUtils不同。 在这里的BeanUtil拷贝对象,source和target各自可以为不同的类,各自的属性字段都可以随意。 但拷贝的时候只会拷贝属性名称相同的属性(上述中TestUser包含了User不存在的id字段,还是可以拷贝的)
它还有的其他实现:

public static void copyProperties(Object source, Object target, boolean ignoreCase);
public static void copyProperties(Object source, Object target, CopyOptions copyOptions);

    User user = new User();
    user.setAge(100);
    user.setUserName("张三");
// 方式一
    TestUser testUser = new TestUser();
    BeanUtil.copyProperties(user,testUser,"age");
    System.out.println("testUser"+testUser);
// 方式二
    TestUser copyUser = new TestUser();
    CopyOptions copyOptions = new CopyOptions();
    copyOptions.setIgnoreProperties("age");
    BeanUtil.copyProperties(user,copyUser,copyOptions);
    System.out.println("copyUser" + copyUser);

运行结果:
testUserTestUser(userName=张三, age=null, id=null)
copyUserTestUser(userName=张三, age=null, id=null)文章来源地址https://www.toymoban.com/news/detail-498945.html

到了这里,关于Hutool BeanUtil工具使用及SQL中AND与OR优先级解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【现代控制系统】最小实现与互质分式

    2023年12月12日 如果对应一传递函数矩阵 G ( s ) {G(s)} G ( s ) ,存在相应的状态空间描述,则称该传递函数矩阵 G ( s ) {G(s)} G ( s ) 是 可实现的 。 许多设计方法以及控制算法都是采用状态空间描述的。一旦传递函数用状态空间描述来表示的话,就可以用运算放大器来实现。如果传

    2024年01月23日
    浏览(10)
  • Jetpack Compose布局控件Column、Row、Box 详解

    Jetpack Compose布局控件Column、Row、Box 详解

    本篇文章介绍 Compose 的布局控件 Column 、 Row 、 Box ,在 Android XML 模式开发中,常用的布局控件有 LinearLayout 、 RelativeLayout 、 FrameLayout 以及 ConstraintLayout , Compose 没有延用之前的布局设计,而是提供了全新的布局控件,不仅实现了 XML 模式的相关功能并且更加灵活好用。 Compos

    2024年02月03日
    浏览(14)
  • 【GPU驱动开发】- GPU架构流程

    不必害怕未知,无需恐惧犯错,做一个Creator! GPU(Graphics Processing Unit,图形处理单元)是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 总体流程: 1. 应用程序请求图形操作: 应用程序通过图形API(如OpenGL、Vulkan)发送图形操作

    2024年02月20日
    浏览(8)
  • 【ArcGIS微课1000例】0080:ArcGIS将shp转json(geojson)案例教程

    本文以案例的形式,讲述在ArcGIS软件中,将矢量数据转为GeoJSON的方法。 扩展阅读:【GIS风暴】GeoJSON数据格式案例全解 GeoJSON是一种基于JSON的地理空间数据交换格式,它定义了几种类型JSON对象以及它们组合在一起的方法,以表示有关地理要素、属性和它们的空间范围的数据。

    2024年02月04日
    浏览(45)
  • 完美解决 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    完美解决 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    拉取代码时报错: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 翻译过来就是: 警告:远程主机标识已更改! 此报错是由于远程的主机的公钥发生了变化导致的。 ssh 服务是通过公钥和私钥来进行连接的,它会把每个曾经访问过计算机或服务器的公钥( public key ),记录在 ~/.ssh/k

    2024年02月11日
    浏览(11)
  • Windows10系统下Git的安装教程

    Windows10系统下Git的安装教程

    到Git官网下载,网站地址:https://git-scm.com  下载到D:software解压 右击我的电脑属性高级系统设置环境变量,找到path,添加两个配置 .   注意是 “点” D:softwareGitbin win+r打开系统命令行,检查Git版本信息 //输入命令 git --version   输入命令 git config --global user.name 用户名 git co

    2024年02月16日
    浏览(12)
  • 【WinAPI详解】<CreateWindowEx详解>

    函数原型: 目录 1.        DWORD        dwExStyle        //窗口的扩展风格(加强版专有) 2.        DWORD        dwStyle        //窗口的基本风格 3.        LPCTSTR        lpClassName        //已经注册的窗口类名称 4.        实例 参数解析: 参数

    2024年02月12日
    浏览(11)
  • Linux之 rsyslog、日志轮转

    Linux之 rsyslog、日志轮转

    Rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。 特点: 多线程 可以通过许多协议进行传输UDP,TCP,SSL,TLS,REL

    2024年02月15日
    浏览(13)
  • 基于Python的简易宿舍管理系统(课程作业附课程小论文)

    本文所有基础知识可通过此链接进行训练点我开练 本次为三个月学校学习的课程作业,仅用到Python入门知识,简旦易懂。 涉及到的主要有:列表,字典,函数定义调用,循环结构等入门知识 可满足大部分学校此课的基本要求,但添加的功能较少,可在此基础上进行二创,欢

    2024年02月11日
    浏览(8)
  • Create Fillable PDF Crack

    Create Fillable PDF Crack

    ONLYOFFICE Docs v8.0 streamlines your workflow with custom forms that can be completed online in desktop and mobile apps. ONLYOFFICE Docs is a comprehensive online editor, allowing users to create text documents, spreadsheets, presentations, and forms. It enables your users to edit, share, and collaborate on documents online in their preferred browser, withi

    2024年02月20日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包