首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,603 阅读
2
Mac打印机设置黑白打印
4,931 阅读
3
修改elementUI中el-table树形结构图标
4,892 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,669 阅读
5
intelliJ Idea 2022.2.X破解
4,352 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Spring Cloud
Mac
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
.Net
Spring Cloud Alibaba
MySQL
Mybatis-Plus
Typecho
jQuery
Java Script
微信小程序
Oracle
Laughing
累计撰写
625
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
625
篇与
的结果
2022-02-02
MyBatis-Plus更新部分字段
使用MyBatis-Plus时,有时候我们在更新实体时,可能只想更新部分字段。下面介绍两种更新部分字段的方法。一、先查询后更新的方式这种方式不是很好,说白了就是先执行一遍查询,查询到实体后,设置修改的属性,再次调用update方法更新,这样MyBatis只会更新修改的字段。二、通过UpdateWrapper更新 LambdaUpdateWrapper<OilUser> userUpdateWrapper = new LambdaUpdateWrapper<>(); userUpdateWrapper.set(OilUser::getUsername, user.getUsername()); userUpdateWrapper.set(OilUser::getNickName, user.getNickName()); userUpdateWrapper.set(OilUser::getTel, user.getTel()); userUpdateWrapper.set(OilUser::getEmail, user.getEmail()); if (!StringUtils.isEmpty(user.getPassword())) { userUpdateWrapper.set(OilUser::getPassword, passwordEncoder.encode(user.getPassword())); } userUpdateWrapper.eq(OilUser::getId, user.getId()); oilUserMapper.update(null, userUpdateWrapper);注意oilUserMapper.update(null, userUpdateWrapper);,第一个参数一定要设置null,这样就只会更新你set的字段。
2022年02月02日
2,324 阅读
0 评论
3 点赞
2022-01-31
UniApp Android客户端集成高德Web服务
问题最近使用uniapp做了一个记油耗的App。大家有兴趣的可以点击https://lisen.cc/app/oil_note.html查看。在记油耗OilNote中,有一个根据用户地理位置获取附近加油站的功能,我这里使用的是高德地图的Web服务对应的周边搜索功能,搜索对应的poi。一开始,我主要是在微信小程序还有H5进行测试的,系统都能正确获取到附近的加油站信息。我以为既然是web服务,那么应该所有的平台都是一样的,事实证明,我还是太年轻了。我用两台手机测试的,一台是一加8(系统是Color OS 12)、另外一个华为Mate30 Pro(鸿蒙系统,具体版本不清楚),在一加手机,所有定位服务失效,在华为Mate30 Pro,时好时坏。解决其实现在问题解决了,我也不知道啥原因,解决方式也很简单,自己又在高德开放平台申请了Android的key,然后在HBuilder中配置上,重新用自己的证书打包就好了。1.申请Android平台的key2.配置Android平台的key修改mainfest.json文件,找到App模块配置,在Maps中,使用自己申请的Android平台的key3.使用自己的证书打包App在打包App时,使用自己的证书。注意包名要求高德开放平台填写的报名保持一致。
2022年01月31日
1,235 阅读
0 评论
2 点赞
2022-01-27
爱车记-Harmony OS Next第一款纯电车电耗统计与计算软件
介绍爱车记是Harmony OS Next上第一款专为电动汽车用户设计的智能充电管理工具,旨在帮助用户轻松记录、管理和分析充电数据及费用。主要功能爱车记致力于为纯电车车主提供服务,目前提供的主要功能包括:充电数据记录,形成完整的充电历史档案。用户每次充电后只需要记录充电的数据,系统形成完整的充电历史档案。通过用户记录的充电数据,协助用户统计电车的电耗、行李里程、累计电费、平均电费等信息。费用计算与管理。支持记录每笔发生的费用。比如洗车或者购买保险等。支持根据不同的费用类型,统计费用发生的合计。集成地图服务,提供附近可用充电站的位置信息,并支持路线规划。支持充电桩查询,可以方便查询附近充电桩信息并可一键导航。支持提醒支持设置提醒功能,比如购买保险提醒等,用户定义的提醒内容,会以系统消息的形式发送给用户进行提醒。支持多车辆管理支持多车辆管理,用户可以无限制免费添加车辆。其他功能用户可以下载爱车记,体验其他功能。
2022年01月27日
3,392 阅读
2 评论
2 点赞
2022-01-05
Spring Boot另类前后端分离项目部署
对于前后端分离的项目,一般情况下,我们是把静态文件放到nginx中,然后通过端口转发,请求后端避免跨域的问题。我们知道,Spring Boot项目中,我们可以添加静态资源,根据约定大于配置的规则,默认静态文件位置位于以下位置classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,servlet context:将前端文件放到Spring Boot静态资源中的好处是不存在跨域的问题。默认静态资源,如果我们放到resources中,这显然不是我们想看到的。我们希望的是,将静态文件放到jar包之外的某个特定位置,这样静态资源的修改,不会涉及jar包的修改。配置文件修改为了实现静态资源文件的配置,我们需要通过spring.web.resources.static-locations指定静态文件的位置web: spring: web: resources: static-locations: file:${web}之所以添加一个web,是为了方便我们在命令行动态指定位置。放置静态资源我这里演示将index.html放到--web=/Users/lisen/IdeaProjects/demo/web中进行访问。内容如下:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> </script> </head> <body> 这是首页1 <div id="div1"></div> <script> $(document).ready(function(){ $.ajax({ url:"/book/get/1", type : "POST", //请求成功 success : function(result) { $("#div1").html(result); }, }) }); </script> </body> </html>启动命令java -jar /Users/lisen/IdeaProjects/demo/target/demo-0.0.1-SNAPSHOT.jar --web=/Users/lisen/IdeaProjects/demo/web访问前端页面可以看到,页面正确访问,并且没有出现跨域的问题。
2022年01月05日
927 阅读
0 评论
2 点赞
2021-12-27
OpenMTP:Mac上免费开源的管理Android设备的小工具
如果你是 macOS + Android 用户,在 macOS 中管理 Android 手机上的文件则要相对麻烦一些:Google 推出的 Android 文件传输功能简陋、稳定性差,无法传输大于 4GB 的文件;锤子科技出品的 HandShaker 需要在手机端安装配套应用,用起来也有点麻烦。 和基于ADB协议或Wi-Fi/蓝牙进行文件传输、管理的工具不同,OpenMTP基于MTP传输协议,不仅支持最新的macOS 10.15 系统,没有Google官方Android文件传输工具的一系列bug和稳定性问题;同时不需要ADB授权,内置的文件管理功能与交互也清晰、直观。 将手机连接到Mac并将连接模式改为「文件传输」后,电脑端打开OpenMTP即可在右边的文件目录窗格中看到当前用户下的Android文件目录了。OpenMTP的文件管理交互颇像一些FTP传输软件,首次打开应用时左边显示的为当前Mac设备用户的目录,右边则是 Android对应的文件目录,只不过文件传输并不像FTP文件那样直接。下载地址
2021年12月27日
1,185 阅读
1 评论
0 点赞
2021-12-19
Java故障诊断与性能优化-栈上分配
正常情况下,Java对象是存储到堆上的,为了优化系统性能,Java虚拟体提供了一种栈上分配的技术,栈上分配的基本思想是:对于那些线程私有的对象(不能被其他线程访问的对象),Java虚拟机将对象打散分配到栈上,而不是分配到堆上。之所以分配到栈上,是因为在函数调用结束后,可以将对象信息自行销毁,而不需要垃圾回收器介入。栈上分配技术基础是逃逸分析,逃逸分析的目的是检查对象的作用域是否有可能逃出函数体。能够逃逸的对象下面演示一个能够逃逸的对象,因为能够逃逸,所以是无法进行栈上分配的。public class Test{ public static class User{ public String name; public int age; public User(String name,int age){ this.name=name; this.age=age; } } public static User alloc(){ User user = new User("Test",30); user.name = "张三"; user.age=40; return user; } public static void main(String[] args) throws InterruptedException{ long startTime = System.currentTimeMillis(); User user = new User("Test",30); for(int i=0;i<100000000;i++){ user= alloc(); } System.out.println(user.age); long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); } }执行java -server -Xmx20m -Xms20m -XX:+PrintGC Test可以看到代码发生了大量的GC。不能逃逸的对象相同的代码,我们只是设置对象不能逃逸,进行一下改造。public class Test{ public static class User{ public String name; public int age; public User(String name,int age){ this.name=name; this.age=age; } } public static void alloc(){ User user = new User("Test",30); user.name = "张三"; user.age=40; } public static void main(String[] args) throws InterruptedException{ long startTime = System.currentTimeMillis(); for(int i=0;i<100000000;i++){ alloc(); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); } }执行java -server -Xmx20m -Xms20m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations Test可以看到并没有任何GC程序就执行完了。参数说明第二段启用逃逸分析时,我们参数明显是比第一段多了。-server:Server模式下,才可以启用逃逸分析。-XX:+DoEscapeAnalysis: 启用逃逸分析。-XX:-UseTLAB:TLAB全称是Thread Local Allocation Buffer,也就是线程级别的内存分配,每个线程独享一块内存,主要是针对Eden里的一块小内存,这样线程在分配内存的时候,因为这块小内存是这个线程独享的,因此不会出现锁竞争的问题,默认是开启该功能的,不建议关闭此功能,主要是保证内存分配的高效性-XX:+EliminateAllocations:开启标量替换(默认开启),运行将对象打散分配到栈上,比如我们上面User对象有id、name两个字段,那么这两个字段将会被视为两个独立的局部变量进行分配。
2021年12月19日
863 阅读
0 评论
0 点赞
2021-12-18
SpringBoot JPA自动设置创建者、最后修改者
书接上文,SpringBoot JPA自动设置创建时间、修改时间,审计不可能只包含创建时间、最后修改时间,肯定得有人,也就是必须得有创建者、最后修改者。Spring Data Jpa设置创建者、最后修改者也非常简单。实体修改@Data @Entity @Table(name = "Book") @EntityListeners(AuditingEntityListener.class) public class Book { @Id private long id; private String name; private String author; private BigDecimal price; @CreatedDate private Timestamp createdDate; @CreatedBy private String createBy; @LastModifiedDate private Timestamp lastModifiedDate; @LastModifiedBy private String lastModifiedBy; }@CreatedBy注解用于标识创建者。@LastModifiedBy注解用于标识最后修改者。其他注解跟设置创建时间、最后修改时间一致,不再赘述,这里重点说一下,如何获取创建者、最后修改者。设置创建者、最后修改者值在Spring Data Jpa中,可以通过实现AuditorAware接口让程序知道当前审核程序的用户,实现逻辑根据项目实际情况编写。/** * 审计接口,获取当前人员 */ @Configuration public class JpaAuditWare implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { return Optional.of(UUID.randomUUID().toString()); } }验证创建验证 @GetMapping("save") public Book saveBook() { Book book = new Book(); book.setId(1L); book.setName("《山海经》"); book.setAuthor("佚名"); book.setPrice(new BigDecimal("500")); return bookService.saveBook(book); }修改验证然后我们修改一下数据,验证一下最后修改人、最后修改时间{message type="info" content="如果数据未发生改变,那么最后修改者、最后修改时间是不会发生改变的。"/}
2021年12月18日
1,764 阅读
0 评论
0 点赞
2021-12-18
SpringBoot JPA自动设置创建时间、修改时间
JPA提供了审计功能,用于设置创建者、创建时间、修改者、修改时间等参数。创建时间、修改时间很好理解,就是当前时间,但是创建者、修改者一般都是通过上下文信息获取的,由于我这边是接口里面使用,未使用创建者、修改者,所以先介绍一下创建时间、修改时间的使用。添加依赖那些巴拉巴拉的就不啰嗦。创建实体@Getter @Setter @ToString @Entity @Table(name = "ARAPDiscountRecord") @EntityListeners(AuditingEntityListener.class) public class ARAPDiscountRecordEntity implements Serializable { @CreatedDate @Column(name = "timestamp_createdon") private Timestamp timestampCreatedon; @LastModifiedDate @Column(name = "timestamp_lastchangedon") private Timestamp timestampLastchangedon; }@CreatedDate注解用于标识创建时间。@LastModifiedDate注解用于标识修改时间。实体类添加@EntityListeners(AuditingEntityListener.class)标识启动审计。启动审计再启用或者配置类上添加@EnableJpaAuditing启动审计。@EnableJpaAuditing @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }这样的话,每次创建数据,系统会自动赋值timestampCreatedon列,修改数据时,系统会自动赋值timestampLastchangedon字段。
2021年12月18日
1,526 阅读
0 评论
0 点赞
2021-12-12
Spring Boot中ThreadLocal踩坑
ThreadLocal作用ThreadLocal的作用:用来存当前线程的局部变量,不同线程间互不干扰。拿完数据记得需要移除数据,不然JVM不会将ThreadLocal回收(可能还会被引用),多了就会出现内存泄漏的情况。解析ThreadLocal类ThreadLocal包含几个方法:public T get() { } public void set(T value) { } public void remove() { } protected T initialValue() { }T get()get()方法是用来获取ThreadLocal在当前线程中保存的变量副本set(T value)set()用来设置当前线程中变量的副本void remove()remove()用来移除当前线程中变量的副本T initialValue()initialValue()是一个protected方法,一般是用来在使用时进行重写的,它是一个延迟加载方法。ThreadLocal变量污染ThreadLocal会在每个线程存储一个副本,但是如果我们使用的是比如Tomcat,Tomcat自身会维护一个线程池,线程结束后,并不会马上销毁,而是会重新进入线程池,下次有请求时,有可能会复用当前线程,如果我们每次使用ThreadLocal之前,没有进行Set(T value),那么就有可能导致不同线程之间变量污染,比如下面的代码@RestController @RequestMapping(value = "book") @Slf4j public class BookController { private static final ThreadLocal<String> THREAD_LOCAL_TEST = new ThreadLocal<>(); @Resource private IBookService bookService; /** * 构造函数 */ public BookController() { log.info("构造函数,此时bookService :" + bookService); } @PostConstruct public void init() { log.info("PostConstruct,此时bookService :" + bookService); } @PreDestroy public void destroy() { log.info("PreDestroy"); } @GetMapping(value = "set") public void set() { if (StringUtils.isEmpty(THREAD_LOCAL_TEST.get())) { THREAD_LOCAL_TEST.set(UUID.randomUUID().toString()); } } @GetMapping(value = "search") public List<Book> search() { log.error(THREAD_LOCAL_TEST.get()); return bookService.search(); } }使用jmeter进行请求,可以看到同一线程,输出的内容永远不会发生改变。可以在内次使用之前进行set(T value),但是set(T value)可能会导致内存无法释放。ThreadLocal可能导致的内存泄露ThreadLocal为了避免内存泄露,不仅使用了弱引用维护key,还会在每个操作上检查key是否被回收,进而再回收value。但是从中也可以看到,ThreadLocal并不能100%保证不发生内存泄漏。比如,很不幸的,你的get()方法总是访问固定几个一直存在的ThreadLocal,那么清理动作就不会执行,如果你没有机会调用set()和remove(),那么这个内存泄漏依然会发生。一个良好的习惯依然是:当你不需要这个ThreadLocal变量时,主动调用remove(),这样对整个系统是有好处的。@RestController @RequestMapping(value = "book") @Slf4j public class BookController { private static final ThreadLocal<String> THREAD_LOCAL_TEST = new ThreadLocal<>(); @Resource private IBookService bookService; /** * 构造函数 */ public BookController() { log.info("构造函数,此时bookService :" + bookService); } @PostConstruct public void init() { log.info("PostConstruct,此时bookService :" + bookService); } @PreDestroy public void destroy() { log.info("PreDestroy"); } @GetMapping(value = "set") public void set() { THREAD_LOCAL_TEST.set(UUID.randomUUID().toString()); } @GetMapping(value = "search") public List<Book> search() { log.error(THREAD_LOCAL_TEST.get()); THREAD_LOCAL_TEST.remove(); return bookService.search(); } }ThreadLocal与局部变量局部变量和ThreadLocal起到的作用是一样的,保证了并发环境下数据的安全性。那就是说,完全可以用局部变量来代替ThreadLocal咯?This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@code get} or {@code set} method) has its own, independently initialized copy of the variable. {@code ThreadLocal} instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).翻译过来 ThreadLocal提供的是一种线程局部变量。这些变量不同于其它变量的点在于每个线程在获取变量的时候,都拥有它自己相对独立的变量初始化拷贝。ThreadLocal的实例一般是私有静态的,可以做到与一个线程绑定某一种状态。所以就这段话而言,我们知道ThreadLocal不是为了满足多线程安全而开发出来的,因为局部变量已经足够安全。ThreadLocal是为了方便线程处理自己的某种状态。 可以看到ThreadLocal实例化所处的位置,是一个线程共有区域。好比一个银行和个人,我们可以把钱存在银行,也可以把钱存在家。存在家里的钱是局部变量,仅供个人使用;存在银行里的钱也不是说可以让别人随便使用,只有我们以个人身份去获取才能得到。所以说ThreadLocal封装的变量我们是在外面某个区域保存了处于我们个人的一个状态,只允许我们自己去访问和修改的状态。
2021年12月12日
1,888 阅读
0 评论
0 点赞
2021-12-10
log4j漏洞解决办法
漏洞详情Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。受影响的版本所有Apache Log4j 2.*系列版本:Apache Log4j 2.0-alpha1 – Apache Log4j 2.8.1不受影响的版本Apache Log4j 2.8.2修复及建议尽快通过参考链接中官网地址升级到最新版本:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2配置网络防火墙,禁止系统主动外连网络,包含不限于DNS、TCP/IP、ICMP。升级已知受影响的应用及组件,如srping-boot-strater-log4j2、ApacheSolr、Apache Flink、Apache Druid。紧急加固缓解措施:①设置参数:log4j2.formatMsgNoLookups=True②修改JVM参数:-Dlog4j2.formatMsgNoLookups=true③系统环境变量:FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true④禁止 log4j2 所在服务器外连
2021年12月10日
1,984 阅读
0 评论
0 点赞
2021-12-09
Parallels Desktop 虚拟机 v17.1.1 (51537)(含win10-win11镜像)
Parallels Desktop 虚拟机 v17.1.1 (51537)(含win10-win11镜像)
2021年12月09日
1,008 阅读
0 评论
0 点赞
2021-12-05
@SpringBootApplication标注非引导类
一般情况下,@SpringBootApplication一般都是标注在项目引导类上。像下面这样:@Slf4j @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoConfiguration.class, args); } }但是@SpringBootApplication一定要标注到引导类上吗?答案是否定的。我们可以将@SpringBootApplication标注到任意的类上。比如我们增加以下类package cc.lisen.demo.config; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoConfiguration { }然后改造引导类@Slf4j public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoConfiguration.class, args); } }再次运行项目,可以发现项目可以正常运行但是如果我们访问我们的接口,会发现提示404注意我们DemoConfiguration所在的包cc.lisen.demo.config,@SpringBootApplication只会扫描当前包及下级包,所以,我们的接口它扫描不到,就提示404。如果希望我们其他的类被扫描到,我们就需要添加scanBasePackages属性。package cc.lisen.demo.config; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages = {"cc.lisen.demo"}) public class DemoConfiguration { }重启项目,在访问接口,发现能正常访问
2021年12月05日
975 阅读
0 评论
0 点赞
1
...
16
17
18
...
53