<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wpw5499的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wpw5499</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wpw5499]]></copyright><item><title><![CDATA[【思考】学徒思维，是不是版本陷阱？]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/152829166</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/152829166</guid><author>wpw5499</author><pubDate>Thu, 09 Oct 2025 22:16:01 +0800</pubDate><description><![CDATA[本文探讨了职场&quot;学徒思维&quot;的适用性与局限性。作者认为，初入职场时保持谦虚好学的态度确实能快速成长，但随着经验积累，必须升级为&quot;带着思考提问&quot;的模式。过度依赖他人解答会陷入&quot;伪成长&quot;状态，应学会先独立思考再针对性请教。文章指出，真正的成长需要平衡&quot;输入&quot;与&quot;输出&quot;，最终从学习者转变为知识分享者。建议职场人根据不同阶段调整学习方式，避免让学徒思维成为懒惰的借口。]]></description><category></category></item><item><title><![CDATA[【Java实战】被嵌套事务的一次折磨，让我刻骨铭心]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/147053945</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/147053945</guid><author>wpw5499</author><pubDate>Mon, 07 Apr 2025 22:52:27 +0800</pubDate><description><![CDATA[好的，以上就是这次嵌套事务传播机制的卖惨，如果你觉得我们很惨，码友们动动小手指，一箭三连！助力我冲击中国码王！]]></description><category></category></item><item><title><![CDATA[[实战经验]Mybatis的Mapper中方法入参什么时候加@Param？]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/137250005</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/137250005</guid><author>wpw5499</author><pubDate>Mon, 01 Apr 2024 23:20:59 +0800</pubDate><description><![CDATA[解释： 在这种情况下，入参是一个对象（User类），而且在XML中可以直接使用对象的属性名（id和name）来引用对象的属性，无需使用@Param注解，无需使用user.id，user.name的方法。当我们使用Mybatis的时候，mapper接口中方法里面的参数可能有单个，有多个，有对象，有基本类型，有集合，那什么时候需要加@Param注解，什么时候又不用加呢？解释： 当方法的入参是两个对象类型时，不需要使用 @Param 注解，可以直接在 XML 中使用对象的属性名引用对象属性。]]></description><category></category></item><item><title><![CDATA[[实战经验]Mybatis的mapper.xml参数#{para}与#{para, jdbcType=BIGINT}有什么区别？]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/137249045</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/137249045</guid><author>wpw5499</author><pubDate>Mon, 01 Apr 2024 22:30:59 +0800</pubDate><description><![CDATA[Mybatis的mapper.xml参数#{para}与#{para, jdbcType=BIGINT}有什么区别？]]></description><category></category></item><item><title><![CDATA[[实战经验]在Java中如何估算对象集合的内存占用空间]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/137199211</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/137199211</guid><author>wpw5499</author><pubDate>Sun, 31 Mar 2024 14:25:48 +0800</pubDate><description><![CDATA[String对象在java中为不可变对象，底层实现为char[]，其内存占用计算通常为对象头(8字节)+int字段(4字节，记录字符数组长度)+字符数组长度(假设平均为20个字符，一个char是2个字节，所以为40字节)+对其填充(4字节)=56字节。场景：现在需要从三方同步组织信息到我方的平台，准备在内存中构建这颗组织树，使用HashMap存储，那应该怎么取估算这棵树的内存占用大小呢？思路：总的内存占用大小=每个组织节点的内存占用大小*组织节点个数。计算整棵树的内存占用大小。]]></description><category></category></item><item><title><![CDATA[【SQL】对表中的记录通过时间维度分组，统计出每组的记录条数]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/135491874</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/135491874</guid><author>wpw5499</author><pubDate>Tue, 09 Jan 2024 23:42:05 +0800</pubDate><description><![CDATA[测试数据准备如下，50条DML语句，其中order_date分布在2023年1月到12月之间。有了以上测试数据，现在我们的需求：订单表在每月为单位的订单数、每天为单位的订单数。场景：一般用作数据统计，比如统计一个淘宝用户在年、月、日的维度上的订单数。按照这个格式化的日期进行分组，并使用COUNT(*)来统计每组的记录条数。准备一张订单表order，有一些常规属性，比如创建时间，订单号。对sql的解读：这里的关键是使用。]]></description><category></category></item><item><title><![CDATA[【stream流】集合中每个对象的某属性值进行求和]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/135491022</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/135491022</guid><author>wpw5499</author><pubDate>Tue, 09 Jan 2024 22:38:14 +0800</pubDate><description><![CDATA[在我们这个例子中，我们首先使用Arrays.stream将字符串数组转换为流，然后使用mapToInt将这个函数Product::getMoney的结果转换为对应的整数。最后，我们使用sum方法计算所有整数的和。这个例子中，Product::getMoney是一个函数，它将获取对象中的money值。这个函数会被应用到流中的每个元素，然后将结果放入一个新的IntStream中。综合起来，stream().mapToInt的目的是将一个集合（或流）中的元素映射为int类型，并返回一个IntStream。]]></description><category></category></item><item><title><![CDATA[MySQL如何优雅处理批量新增和更新?ON DUPLICATE KEY UPDATE用它!]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/133394674</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/133394674</guid><author>wpw5499</author><pubDate>Thu, 28 Sep 2023 23:10:09 +0800</pubDate><description><![CDATA[在批量新增员工信息的时候，id自增，工号是唯一的，不允许重复。再举一个例子，如果我们新增一个部门属性department_number，然后唯一索引变成唯一组合索引(department_number, work_number)，此时sql应该变成什么样了呢？在该示例中，我们省略了 id 字段，因为它是自增的，数据库会自动为新插入的记录生成一个唯一的 id 值。在这个示例中，我们省略了 id 字段，因为它是自增的，数据库会自动为新插入的记录生成一个唯一的 id 值。而且是批量操作，比较繁琐，容易出错。]]></description><category></category></item><item><title><![CDATA[[设计模式] 抽象工厂模式简易案例]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132724571</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132724571</guid><author>wpw5499</author><pubDate>Wed, 06 Sep 2023 22:10:55 +0800</pubDate><description><![CDATA[这个示例演示了抽象工厂模式的用法，根据不同的工厂对象创建了不同风格的按钮和窗口组件，而不需要关心它们的具体实现类。这种方式有助于创建一组相关或依赖的对象，同时保持代码的灵活性和可维护性。痛点：当需要创建一组相关对象，例如操作系统的不同界面组件（按钮、文本框等）时，抽象工厂模式非常有用。以下是一个简单的抽象工厂模式的 Java 示例，假设你要创建不同类型的按钮和窗口组件。定义：提供一个接口来创建一系列相关或依赖对象，而无需指定其具体类。]]></description><category></category></item><item><title><![CDATA[[设计模式] 简单工厂模式简易案例]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132724447</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132724447</guid><author>wpw5499</author><pubDate>Wed, 06 Sep 2023 22:03:10 +0800</pubDate><description><![CDATA[这个示例演示了一个简单的工厂模式，根据输入的类型参数创建不同的形状对象。工厂模式的主要好处是将对象的创建和使用分离，使代码更易于扩展和维护。如果需要添加新的形状类型，只需修改工厂类而不必修改使用该形状的代码。解决的痛点：当一个类不知道它必须创建哪个对象时，工厂模式可以用来创建特定类型的对象。以下是一个简单的工厂模式的 Java 示例，假设你要创建不同类型的形状对象。工厂模式是一种创建型设计模式，用于根据不同条件或参数创建不同类型的对象。]]></description><category></category></item><item><title><![CDATA[Java程序中常用的设计模式有哪些和该种设计模式解决的痛点]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702751</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702751</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:45:24 +0800</pubDate><description><![CDATA[定义：定义一系列算法，将它们封装成独立的对象，并使它们可以互换使用，使算法的变化独立于使用它的客户端。设计模式是大量程序员智慧的结晶，是优秀的代码范式，是以前那些大佬程序员的编程经验总结，非常值得学习。痛点：当需要在运行时选择算法或者避免使用大量的条件语句来选择不同的算法时，策略模式有用。痛点：当需要定义一个算法的框架，但允许子类提供某些步骤的实现时，模板方法模式有用。定义：将一个复杂对象的构建过程与其表示分离，使同样的构建过程可以创建不同的表示。定义：定义一个创建对象的接口，但让子类决定实例化哪个类。]]></description><category></category></item><item><title><![CDATA[Java中double类型的数据，如何保留小数后两位]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702684</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702684</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:33:48 +0800</pubDate><description><![CDATA[请注意，这些方法并不会改变 number 变量本身的值，而是返回一个格式化后的字符串。如果需要将格式化后的字符串转换回 double 类型的数字，可以使用 Double.parseDouble 方法或者 Double.valueOf 方法进行转换。在 Java 中，你可以使用 DecimalFormat 类或者 String.format 方法来将 double 类型的数字保留指定位数的小数。无论使用哪种方法，都会将 number 变量的值格式化为保留两位小数的字符串。]]></description><category></category></item><item><title><![CDATA[如何利用stream流规避在循环中查库的危险操作？]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702603</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702603</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:30:08 +0800</pubDate><description><![CDATA[使用 Java 8 中的流（Stream）可以帮助你规避在循环中进行数据库查询等危险操作，提高代码的可读性和性能。总之，使用流可以帮助你更优雅地进行数据库查询，减少循环中的危险操作，并提高代码的可读性和性能。根据具体的需求和场景，选择适合的流操作来优化你的查询操作。在CodeReview的时候，这个是作为初级程序员很容易犯的编程问题。]]></description><category></category></item><item><title><![CDATA[Java项目中遇到uv坐标如何转换成经纬度坐标]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702576</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702576</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:24:38 +0800</pubDate><description><![CDATA[将UV坐标（通常指平面坐标，如二维地图坐标）转换为经纬度坐标（地理坐标）通常需要知道一个参考点的经纬度坐标，以及两者之间的比例关系。这是因为UV坐标通常用于在地图上绘制图形或标记点，而经纬度坐标用于表示地球上的位置。在这个示例中，我们假设UV坐标的范围是从0到1，然后使用已知的参考点的经纬度坐标和比例关系来计算目标点的经纬度坐标。请注意，这个示例中的比例关系和单位是随意设置的，实际上应该根据你的具体需求来设置。]]></description><category></category></item><item><title><![CDATA[JNA的内存对齐方式，简单案例介绍]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702538</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702538</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:22:49 +0800</pubDate><description><![CDATA[Java本身并没有提供直接的内存对齐控制机制，因为Java是一种跨平台的语言，内存对齐通常由底层操作系统和硬件决定。如果你对内存对齐有特殊需求，通常是因为你需要与一个特定的本地库进行交互，而该库要求某种特定的内存对齐方式，你可以使用JNA的Structure类来控制内存对齐方式。在C/C++中，内存对齐通常是为了性能和内存访问的原因，确保数据结构的起始地址是某个特定值的倍数。在JNA中，你通常不需要担心内存对齐的问题，因为JNA会自动处理与本地库的交互。在大多数情况下，你不需要关心内存对齐。]]></description><category></category></item><item><title><![CDATA[线上调试神器Arthas的watch命令简易教程]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702408</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702408</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:18:19 +0800</pubDate><description><![CDATA[watch 命令是阿里开源的 Java 诊断工具 Arthas 提供的一个功能，用于在运行时观察某个方法的参数和返回值，甚至可以观察方法的异常情况。通过 watch 命令，你可以实时监控指定方法的执行情况，从而帮助你诊断和分析问题。当你看到这篇文章的时候，我们默认你已经对Arthas有一定的了解和基础的使用。该文章只是对watch命令做一个简单的介绍以及附上案例。这样，你就可以在方法执行时观察参数和返回值，帮助你分析问题和调试代码。]]></description><category></category></item><item><title><![CDATA[为什么要尽量规避循环里面查库？]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132702303</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132702303</guid><author>wpw5499</author><pubDate>Tue, 05 Sep 2023 23:05:18 +0800</pubDate><description><![CDATA[为什么要尽量规避循环里面查库？]]></description><category></category></item><item><title><![CDATA[MySQL编写建表语句，如何优雅处理创建时间与更新时间]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132592206</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132592206</guid><author>wpw5499</author><pubDate>Wed, 30 Aug 2023 22:49:37 +0800</pubDate><description><![CDATA[在这个例子中，createTime 使用 CURRENT_TIMESTAMP 默认值，这将在插入数据时自动设置为当前时间戳。而 updateTime 使用 ON UPDATE CURRENT_TIMESTAMP 触发器，这将在更新数据时自动更新为当前时间戳。在 MySQL 中，可以使用 TIMESTAMP 或者 DATETIME 数据类型来存储日期和时间信息，并结合默认值和触发器来实现自动更新 createTime 和 updateTime 字段。]]></description><category></category></item><item><title><![CDATA[JAVA项目如何调用C++库？JNA简易教程]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132592016</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132592016</guid><author>wpw5499</author><pubDate>Wed, 30 Aug 2023 22:42:13 +0800</pubDate><description><![CDATA[以下是一个简单的例子，假设你有一个用C写的库mylibrary.dll（这里注意windows版本是dll文件，Linux系统是so文件），里面有一个函数 int add(int a, int b) 用来相加两个整数。这个简易教程和工作是实际使用起来，就跟小学算术和考研数学一样，坑得一匹。用这个东西就得和C++的同事对接，让我体会到了兰德里的折磨。想象一下你在玩积木，JNA就是帮助你把Java和C/C++的积木连接起来的工具。当你在写Java代码时，有时候需要调用一些用C或C++编写的库。]]></description><category></category></item><item><title><![CDATA[springboot项目，使用JNA框架调用C++库无法捕获异常的解决思路]]></title><link>https://blog.youkuaiyun.com/wpw5499/article/details/132591928</link><guid>https://blog.youkuaiyun.com/wpw5499/article/details/132591928</guid><author>wpw5499</author><pubDate>Wed, 30 Aug 2023 22:32:22 +0800</pubDate><description><![CDATA[使用 JNA（Java Native Access）框架调用 C++ 库时，如果出现问题导致进程直接结束而无法捕获异常，可能是因为底层库抛出了 C++ 异常，而 Java 无法直接捕获 C++ 异常。写在前面：这个东西真的坑，工作上遇到的和JNA项目的入门案例差别就像是二重积分与小学数学之间的差距，折磨！]]></description><category></category></item></channel></rss>