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模板网!

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

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

相关文章

  • QGraphicsView实现简易地图4『局部加载-地图漫游』

    前文链接:QGraphicsView实现简易地图3『局部加载-地图缩放』 当鼠标拖动地图移动时,需要实时增补和删减瓦片地图,大致思路是计算地图从各方向移动时进出视口的瓦片坐标值,根据变化后的瓦片坐标值来增减地图瓦片,以下将提供实现此需求的核心代码。 1、动态演示效果

    2024年02月13日
    浏览(22)
  • elementplus实现左侧菜单栏收缩与展开

    Home.vue下包含aside.vue和menu.vue 注意: 要使用收缩与展开,el-aside必须设置 width=\\\"collapse\\\" ,否则收缩展开会出现收缩后,el-aside宽度不变窄 需要使用动态改变展开收缩值 :collapse=\\\"isCollapse\\\" @open=\\\"handleOpen\\\"展开后改变isCollapse的值(@close=\\\"handleClose\\\"不生效也不影响效果) :collapse-trans

    2024年02月10日
    浏览(24)
  • 5款软件压力测试工具分享

    一、什么是软件压力测试? 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行软件压力测试的资源

    2024年02月02日
    浏览(31)
  • Ubuntu 18.04开发环境搭建

            工作不易,为了避免未来需要重装系统的进行折腾,个人进行了Ubuntu环境配置的整合,方便自己未来能顺畅的配置好开发环境,同时分享给大家。本文多出有转载其他文,并相应的标注了转载内容,如有侵权请联系博主删除。 vmware下载: 链接:https://pan.baidu.com

    2024年02月02日
    浏览(41)
  • chatgpt赋能python:如何使用Python得到8/3的小数部分

    在数学中,8/3是一个分数,可以被表示为2.6666666666666665。然而,在Python中,我们可以使用一些技巧来得到它的小数部分。 小数部分是一个数的小数点后的部分,与整数部分相对。在数学中,我们可以使用floor和mod操作来获得一个数的整数和小数部分。 floor 操作可以将一个数向

    2024年02月08日
    浏览(25)
  • 第二章 图像基本运算及变换

    本章主要讲解图像的一些基本运算及仿射变换以及透视变换。 图像相加 imgA + imgB :当其和大于一个字节时, 大于一个字节的位数将被丢失,类似于取模。 ( A + B ) % 256 (A + B) % 256 ( A + B ) %256 cv2.add(imgA, imgB) :当数值超过 255 时,取值为 255 m i n ( A + B , 255 ) min(A + B, 255) min ( A

    2024年02月03日
    浏览(40)
  • 【图论C++】树的直径(DFS 与 DP动态规划)

    UpData Log👆 2023.9.27 更新进行中 Statement0🥇 一起进步 Statement1💯 有些描述是个人理解,可能不够标准,但能达其意 21-1-1 定义 树上 最远的两个节点之间 的距离被称为 树的直径 ,连接这两个点的路径 被称为 树的最长链 。 21-1-2 性质 1 、这两个最远点一定是叶子节点 1、这 两

    2024年02月07日
    浏览(32)
  • Axie Infinity 超级任务远超预期,和 YGG 一起探索 Web3 增长新方式!

    参与超级任务的实际人数是预期人数的两倍。 超级任务将新玩家引入 Web3 游戏领域,并向他们介绍可以为其玩家旅程提供支持的社区。 Axie Infinity 超级任务旨在向新手和 Axie Classic 老 玩家介绍「Axie Infinity|起源」这款游戏。 整个活动共吸引了 4,322 名玩家参与任务,是预期注

    2024年02月06日
    浏览(26)
  • Spring Security 6.x 系列【72】授权篇之角色分层

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Spring Security 版本 6.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo

    2024年01月23日
    浏览(34)
  • FPGA的主流技术与市场表现方面的调研报告

    撰写简单的FPGA的主流技术与市场表现方面的调研报告,表达自己的认知和发展展望,500字,图片,表格除外 FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物,广泛应用于通信、

    2024年02月07日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包