iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何利用Java使用AOP实现数据字典转换
  • 621
分享到

如何利用Java使用AOP实现数据字典转换

2024-04-02 19:04:59 621人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录简介案例介绍案例实现切面定义总结简介 aop也是我们常说的面向切面编程,AOP在我们开发过程中应用也比较多,在这里我们就基于AOP来实现一个数据字典转换的案例。 案例介绍 相信各

简介

aop也是我们常说的面向切面编程,AOP在我们开发过程中应用也比较多,在这里我们就基于AOP来实现一个数据字典转换的案例。

案例介绍

相信各位在写代码的时候肯定有过这样的经历,我们设计数据库时对于字典类的数据一般都会采用字典码进行存储,而不是直接使用字典值。首先是因为这是一种开发规范,其次使用编码也会利于数据存储,数据整体也会比较干净整洁。

数据字典编码的定义一般也会做一些分类,比如说U01开头代表用户类型,U02开头代表用户性别等等,这样也有助于我们进行数据分析

下面我们就简单以一个用户表来做数据字典转换。

案例实现

创建表:

CREATE TABLE `t_user` (
  `id` BIGINT(12) NOT NULL AUTO_INCREMENT,
  `user_code` VARCHAR(20) NOT NULL,
  `user_name` VARCHAR(50) NOT NULL,
  `user_type` CHAR(5) NOT NULL COMMENT '用户类型 -> U0101:普通用户,U0102:VIP用户',
  `gender` CHAR(5) NOT NULL COMMENT '用户性别 -> U0299:未知,U0201:男,U0202:女',
  PRIMARY KEY (`id`) 
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

代码结构:

相关代码可由逆向工程去生成,我们就简单的编写了从控制层请求到服务层的业务处理再到dao层的数据处理,在这里我就一一将代码展示出来了各位还需要自己多动手。下面就直接上代码结构图

测试接口:

接下来我们在UserController类中写一个测试接口,根据userCode查询用户信息如下:

@GetMapping("/{userCode}")
public UserVo queryUser(@PathVariable("userCode") String userCode) {
    UserDto userDto = userService.queryUserByCode(userCode);
    return userMapStruct.userDtoToUserVo(userDto);
}

初始化测试数据:

切面定义

定义注解类:用于标记哪个地方需要进行数据字典转换切面。

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DictParam {
    
    String targetField() default "";

    
    String field();

    
    String dictType();
}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DictHelper {
    
    DictParam[] value();
}

定义注解切面类:主要实现字典转换的核心内容。

@Slf4j
@Aspect
public class DictHelperAspect {
    public DictHelperAspect() {
    }
    @Around("@annotation(dictHelper)")
    public Object doAround(ProceedingJoinPoint joinPoint, DictHelper dictHelper) {
        try {
            // 执行方法得到结果
            Object result = joinPoint.proceed();

            DictParam[] values = dictHelper.values();
            if (values == null || values.length == 0) {
                return result;
            }

            // 字典转换开始(使用反射)
            for (DictParam value : values) {
                Class<?> clazz = result.getClass();
                // 反射调用get方法获取字段值
                Method sourceMethod = clazz.getMethod("get" + firstToUppercase(value.field()));
                Object fieldValue = sourceMethod.invoke(result);
                // 获取字典值
                String dictValue = DictConfig.DICT_MAPPER.get(value.dictType()).get(fieldValue.toString());
                // 获取目标方法进行设值
                String targetField = StringUtils.isBlank(value.targetField()) ? value.field() : value.targetField();
                Method targetMethod = clazz.getMethod("set" + firstToUppercase(targetField), dictValue.getClass());
                targetMethod.invoke(result, dictValue);
            }
            return result;
        }
        catch (Throwable throwable) {
            log.error("error:", throwable);
            return null;
        }
    }

    private String firstToUppercase(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
}

Service层添加字典转换的切面扫描注解:

@DictHelper(values = {
        @DictParam(field = "userType", targetField = "userTypeShow", dictType = "USER_TYPE"),
        @DictParam(field = "gender", targetField = "genderShow", dictType = "GENDER")
})
public UserDto queryUserByCode(String userCode) {
    UserEntity userEntity = userMapper.selectUser(userCode);
    return userMapStruct.userEntityToUserDto(userEntity);
}

如上代码主要分三个步骤:

  • 根据@DictParam注解配置的数据来源字段通过返回调用数据返回对象获取数据来源字典编码。
  • 根据字典编码通过字典编码表(这里直接使用静态DictConfig直接调用)找到对应字典值。
  • 根据@DictParam注解配置的目标数据字典,将匹配到的数据字典值通过反射将数据回填到对象中。

注意:各位开发者朋友们,看到这里是不是以为很简单呢,但是在实际开发过程中我们更注重的是程序的安全、稳定、可靠,所以这也不难看出上面的代码当中省去了许多校验

静态字典:实际开发过程中,不建议这么配置,因为这样是完全不灵活的,这里只是为了方便演示而已。实际业务当中可以自定义一种数据字典加载策略(服务启动成功后加载或者定期刷新加载),将字典加载到内存,或者使用数据库结合Redis做内存也可以,数据字典还是要避免频繁直接的去查数据库。

public class DictConfig {
    public static final Map<String, Map<String, String>> DICT_MAPPER = new HashMap<>();
    static {
        Map<String, String> USER_TYPE = new HashMap<>();
        USER_TYPE.put("U0101", "普通用户");
        USER_TYPE.put("U0102", "VIP用户");
        DICT_MAPPER.put("USER_TYPE", USER_TYPE);

        Map<String, String> GENDER = new HashMap<>();
        GENDER.put("U0201", "男");
        GENDER.put("U0202", "女");
        GENDER.put("U0299", "未知");
        DICT_MAPPER.put("GENDER", GENDER);
    }
}

运行结果:

总结

利用切面编程还可以做很多事,本文所展示的数据字典转换也仅仅只是冰山一角,像用的比较多的分页处理我们也一样可以用这种方式去做。

数据字典在我们开发设计当中是必不可少的,合理的使用好数据字典还是很有必要的。

到此这篇关于如何利用Java使用AOP实现数据字典转换的文章就介绍到这了,更多相关Java AOP字典转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何利用Java使用AOP实现数据字典转换

本文链接: https://www.lsjlt.com/news/152941.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何利用Java使用AOP实现数据字典转换
    目录简介案例介绍案例实现切面定义总结简介 AOP也是我们常说的面向切面编程,AOP在我们开发过程中应用也比较多,在这里我们就基于AOP来实现一个数据字典转换的案例。 案例介绍 相信各...
    99+
    2024-04-02
  • 利用JAVA如何实现将汉字转换为ASCII
    今天就跟大家聊聊有关利用JAVA如何实现将汉字转换为ASCII,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JAVA 中实现整句汉字拆分、转换为ASCII实例详解大家都知道,一个汉字...
    99+
    2023-05-31
    java 汉字 ascii
  • 利用Java如何实现将字符串转换为日期时间
    这篇文章将为大家详细讲解有关利用Java如何实现将字符串转换为日期时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体如下:Java版本:1.8开始import java.time.Loc...
    99+
    2023-05-31
    java 字符串 日期时间
  • python如何使用zip函数实现字典键值对互换
    这篇文章给大家分享的是有关python如何使用zip函数实现字典键值对互换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。zip 函数实现字典键值对互换>>> lang = {"pyth...
    99+
    2023-06-26
  • 利用Java如何实现反转数组
    这期内容当中小编将会给大家带来有关利用Java如何实现反转数组,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数组翻转的方法(java实现),数组翻转,就是将数组倒置,例如原数组为:{"a&quo...
    99+
    2023-05-31
    java 数组反转 ava
  • JavaScript利用normalizr实现复杂数据转换
    目录如何使用解析逻辑高阶用法处理数组反向解析Entity 配置其他笔者曾经开发过一个数据分享类的小程序,分享逻辑上类似于百度网盘。当前数据可以由被分享者加工然后继续分享(可以控制数据...
    99+
    2024-04-02
  • 如何使用Java实现大小写转换
    这篇文章主要介绍“如何使用Java实现大小写转换”,在日常操作中,相信很多人在如何使用Java实现大小写转换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java实现大小写转换”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • 如何用PHP实现数字和字母间的转换
    PHP是一种十分强大的编程语言,开发者可以利用PHP开发出各种各样的应用程序和功能,其中数字和字母之间的转换就是PHP中比较基础的操作之一。本文将介绍如何使用PHP来实现数字和字母之间的转换,包括数字转换为字母、字母转换为数字等。一、数字转...
    99+
    2023-05-14
    php
  • python如何利用字典与函数实现switch case功能
    python如何利用字典与函数实现switch case功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 Python不像C/C++,J...
    99+
    2024-04-02
  • 利用Java如何实现替换int数组中的重复数据
    本篇文章为大家展示了利用Java如何实现替换int数组中的重复数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体如下:package test;import java.util.HashSet;...
    99+
    2023-05-31
    java 数组 ava
  • 如何使用Python实现字典合并
    这篇文章给大家分享的是有关如何使用Python实现字典合并的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、用for循环把一个字典合并到另一个字典把a字典合并到b字典中,相当于用for循环遍历a字典,然后取出a字...
    99+
    2023-06-29
  • Python如何利用字典树实现猎词游戏
    本篇内容主要讲解“Python如何利用字典树实现猎词游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何利用字典树实现猎词游戏”吧!猎词(word hunt)是一类很常见的游戏,给...
    99+
    2023-07-02
  • VB.NET如何实现数据转换
    这篇文章给大家分享的是有关VB.NET如何实现数据转换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VB.NET数据转换的方法有很多种,要想熟练的掌握好这些实用技巧,就需要通过不断的实践去积累经验,来熟练掌握这一...
    99+
    2023-06-17
  • MySQL如何使用Navicat导出数据字典
    小编给大家分享一下MySQL如何使用Navicat导出数据字典,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!数据字典是一名DBA...
    99+
    2024-04-02
  • 如何使用css3来实现数字换行
    这篇文章主要介绍了如何使用css3来实现数字换行,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在css中,可以...
    99+
    2024-04-02
  • 利用java怎么将数字金额转转换为大写
    这篇文章将为大家详细讲解有关利用java怎么将数字金额转转换为大写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。将数字金额大写,如下:public class Test { pri...
    99+
    2023-05-31
    java ava
  • 如何利用Python将字典转为成员变量
    目录技术背景使用__dict__定义成员变量嵌套字典转成员变量总结概要参考链接技术背景 当我们在Python中写一个class时,如果有一部分的成员变量需要用一个字典来命名和赋值,此...
    99+
    2024-04-02
  • PHP如何使用函数实现类型转换
    这篇文章主要介绍了PHP如何使用函数实现类型转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。转换函数转换通过intval() floatval() strval()三个转换...
    99+
    2023-06-17
  • 使用java如何将文字转换为五笔
    使用java如何将文字转换为五笔?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:package com.core.utils;public class ...
    99+
    2023-05-31
    java ava
  • 如何利用python实现列表嵌套字典取值
    目录一、实例二、解决思路三、代码示例一、实例 将以下列表的backup_unit_id全部提取出来 示例: dbs = [{         "backup_unit_id": 16...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作