项目开发的常用模版类

news/2024/11/18 11:23:21/文章来源:https://www.cnblogs.com/pxxl/p/18552156

mybatis的相关配置

1. 拦截及配置sql

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.defaults.DefaultSqlSession.StrictMap;
import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.*;/*** @Description: 通过拦截 sql 实现 sql语句 格式化、性能监控和日志记录* @Author: YccLin* @Date: 2024/11/17*/
@Intercepts(value = {@Signature(args = {Statement.class, ResultHandler.class}, method = "query", type = StatementHandler.class),@Signature(args = {Statement.class}, method = "update", type = StatementHandler.class),@Signature(args = {Statement.class}, method = "batch", type = StatementHandler.class)})
public class SqlBeautyInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object target = invocation.getTarget();long startTime = System.currentTimeMillis();// target -> StatementHandlerStatementHandler statementHandler = (StatementHandler) target;try {return invocation.proceed();} finally {long endTime = System.currentTimeMillis();long sqlCost = endTime - startTime;BoundSql boundSql = statementHandler.getBoundSql();String sql = boundSql.getSql();Object parameterObject = boundSql.getParameterObject();List<ParameterMapping> parameterMappingList = boundSql.getParameterMappings();// 格式化sqlsql = formatSql(sql, parameterObject, parameterMappingList);System.out.println("SQL: [ " + sql + " ]执行耗时[ " + sqlCost + "ms ]");}}@Overridepublic Object plugin(Object o) {return Plugin.wrap(o, this);}@Overridepublic void setProperties(Properties properties) {}private String formatSql(String sql, Object parameterObject, List<ParameterMapping> parameterMappingList) {if (Objects.equals(sql, "") || sql.isEmpty()) {return "";}sql = beautifySql(sql);if (parameterObject == null || parameterMappingList == null || parameterMappingList.isEmpty()) {return sql;}String sqlWithoutReplacePlaceholder = sql;try {Class<?> parameterObjectClass = parameterObject.getClass();if (isStrictMap(parameterObjectClass)) {StrictMap<Collection<?>> strictMap = (StrictMap<Collection<?>>) parameterObject;if (isList(strictMap.get("list").getClass())) {sql = handleListParameter(sql, strictMap.get("list"));}} else if (isMap(parameterObjectClass)) {Map<?, ?> paramMap = (Map<?, ?>) parameterObject;sql = handleMapParameter(sql, paramMap, parameterMappingList);} else {sql = handleCommonParameter(sql, parameterMappingList, parameterObjectClass, parameterObject);}} catch (Exception e) {return sqlWithoutReplacePlaceholder;}return sql;}private String handleCommonParameter(String sql, List<ParameterMapping> parameterMappingList,Class<?> parameterObjectClass, Object parameterObject) throws Exception {Class<?> originalParameterObjectClass = parameterObjectClass;List<Field> allFieldList = new ArrayList<>();while (parameterObjectClass != null) {allFieldList.addAll(new ArrayList<>(Arrays.asList(parameterObjectClass.getDeclaredFields())));parameterObjectClass = parameterObjectClass.getSuperclass();}Field[] fields = new Field[allFieldList.size()];fields = allFieldList.toArray(fields);parameterObjectClass = originalParameterObjectClass;for (ParameterMapping parameterMapping : parameterMappingList) {String propertyValue = null;if (isPrimitiveOrPrimitiveWrapper(parameterObjectClass)) {propertyValue = parameterObject.toString();} else {String propertyName = parameterMapping.getProperty();Field field = null;for (Field everyField : fields) {if (everyField.getName().equals(propertyName)) {field = everyField;}}field.setAccessible(true);propertyValue = String.valueOf(field.get(parameterObject));if (parameterMapping.getJavaType().isAssignableFrom(String.class)) {propertyValue = "\"" + propertyValue + "\"";}}sql = sql.replaceFirst("\\?", propertyValue);}return sql;}private String handleMapParameter(String sql, Map<?, ?> paramMap, List<ParameterMapping> parameterMappingList) {for (ParameterMapping parameterMapping : parameterMappingList) {Object propertyName = parameterMapping.getProperty();Object propertyValue = paramMap.get(propertyName);if (propertyValue != null) {if (propertyValue.getClass().isAssignableFrom(String.class)) {propertyValue = "\"" + propertyValue + "\"";}sql = sql.replaceFirst("\\?", propertyValue.toString());}}return sql;}private String handleListParameter(String sql, Collection<?> col) {if (col != null && !col.isEmpty()) {for (Object obj : col) {String value = null;Class<?> objClass = obj.getClass();if (isPrimitiveOrPrimitiveWrapper(objClass)) {value = obj.toString();} else if (objClass.isAssignableFrom(String.class)) {value = "\"" + obj.toString() + "\"";}sql = sql.replaceFirst("\\?", value);}}return sql;}private String beautifySql(String sql) {sql = sql.replaceAll("[\\s\n ]+", " ");return sql;}private boolean isPrimitiveOrPrimitiveWrapper(Class<?> parameterObjectClass) {return parameterObjectClass.isPrimitive() || (parameterObjectClass.isAssignableFrom(Byte.class)|| parameterObjectClass.isAssignableFrom(Short.class)|| parameterObjectClass.isAssignableFrom(Integer.class)|| parameterObjectClass.isAssignableFrom(Long.class)|| parameterObjectClass.isAssignableFrom(Double.class)|| parameterObjectClass.isAssignableFrom(Float.class)|| parameterObjectClass.isAssignableFrom(Character.class)|| parameterObjectClass.isAssignableFrom(Boolean.class));}/*** 是否DefaultSqlSession的内部类StrictMap*/private boolean isStrictMap(Class<?> parameterObjectClass) {return parameterObjectClass.isAssignableFrom(StrictMap.class);}/*** 是否List的实现类*/private boolean isList(Class<?> clazz) {Class<?>[] interfaceClasses = clazz.getInterfaces();for (Class<?> interfaceClass : interfaceClasses) {if (interfaceClass.isAssignableFrom(List.class)) {return true;}}return false;}/*** 是否Map的实现类*/private boolean isMap(Class<?> parameterObjectClass) {Class<?>[] interfaceClasses = parameterObjectClass.getInterfaces();for (Class<?> interfaceClass : interfaceClasses) {if (interfaceClass.isAssignableFrom(Map.class)) {return true;}}return false;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836067.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11月16日,工信部人才交流中心 CUUG - PGCP / PGCM认证考试完成!

2024年11月16日,由工业和信息化部人才交流中心 与 北京神脑资讯技术有限公司共同举办的PostgreSQL管理员岗位能力认证考试(PGCP中级/PGCM高级)完成。 中级PG认证专家-PGCP(PostgreSQL Certified Professional):是对PostgreSQL数据库技术能力的一种认可,达到了专家级别,…

manim边做边学--球体

Sphere类用于创建三维球体对象,它提供了丰富的参数和方法来定制球体的外观和行为。 球体在制作三维动画时,具有广泛的应用场景。 比如:展示几何概念:通过创建不同大小、颜色和透明度的球体,可以直观地展示几何中的体积、表面积等概念 物理模拟:在模拟物理现象(如重力、碰…

闵可夫斯基和

闵可夫斯基和 前言 部分图片来自 https://www.luogu.com.cn/article/mhp0aeub。 定义 对于两个向量集合 \(A,B\),它们的闵可夫斯基和为 \(\{ a+b | a \in A, b \in B\}\)。 求解 在 OI 中,我们一般研究凸包的闵可夫斯基和。 如图是两个凸包的闵可夫斯基和。本文来自博客园,作…

UNIAPP设置消息推送(v1.0),自定义铃声功能

目前项目需要开发一个物联网APP进行设备绑定、警情查看、统计分析、设备操作、自定义报警铃声等相关功能 采用的uniapp进行开发,功能其实都很简单就是调用SDK进行设备关联、数据的增删改查,逻辑清晰明了,没想到问题出在了消息推送这块, 消息推送-因为是uniapp进行开发所以采…

仓储和运输如何协同?项目管理在物流行业的应用

物流运输是现代经济的核心,覆盖了供应链的多个环节,从订单接收到仓储管理,再到运输配送,每一步都关系到效率和成本。然而,物流行业的复杂性也带来了管理难题,例如多部门协作不畅、运输计划不可控、资源分配不合理等。面对这些挑战,项目管理工具正逐步成为提升物流运输效…

6、oracle网络(监听)

oracle包含 1、软件 2、数据库 3、实例 4、监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动;数据库启动,监听也可以不启动;数据库启动,监听也启动 监听和数据库是独立分开的数据库的整个网络结构图解: 1、数据库有数据库的名字:dbname;…

inline-block元素下移问题的分析及解决

不知道大家有没有遇到过这种蛋疼的情况,当你排列了三个 display 属性为inline-block的 div 时。我们在其中一个div中输入文字,就会出现如下这种现象,设置文字 div 的布局变化了。问题定位 为什么会出现这种情况呢?我们打开控制台查看一下元素布局,如下图我们能看到第二个 …

NOIP 模拟赛:2024-11-16

全体栽在 T1 ? T1:二分一下内存大小然后模拟判断。关键点在于意识到 "解码" 和 "播放" 这两种事件是分开的。用一个 while 循环,每次循环从 "完成某帧的解码"、"开始某帧的解码"、"播放某帧"、"删除某帧" 之间…

什么是员工绩效管理系统?员工绩效管理系统怎么用?

我们都知道,面对大环境激烈的竞争,企业在运作工程中,员工绩效管理系统有着至关重要的地位。它与员工个人的职业发展和工作成果息息相关,更是企业实现战略目标、在激烈竞争中崭露头角的关键所在。 不少企业在实施绩效管理系统时遇到了不少麻烦,但是他们建立了完善的绩效管理…

5、oracle内存及进程操作讲解

内存结构 1、shared pool 缓存着sql、sql执行计划 查询shared pool大小: select * from v$sga_dynamic_components;2、buffer cache 缓存着数据文件里面的block 查看buffer cache里面的buffer: select * from v$bh;一行一个buffer buffer里面有一个字段:TCH 用户登录上数据库…

为什么需要[EnumeratorCancellation]?

在编写 async IAsyncEnumerable为什么需要 [EnumeratorCancellation]? 在使用 C# 编写异步迭代器时,您可能会遇到如下警告: warning CS8425: 异步迭代器“TestConversationService.ChatStreamed(IReadOnlyList<ChatMessage>, ChatCompletionOptions, CancellationToke…

解决MindSpore-2.4-GPU版本的安装问题

本文介绍了在Ubuntu-20.04系统下安装最新的MindSpore-2.4-for-GPU版本的方法,以及安装过程中有可能出现的一些问题。虽然在MindSpore的正式版本中已经不再支持GPU硬件后端,但是开发版本目前还是持续在支持的,并且其中包含了2.3和2.4版本的新特性,只是算子层面没有更新和优化…