
玩转Java系列
文章平均质量分 57
该专栏结合博主多年一线项目开发经验,囊括了许多Java重难点的疑难杂症主要涉及SQL及系统调优、高可用方案落地、高并发解决方案、JVM监控及调优、SpringMVC&Mybatis开发日常问题;欢迎订阅我的专栏,希望对您有所帮助!
老张家的独苗
微信搜索「老张家的独苗」,回复关键字「资料」获取海量学习资源。我是张星,CSDN博客专家,CSDN内容合伙人,"老张家的独苗"公号作者,GitChat付费专栏作者,拥有5+年的技术TL的项目管理经验,1000+面试经验。
展开
-
Java运用PhantomJs实现后台截图
场景分析很多时候,业务需求需要在不依赖前端的前提下,进行后台截图;今天就以phantomjs实现后台截图。环境准备// 拉jingRUN rpm -ivh --nodeps "http://yum.tbsite.net/taobao/7/x86_64/test/phantomjs/phantomjs-2.1.1-767290.el7.x86_64.rpm"RUN cp /home/admin/phantomjs/phantomjs-2.1.1-linux-x86_64/bin/phantom原创 2022-05-19 18:34:41 · 747 阅读 · 0 评论 -
Java中执行python脚本
很多时候,项目中需要执行某些脚本来实现我们想要的效果;今天笔者就以java中执行python脚本为例。我们可以想象下,要想执行python的话,安装pyhton环境肯定是毋庸置疑的,然后python 脚本中相关的依赖包我们也得安装下。废话少说,上代码。Dockerfile安装python环境及依赖包# 安装python环境RUN rpm -ivh --nodeps "http://yum.tbsite.net/taobao/7/x86_64/current/python-3.8.2/python-.原创 2022-05-19 18:17:36 · 1543 阅读 · 0 评论 -
mybatis中#{}和${}的区别
1.mybatis中的#{}一般地,#{}在mybatis中表示申明一个变量;使用#{}传参时,sql语句解析是会加上"",比如 select * from user where name = #{name} ,传入的name为zhangxing,那么最后打印出来的sql为:select * from user where name = ‘zhangxing’,就是会当成字符串来解析原创 2017-07-13 10:53:04 · 8222 阅读 · 0 评论 -
mybatis中union all与union的用法
1.需求分析 很多情况下,我们会遇到类似的需求:混合型的列表再进行分类;这种情况,可以考虑java逻辑层面两个甚至更多的list相加,然后最后进行排序,但是一旦进行分页,排序可能就混乱了,这个笔者建议直接在sql里面union all多个结果集,然后对整体进行排序2.UNION ALL 与UNION的区别Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;Union Al...原创 2018-03-01 12:04:23 · 26622 阅读 · 5 评论 -
Mybatis的pageHelper插件实现分页
1.场景还原 近期的项目中屡次遇到分页的需求,今天我就MyBatis的pageHelper插件实现分页功能详细的给大家讲解一下。 2实现方案①添加pageHelper插件依赖 com.github.pagehelper pagehelper 4.1.4 ②在mybatis-config.xml配置pageHelperxml versi原创 2017-05-18 20:47:49 · 2199 阅读 · 0 评论 -
MyBatis中大于号以及小于号的表达方式
1.场景还原 在实际项目中,有很多需求需要通过设定一个具体的时间段来搜索或过滤所需的数据,今天笔者就mybatis中时间比较涉及到的大于,小于号的应用方法作个详尽的讲解。2.实现方案以下介绍两种可行方法:①转义法大于:>小于:<大于等于:>=小于等于:<=笔者案例:id="view" parameterType="map" r原创 2017-07-08 23:12:50 · 21127 阅读 · 2 评论 -
批量操作find_in_set的应用
1.场景分析 在项目需求中,许多地方会涉及到批量操作的需求,那么今天我给大家讲解一下mysql中函数find_in_set的用法2.实现方案需求:批量删除员工①mapper中的sql语句id="deleteMany" parameterType="String"> UPDATE staff st test="_parameter !=原创 2017-07-12 14:39:11 · 1950 阅读 · 0 评论 -
Mapper通用组件构建
组件构建思路在java代码中,我们可能会把公共的逻辑块进行复用,进而抽象成一个独立的组件,其作用无非就是为了配置简单,实现简洁;那么在mybatis的xml中,我们也可以延用这种思路,把公共的mapper处理块抽象成一个独立的组件,然后哪里需要哪里就去按需引用即可。实现方案Java层面,定义一个公共的Param类@Datapublic class TableFilterSortParam implements Serializable { @ApiModelProperty(va原创 2021-12-22 17:43:33 · 503 阅读 · 0 评论 -
mybatis中执行update字段值不变的情况下,返回值却是1
1.需求分析 近期,笔者在测试编程式事务的时候发现了一个问题:在测试接口中执行mybatis的update时,字段值设置不变,却返回还是1;这样的结果直接导致了编程式事务的原子性捕获形同虚设,好了笔者分享如下的解决方案2.实现方案①问题描述:在mysql客户端,笔者这里用的是navicat,在不修改字段值的情况下执行update时,返回的是0,但在mybatis中返回的却是1②解决方案在数据...原创 2018-06-12 11:22:10 · 12050 阅读 · 8 评论 -
动态sql标签trim的用法
1.场景分析 在实际的项目需求中,有很多字段数值为空,这时需要我们采取有效的方式避免空值插入数据库,今天主要讲解一下动态sql标签trim的用法2.实现步骤实际需求:插入一条用户信息,空值不允许插入1>取消指定的后缀①mapper中的sqlid="insertUserInfoByTrim" parameterType="com.cckj.bean.UserInfo原创 2017-07-12 21:33:56 · 12813 阅读 · 0 评论 -
mybatis中foreach的用法
1.场景还原 工作中,有很多地方需要用到批量删除或批量插入,或者是批量更新,抑或是批量查询,这样的需求难免会用到mybatis中的foreach标签2.foreach介绍标签的用法:6个参数:collection:要循环的集合index:循环索引;item:集合中的一个元素(item和collection,按foreach循环理解);open:以什么开始;原创 2017-09-29 14:04:09 · 2275 阅读 · 0 评论 -
mybatis+mysql返回以map形式插入的实体主键
1.场景还原 很多情况下,在一个实现类中会调用连环接口,那么在执行上个接口后,我们需要传入上个接口执行完成后返回的参数才能继续执行下个接口;今天就上个接口执行插入操作,然后得到上个接口的主键的需求剖析一下,另外主键以UUID随机生成的,不是自增的2.实现方案①直接贴代码添加公告-->id="addNotification" parameterType="java.ut原创 2017-09-21 20:00:31 · 4281 阅读 · 0 评论 -
mybatis-generator自动生成代码
1.场景分析 在实际项目中,很多寻常的逻辑,例如:数据库表的增,删,改,查;这些徒手写确实有些费人力又费时间,今天笔者向大家介绍自动生成代码的插件:mybatis-generator2.实现步骤①在pom.xml中配置generator插件 org.springframework.boot原创 2017-07-14 14:23:25 · 832 阅读 · 0 评论 -
sql的性能优化
1.场景还原 在项目后期,随着数据量的日益增加,一些查询接口就显得没那么好用,反应速度慢!这时,得考虑对项目的sql进行针对性的优化了,今天笔者将实际项目中的经验分享出来,希望能够恰到好处的帮助读者。2.优化方案①最常见的就是,查询具体字段,不要用 * 查询;②建索引(索引最好是那种唯一性较强的,对于状态值只有几种的字段就不用建索引)③explain (sql语句)通过分析上图中的数据,进行建索...原创 2018-04-25 21:02:02 · 428 阅读 · 0 评论 -
MySQL根据版本如何操作JSON字段
目录前言需求背景案例分析前言MySQL5.7及以上版本自带有操作JSON的内置函数,这里就不再赘述。今天我主要记录下MySQL5.7版本以下如何操作JSON字段。需求背景数据库某表的某字段是json串存值,现在要以json中某一字段的值作为这条记录是否能够被查询到的开关。大家可以设想下,如果不以为sql进行过滤的话, 在逻辑层面进行过滤对于分页数据势必有影响的,最好的情况还是在sql层面解决数据过滤问题。案例分析eg:学生表info字段json如下{ "control":原创 2021-03-05 15:59:45 · 712 阅读 · 1 评论 -
Mysql获取最新记录
前言怎么获取Mysql表中同一标识(flag)下多条记录的最新记录呢?这里的宗旨是先order by time desc,其结构作为一个父表,然后再在父表中进行group by flag;这里值得注意的是,如果order by 与 group by在同一维度中的话,group by应该放在order by之前。SQL示例对于多张维表 select task.* from task_info task left join( select *原创 2020-10-30 14:48:35 · 4028 阅读 · 6 评论 -
mysql中bug搜罗
1.场景还原 近日,公司项目在准上线的阶段,很多不兼容,乱码等问题蜂拥而至,为了满足评论添加表情的需求,需要将数据库的utf8换成utf8mb4,随之乱码就出现了,今天笔者分享几个mysql常见的bug的解决方案;2.解决方案①修改排序规则,致使乱码vim /etc/my.cnf编辑文件show variables like'character%';原创 2017-12-11 20:54:14 · 412 阅读 · 0 评论 -
mysql中两点之间距离的计算
1.需求分析 对于两点之间的距离,在mysql中可以根据两点的经纬度进行计算;接下来笔者分享两种方式通过两点的经纬度计算两点之间的距离2.实现方案废话不说,贴代码①mysql中计算ROUND(6378.138 * 2 * asin(sqrt(pow(sin((shop.shop_latitude * pi() / 180 - #{latitude} * p原创 2017-12-29 20:15:43 · 5434 阅读 · 0 评论 -
MySQL单条insert语句,插入多条数据记录
1.场景分析 当一条sql语句中包含多个insert,且以分号隔开,对于不同的mysqlb版本,有的可以执行成功,有的却直接报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException2.实现方案原创 2020-08-17 17:47:29 · 5099 阅读 · 0 评论 -
mysql优化思路
1.场景还原 在实际的开发维护工作中,mysql优化是一个不可绕道的优化方案,今天笔者就笼统的列出优化的几点思路2.优化思路①表结构的合理化设计,前提必须满足3NF;②添加适当的索引,索引大体分为四种:主键索引,唯一索引,全文索引,普通索引③分表技术(水平分割,垂直分割)④读写分离(主写从读)⑤存储过程(模块化编程,可提高速度)⑥mysql配置优化(配置最大并...原创 2018-09-02 12:07:09 · 1296 阅读 · 0 评论 -
mysql的悲观锁和乐观锁
1.需求分析 项目上线后,在并发的情况,数据库会插入重复的记录;在这种情况,mysql的悲观锁或乐观锁可以用来实现代码逻辑的并发控制。2.悲观锁①悲观锁,属于排它锁;当事务在操作数据时,它会把这部分数据进行锁定,直到操作完毕后再解锁,然后其他事务操作才可操作这部分的数据,这可以防止其他事务读取或修改表中的数据;大多数情况下,悲观锁依靠数据库的锁机制实现排它性。悲观锁的应用实例:②synch...原创 2018-03-08 09:06:08 · 543 阅读 · 0 评论 -
mysql的定时调度器
1.需求分析 在很多实际的项目中,定时执行某些逻辑很是多见;很多小伙伴立马会想到quartz定时框架,但是今天笔者要向大家介绍如何在mysql编写定时调度器。2.实现方案①mysql中函数或存储过程的编写DROP PROCEDURE IF EXISTS `hero`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PRO原创 2017-11-30 19:10:37 · 1917 阅读 · 0 评论 -
mysql中的case when的应用
1.需求分析 很多情况下,开发者需要以查询的字段作为条件进行数据过滤操作,这种情况有别于if条件过滤,if是对传值作为条件进行过滤;今天笔者以case when展开需求深究,希望能够帮助到各位读者;2.实现方案①首先,研究下case when的结构体case fruitwhen 'apple' when '苹果'when 'balana' when '香蕉'else原创 2017-11-16 17:30:08 · 973 阅读 · 0 评论 -
微信支付之原路退款
1.场景还原 最近项目要求上线微信支付原路退款功能,今天笔者就微信支付原路退款的流程梳理下,方便有需要的伙伴借阅2.准备工作①获取微信支付的相关配置WECHATPAY_PARTNER = "150xxxxxxx"; //商户号WECHATPAY_PARTNERKEY = "Yunjunxxxxxxxxxxxxxyyyyyyyy"; //商户秘钥②获取微信支付API证书微信支付后台管理--》A...原创 2018-05-10 17:06:31 · 31356 阅读 · 10 评论 -
谈谈HSF在Spring中的应用
谈谈HSF在Spring中的应用HSF简介HSF的应用场景什么是二方包服务提供方怎么提供服务?服务调用方怎么订阅服务?HSF简介HSF即高可用服务框架(High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框。HSF的应用场景HSF调用链包括服务调用方及服务提供方,服务提供方需要提供可用服务并提供二方包给服务调用方,服务调用方需要订阅提供方的服务,通过二方包调用相应的API完成请求。什么是二方包公司内部的依赖库,一般指公司内部的其他项目发布的原创 2021-02-05 15:15:38 · 862 阅读 · 0 评论 -
dubbo+zookeeper+dubbo-admin环境的搭建
1.dubbo简介 dubbo是源于阿里巴巴一种分布式服务架构,是现阶段较为流行的一种高效的分布式服务框架;今天笔者就为大伙介绍一下dubbo环境搭建的具体步骤,希望对大家有所帮助2.搭建环境准备①centOS7.0 linux系统②安装zookeeper③dubbo-admin.war解压缩3.具体实施方案1>zookeeper的安装①下载zookeeper的linux tar包并...原创 2017-09-14 17:35:37 · 896 阅读 · 1 评论 -
JVM GC收集器-Serial,Parallel,CMS,G1
1.Serial(串行收集器) Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(stop the world),直到它收集结束。CPU利用率最高,停顿时间即用户等待时间比较长。使用用法:设置JVM参数-XX:+UseSerialGC2.Pa...原创 2019-03-07 16:53:34 · 631 阅读 · 0 评论 -
JVisualVM如何远程监控tomcat
1.需求分析 实时的监控tomcat的运行状态对后期的项目优化非常有必要,对于服务器配型也起到了指导作用;今天笔者就如何开启tomcat的远程监控作个分享2.实现方案①检测tomcat是否开启监控ps -ef|grep tomcat如果出现以下效果,表示已安装过②反之,则编辑catalina.sh/JAVA_OPTS查找JAVA_OPTS,然后在JAVA_OPTS下面添加如下配置JAVA_O...原创 2018-06-12 17:13:59 · 2009 阅读 · 0 评论 -
oss多线程分片上传
1. 前言oss是阿里巴巴研发的分布式存储中间件,可以存储各种文件:图片,文档等;今天博主就oss多线程分片上传作个分享。2. 分片代码2.1 主线程代码 private static final long EACH_PART_SIZE = 2 * 1024 * 1024; // 创建InitiateMultipartUploadRequest对象 InitiateMultipartUploadRequest request = new Initia原创 2020-09-08 11:42:23 · 1738 阅读 · 0 评论 -
线程池的拆分
线程池的拆分可根据具体的业务进行拆分,每个线程执行的业务逻辑应该是一样且同步执行,talk is cheap, show you codeint columns = 10;ExecutorService pool = Executors.newFixedThreadPool(columns);final CountDownLatch countDownLatch = new Cou...原创 2020-01-22 14:43:39 · 667 阅读 · 0 评论 -
线程池异步消费
①新建一个重试线程 class RetryThread implements Callable<JSONArray> { String appType; String formInstId; String token; public RetryThread(String appType, String form...原创 2019-12-23 17:06:02 · 531 阅读 · 0 评论 -
Maven依赖优化
前言先谈谈自身的项目经验,每次在接手二次开发项目的时候,笔者都能发现一个明显却又广泛被忽视的问题:maven依赖很杂乱,甚至多有冗余的嫌疑;虽然说对于项目的运行没有什么障碍,但是对于后期的jar依赖的版本维护会很痛苦的,每次改升级某个JAR包版本的时候,还需要全局搜索并依次修改其版本。可想而知,这种方法是最笨且失误率是最大的。Maven依赖优化排除无用重复的基础JAR包每个jar包可能会依赖多个基础jar包,在工程中可能存在不同的jar包的基础jar相互重复,也就是我们经常见到的omitted原创 2020-11-11 16:21:19 · 673 阅读 · 0 评论 -
注解的实现原理及如何自定义注解
1.前言在springmvc及springboot中,注解随处可见,我们几乎每天都在跟他打交道;那么如何自定义注解呢?自定义注解会不会更香呢2.Java注解理解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然原创 2020-09-18 15:40:12 · 1431 阅读 · 1 评论 -
Java8炸翻天的Stream用法
1.Stream简介Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时原创 2020-09-10 17:33:35 · 621 阅读 · 0 评论 -
Java全局异常捕捉
1.场景还原 在项目开发中,对于各种异常都有不同的报错提示或策略,无疑对于用户或者开发来说,是一个很好的用户体验;如何在java定义一个全局异常捕捉呢?2.实现方案2.1 自定义一个业务异常类@Setter@Getterpublic class BizException extends RuntimeException { private static final long serialVersionUID = -6233506444097954612L; ...原创 2020-08-21 18:04:17 · 2291 阅读 · 0 评论 -
java jar包如何指定程序执行入口
1.需求背景 很多时候,我们需要单独开发一个工具类方便特殊的操作;这个可以理解为工具开发,那么怎么指定jar包的启动类呢?2.实现方案i.将pom中打包形式改为jar <packaging>jar</packaging>ii.如图注意:MANIFEST.MF在src下iii.导出jar包ok,就这样点击jar包就可以执行指定的入口程序呢!...原创 2020-06-16 16:44:44 · 4103 阅读 · 0 评论 -
Java Mail发送邮件
①pom依赖<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.2</version> </dependency>②代码实现 @Ov...原创 2019-12-25 17:52:59 · 695 阅读 · 0 评论 -
深度剖析之ThreadLocal
1.ThreadLocal是什么? ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本变量做一个映射,各个线程之间的变量互不干扰,从而实现数据隔离的效果;在高并发场景下,可以实现无状态的调用,适用于各个线程依赖不同的变量值完成相应操作的场景,ThreadLocal 最好用 private static final来修饰。2.从源码解析Thread...原创 2019-02-15 11:22:17 · 455 阅读 · 0 评论 -
Java线程池剖析
1.线程池的作用 线程池作用就是限制系统中执行线程的数量。根据系统的环境配置情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费系统资源,多了造成系统拥挤繁忙,效率不高。运用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待状态。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运...原创 2019-02-14 15:30:55 · 329 阅读 · 0 评论 -
静态方法中mapper的调用
1.场景还原 在开发的过程中,有很多想在静态方法中调用mapper的同学,但是实例化的mapper又不能在静态方法中引用,至此可能会放弃这个想法,今天笔者带着大家如何在静态方法中调用mapper;2.实现方案①全局上下文工具类配置@Slf4jpublic class ApplicationContextUtil { private static ApplicationContext...原创 2018-07-13 11:36:34 · 10216 阅读 · 2 评论