首页
友链
统计
留言
关于
Search
1
Java使用poi-tl动态生成word和pdf
463 阅读
2
实现MyBatis拦截器自动填充创建、更新时间等字段属性值
208 阅读
3
Java生成二维码——基于Google插件
195 阅读
4
利用Spring的InitializingBean优雅的实现策略模式
169 阅读
5
springboot整合easyExcel导出excel
162 阅读
默认分类
Java
C语言
数据库技术
Linux
前端
其他
登录
/
注册
Search
标签搜索
C语言
数据结构
Java
Spring
数据库技术
MySQL
Hadoop
MapReduce
大数据
easyExcel
POI
MybatisPlus
AOP
SpringMVC
IDEA
工厂模式
策略模式
设计模式
LiXiangrong
累计撰写
57
篇文章
累计收到
7
条评论
首页
栏目
默认分类
Java
C语言
数据库技术
Linux
前端
其他
页面
友链
统计
留言
关于
搜索到
57
篇与
的结果
2024-01-03
实现MyBatis拦截器自动填充创建、更新时间等字段属性值
实现MyBatis拦截器自动填充创建、更新时间等字段属性值1.创建DataFill注解package com.risesun.common.core.annotation; import org.apache.ibatis.mapping.SqlCommandType; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Author LiXiangrong * @Description 这是用来默认填充的注释 value支持spel表达式 * @Date 2023/03/13 16:30:45 **/ @Documented @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface DataFill { String value(); /** * 填充的类型 * @return */ Class fillClass(); /** * sql插入类型 * @return 返回数组 */ SqlCommandType[] commandTypes(); }2.格式化方法Funcpackage com.risesun.common.core.utils; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Author LiXiangrong * @Description 公用函数类 * @Date 2023/03/13 14:13:20 **/ public class Func { /** * 日志 */ private static final Logger LOGGER = LoggerFactory.getLogger(Func.class); /** * @Author LiXiangrong * @Description 构造函数私有化 * @Date 2023/03/13 17:09:38 **/ private Func() { } /** * @Author LiXiangrong * @Description 安全的进行字符串 format * @Date 2023/03/13 16:09:13 * @Param target * @Param params * @Return java.lang.String **/ public static String formatStr(String target, Object... params) { if (target.contains("%s") && ArrayUtils.isNotEmpty(params)) { return String.format(target, params); } return target; } }3.SPEL表达式的定义// 自动插入创建时间和更新时间按SPEL表达式 public static final String DATE_DEFAULT_SPEL = "T(com.risesun.common.core.utils.DateUtil).getCurrentDate()"; // 自动插入登录用户名按SPEL表达式 public static final String USERNAME_DEFAULT_SPEL = "T(com.risesun.common.security.utils.SecurityUtils).getUsername()"; // 自动填充UUID public static final String UUID_DEFAULT_SPEL = "T(com.risesun.common.core.utils.uuid.IdUtils).randomUUID()"; // 自动填充雪花算法ID public static final String ASSIGN_ID = "T(com.risesun.business.util.CommonUtils).assignId()"; // 自动填充登陆人id(Long类型) public static final String USER_ID = "T(com.risesun.common.security.utils.SecurityUtils).getUserId()"; // 自动填充登陆人id(String类型) public static final String USERID_DEFAULT_SPEL = "T(com.risesun.common.security.utils.SecurityUtils).getUserId().toString()";4.创建自定义AutoFillInterceptor拦截器实现Mybatis的拦截器接口package com.risesun.business.config; import com.risesun.common.core.annotation.DataFill; import com.risesun.common.core.utils.Func; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Signature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.stereotype.Component; import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; /** * @Author LiXiangrong * @Description MyBatis拦截器填充属性值 * @Date 2023/03/13 17:00:33 **/ @Component @Intercepts({@Signature(type = org.apache.ibatis.executor.Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class AutoFillInterceptor implements Interceptor { public static final Logger log = LoggerFactory.getLogger(AutoFillInterceptor.class); public static final ExpressionParser SPEL_EXPRESSION = new SpelExpressionParser(); @Override public Object intercept(Invocation invocation) throws Throwable { Object[] params = invocation.getArgs(); MappedStatement mappedStatements = (MappedStatement) params[0]; SqlCommandType sqlCommandType = mappedStatements.getSqlCommandType(); log.info("开始自动填充..."); setDefaultValue(params[1], sqlCommandType); return invocation.proceed(); } /* * @Author LiXiangrong * @Description setDefaultValue * @Date 2023/03/13 17:02:17 * @Param metaObject * @Param sqlCommandType * @Return void **/ private void setDefaultValue(Object metaObject, SqlCommandType sqlCommandType) { Expression expression; List<Field> needFillList = new ArrayList<>(); //找到所有有DataFill注解的属性 ReflectionUtils.doWithFields(metaObject.getClass(), needFillList::add, getFieldFilter(sqlCommandType)); //将所有的属性进行赋值 for (Field field : needFillList) { DataFill fill = field.getAnnotation(DataFill.class); if (null != fill) { expression = SPEL_EXPRESSION.parseExpression(fill.value()); Object fillObj = expression.getValue(); if (fill.fillClass().isInstance(fillObj)) { ReflectionUtils.makeAccessible(field); ReflectionUtils.setField(field, metaObject, fillObj); //this.setFieldValByName(field.getName(), fillObj, metaObject); } else { throw new RuntimeException(Func.formatStr("默认值填充错误,{}的类型应该为{},传入的类型与其不兼容", field.getName(), fill.fillClass().getName())); } } } } /** * @Author LiXiangrong * @Description getFieldFilter * @Date 2023/03/13 17:03:07 * @Param sqlCommandType * @Return org.springframework.util.ReflectionUtils.FieldFilter **/ private ReflectionUtils.FieldFilter getFieldFilter(SqlCommandType sqlCommandType) { return field -> { DataFill fill = field.getAnnotation(DataFill.class); if (null == sqlCommandType) { return false; } return (fill != null && Arrays.asList(fill.commandTypes()).contains(sqlCommandType)); }; } @Override public Object plugin(Object target) { return Interceptor.super.plugin(target); } @Override public void setProperties(Properties properties) { Interceptor.super.setProperties(properties); } }
2024年01月03日
208 阅读
1 评论
0 点赞
2024-01-03
自定义Spring转换器解决参数格式转换异常
自定义Spring转换器解决参数格式转换异常1.出现的场景当某个实体查询参数类型是Long,Integer,BigDecimal等的时候,前端按照规范如果没有参数应该不传递参数,但是却传递的是字符串“null”的情况下,SpringMVC出现数据格式转换异常的错误。2.利用Spring的转换器拦截请求参数判断null映射成想要的结果import org.apache.commons.lang3.StringUtils; import org.springframework.core.convert.converter.Converter; public class LongConverter implements Converter<String, Long> { @Override public Long convert(String from) { if (StringUtils.isEmpty(from) || "null".equals(from)) { return null; } return Long.valueOf(from); } }3.实现WebMvcConfigurer配置自定义的转换器import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @Author LiXiangrong * @Description 自定义WebConfig * @Date 2023/04/23 10:35:27 **/ @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new IntegerConverter()); registry.addConverter(new LongConverter()); registry.addConverter(new BigDecimalConverter()); } }
2024年01月03日
36 阅读
0 评论
0 点赞
2024-01-03
IDEA注释模板快捷方式
* * @Author $user$ * @Description TODO * @Date $date$ $time$$param$$return$ **/模板变量1.param 表达式annotated("annotation qname")默认值:groovyScript("if(\"${_1}\"==\"null\"||\"${_1}\".length() == 2) {return '';} else {def result=''; def params=\"${_1}\".replaceAll('[\\[|\\]|\\s]', '').split(',').toList();for(i = 0; i < params.size(); i++) {if(i==0){result+='\n @Param ' + params[i]}else{result+='\n' + ' @Param ' + params[i]}}; return result;}", methodParameters());2.return 表达式annotated("annotation qname")默认值:groovyScript("if(\"${_1}\"==\"null\") {return '';} else {def returnType = \"${_1}\"; def result = '\n * @Return ' + returnType; return result;}", methodReturnType());3.user 表达式user() 默认值:4.date 表达式date("yyyy/MM/dd")5.time 表达式time() 默认值:
2024年01月03日
45 阅读
0 评论
0 点赞
2024-01-03
利用Spring的InitializingBean优雅的实现策略模式
当我们实现某个接口时,可能会有很多种不同的实现方式。这些不同的实现方式通过一定的规则可以随意切换使用时,我们就可以考虑使用策略模式来实现。1.首先建一个策略接口去继承InitializingBeanpackage com.example.springbootdemo.strategy; import com.example.springbootdemo.factory.WaitHandleContext; import org.springframework.beans.factory.InitializingBean; /** * @Author LiXiangrong * @Description 策略接口 * @Date 2023/03/13 13:08:20 **/ public interface Strategy extends InitializingBean { /** * @Author LiXiangrong * @Description 要实现的业务方法 * @Date 2023/03/13 13:08:48 * @Return void **/ void method(); @Override default void afterPropertiesSet() { WaitHandleContext.registry(this); } /** * @Author LiXiangrong * @Description getType * @Date 2023/03/13 13:08:43 * @Return java.lang.String **/ String getType(); }2.接下来需要创建一个上下文角色类去注册策略。策略模式的重点是上下文角色类,他封装了对具体策略的调用。上下文角色类中维护着一个抽象角色的引用,高层模块在调用上下文角色类时,通过构造方法或其他方式将具体的策略角色实例赋给该引用,然后调用上下文角色类中的方。通过高层模块在上下文角色类中设置的不同具体策略实例即可执行不同的具体策略。package com.example.springbootdemo.factory; import com.example.springbootdemo.strategy.Strategy; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; public class WaitHandleContext { private WaitHandleContext() { } private static final Map<String, Strategy> strategyMaps = new ConcurrentHashMap<>(); public static Strategy chooseStrategy(String type) { return Optional.ofNullable(strategyMaps.get(type)).orElseThrow(()->new IllegalArgumentException("无对应策略")); } public static void registry(Strategy strategy) { //不注册重复策略 strategyMaps.putIfAbsent(strategy.getType(), strategy); System.out.println("策略"+strategy.getType()+"注册成功!"); } }3.接下来去实现策略接口即可。
2024年01月03日
169 阅读
1 评论
1 点赞
2023-03-05
创建官方的Windows10系统USB驱动器
在这之前,需要准备一台可以联网的电脑和一个U盘,容量至少要8G,如果U盘中已经存在文件,需要先备份,否则文件会全部丢失。1.首先在微软官网的软件下载的Windows下载页面中点击“立即下载工具”按钮,使用该工具创建安装介质,以便于在其他的电脑上安装Windows10,网址如下:https://www.microsoft.com/zh-cn/software-download/windows10/ 2.下载完成后运行该工具,弹出如下窗口: 3.在点击下一步后,点击“接受”声明和许可条款。 4.在下一步中点击“为另一台电脑创建安装介质…”,然后点击下一步。 5.点击“对这台电脑使用推荐的选项”把前面的选项框的勾去掉。 6.选择U盘选项,可以在此时插入U盘,然后点击下一步。 7.在选择U盘页面的可移动驱动器中选择你插入的U盘,然后点击下一步。 8.等待下载Windows10操作系统文件。 9.等待创建Windows10介质。 10.就绪后点击完成,等待该工具清理产生的不必要的文件,然后就可以拔出U盘了,此时,Windows10操作系统驱动器介质已经创建完成。
2023年03月05日
61 阅读
0 评论
1 点赞
1
...
10
11
12