我的编程空间,编程开发者的网络收藏夹
学习永远不晚

数据翻译——Easy_Trans的简单使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

数据翻译——Easy_Trans的简单使用

目录

Easy Trans

1、适用场景

2、easy trans 支持的五种类型

3、环境搭建

4、简单翻译(TransType.SIMPLE)

5、字典翻译(TransType.DICTIONARY)

6、跨微服务翻译(TransType.RPC)

7、自定义数据源翻译(TransType.AUTO_Trance)


Easy Trans

1、适用场景

1 我有一个id,但是我需要给客户展示他的title/name 但是我又不想自己手动做表关联查询

2 我有一个字典码 sex 和 一个字典值0 我希望能翻译成 男 给客户展示。

3 我有一组user id 比如 1,2,3 我希望能展示成 张三,李四,王五 给客户

4 我有一个枚举,枚举里有一个title字段,我想给前端展示title的值 给客户

5 我有一个唯一键(比如手机号,身份证号码,但是非其他表id字段),但是我需要给客户展示他的title/name 但是我又不想自己手动做表关联查询

2、easy trans 支持的五种类型

字典翻译(TransType.DICTIONARY)

需要使用者把字典信息刷新到DictionaryTransService 中进行缓存,使用字典翻译的时候取缓存数据源

简单翻译(TransType.SIMPLE)

比如有userId需要userName或者userPo给前端,原理是组件使用MybatisPlus/JPA的API自动进行查询,把结果放到TransMap中。

跨微服务翻译(TransType.RPC)

比如订单和用户是2个微服务,但是我要在订单详情里展示订单的创建人的用户名,需要用到RPC翻译,原理是订单微服务使用restTemplate调用用户服务的一个统一的接口,把需要翻译的id传过去,然后用户微服务使用MybatisPlus/JPA的API自动进行查询把结果给订单微服务,然后订单微服务拿到数据后进行翻译,当然使用者只是需要一个注解,这些事情都是由组件自动完成的。

自动翻译(TransType.AUTO)

还是id翻译name场景,但是使用者如果想组件调用自己写的方法而不通过Mybatis Plus/JPA 的API进行数据查询,就可以使用AutoTrans

枚举翻译(TransType.ENUM)

比如我要把SEX.BOY 翻译为男,可以用枚举翻译。

3、环境搭建

引入maven依赖

注意,阿里云Maven仓库因为阿里本身软件升级所以暂时无法同步中央仓库的新发布版本依赖,所以要用新版本请使用中央仓库maven

  <dependency>            <groupId>com.fhs-opensourcegroupId>            <artifactId>easy-trans-spring-bootstarterartifactId>            <version>2.0.12version> dependency>

使用Mybatis plus,请引入Mybatis plus 扩展:

    <dependency>        <groupId>com.fhs-opensourcegroupId>        <artifactId>easy-trans-mybatis-plusextendartifactId>        <version>2.0.12version>    dependency>

使用JPA,请引入JPA 扩展:

    <dependency>        <groupId>com.fhs-opensourcegroupId>        <artifactId>easy-trans-jpa-extendartifactId>        <version>2.0.12version>    dependency>

使用Redis,请添加redis的引用

       <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-dataredisartifactId>        dependency>

4、简单翻译(TransType.SIMPLE

4.1 使用步骤

TransType.SIMPLE 简单翻译,无需自己实现数据源(推荐),适用于根据id翻译name/title等 。此数据源需要配合easy_trans_mybatis_plus_extend或者easy_trans_jpa_extend一起使用。

在需要翻译的字段上添加下面一行注解即可:

@Trans(type = TransType.SIMPLE,target = Users.class,fields = "userName")

type表示翻译类型 -- 简单翻译

target表示要翻译出来的结果字段在哪个表中(对应的实体类)

fields表示对应翻译的是哪个字段

除了此这几个属性必须添加外,还可以添加ref/refs,fileds,alias,后面会详细介绍他们的用法。

我们准备一张设备表device和一张用户表users,其中device表中的device_id 字段关联了users表中的id字段。

002cbc50246042ce136361506912bb0e.png

Device.java

package com.example.pojo;import com.baomidou.mybatisplus.annotation.TableField;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.util.List;@Data//实现TransPojo  接口,代表这个类需要被翻译或者被当作翻译的数据源public class Device extends BaseEntity implements TransPojo {    private Long id;    private String deviceCode;    private String deviceName;    private String devicePlace;    private String deviceImage;//SIMPLE 翻译,用于关联其他的表进行翻译 userNamephoneUsers 的字段    @Trans(type = TransType.SIMPLE,target = Users.class,fields = {"userName", "phone"})    private Long userId;}

Users.java

package com.example.pojo;import com.baomidou.mybatisplus.annotation.TableField;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.time.LocalDate;import java.util.Date;@Data//实现TransPojo  接口,代表这个类需要被翻译或者被当作翻译的数据源public class Users extends BaseEntity implements TransPojo {    private Long id;    private String userName;    private LocalDate hireDate;  //入职时间    private Integer gender;    //用户性别,1--男,0--    private String phone;}

DeviceController.java

   @Autowired    private DeviceService deviceService;            @GetMapping    //TransMethodResult用于将翻译的结果映射到trnasMap中展示    @TransMethodResult    public R<List<Device>> getDeviceList() {        //list()Mybais plus提供的方法        List<Device> deviceList = deviceService.list();    }

查询结果如下:

a401f84cf39d1d3b3b7e5db51ef8ebb5.png

我们发现userId已经成功地被翻译成了userName和phone,并将翻译的结果封装在了transMap中。

如果我们想让userName、phone在json中和userId同级展示,可以使用平铺模式:

在application.xml中开局平铺模式

easy-trans:  is-enable-tile: true #启用平铺模式

此时再看结果,我们发现 userName、phone和userId是同级

bd3eaddc56d003f3a1d039fd8d2dc1ce.png

ref/refs,fileds,alias的使用

ref----将翻译出来的数据映射到本实体类的某个属性上

refs----将翻译出来的数据映射到本实体类的某个属性上--多个

alias----别名,解决翻译结果字段名重名问题

package com.example.pojo;import com.baomidou.mybatisplus.annotation.TableField;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.util.List;@Datapublic class Device extends BaseEntity implements TransPojo {    private Long id;    private String deviceCode;    private String deviceName;    private String devicePlace;    private String deviceImage;    @Trans(type = TransType.SIMPLE,target = Users.class,fields = {"userName", "phone"},refs = {"userName","phone"},alias="english")    private Long userId;    @TableField(exist = false)    private String englishUserName;    @TableField(exist = false)    private String englishPhone;}

4.3 SIMPLE 翻译缓存

官方提供了@TransDefaultSett注解 来开启SIMPLE的缓存功能,只需要给数据源实体类上加@TransDefaultSett(isUseCache = true) 即可。可选参数:

1. isUseCache 是否开启 缓存 默认为false 需要开启设置为true即可

2. cacheSeconds 缓存失效时间 单位秒 默认5

3. maxCache 最大缓存数量 默认为1000

4. isAccess 默认false 设置为true的话会按照最后一次访问时间 进行缓存过期计时 false按照添加时间计时

package com.example.pojo;import com.baomidou.mybatisplus.annotation.TableField;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.time.LocalDate;import java.util.Date;@Data@TransDefaultSett(isUseCache = true,cacheSeconds = 1000,maxCache = 1000,isAccess = false)public class Users extends BaseEntity implements TransPojo {    private Long id;    private String userName;    private LocalDate hireDate;  //入职时间        private Integer gender;    //用户性别,1--男,0--女    private String phone;}

没配置缓存时,后台查询了两个表

3e2b84b0a6eca092ff68065b002337a8.png

配置缓存后第二次查询,发现只查询了主表,说明我们配置缓存成功了

7904a56b25b881b863c3c70eaf5da3f7.png

 

5、字典翻译(TransType.DICTIONARY

5.1 使用步骤

如果我们要将users表中的性别gender字段进行翻译,gender为0时翻译成男,gender为1时翻译成女。这个时候我们可以使用字典翻译:

在需要翻译的字段上添加下面一行注解即可:

@Trans(type = TransType.DICTIONARY,key = "gender")

type表示翻译类型 -- 字典翻译

key:指定具体数据源(type为TransType.DICTIONARY 的时候,DictionaryTransService 我们注入了很多字典分组的数据,有订单状态,有性别,有爱好,那么这里要指 定字典分组的名字,比如你要翻译的是性别那么就指定sex,你想翻译订单状态就指定orderStatus)

初始化字典数据:

package com.example.config;import com.fhs.trans.service.impl.DictionaryTransService;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import java.util.HashMap;import java.util.Map;@Configurationpublic class DictionaryConfig implements InitializingBean {    //注入字典翻译服务    @Autowired    private DictionaryTransService dictionaryTransService;    @Override    public void afterPropertiesSet() throws Exception {        //将字典缓存刷新到翻译服务中        Map transMap = new HashMap<>();        transMap.put("0","男");        transMap.put("1","女");        dictionaryTransService.refreshCache("gender",transMap);    }}

Users.java

package com.example.pojo;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.time.LocalDate;@Datapublic class Users extends BaseEntity implements TransPojo {    private Long id;    private String userName;    private LocalDate hireDate;  //入职时间    @Trans(type = TransType.DICTIONARY,key = "gender")    private Integer gender;    //用户性别,1--男,0--女    private String phone;}

接下来我们来看翻译结果:

56831fa2f61a75d49cf1fd5c8f0c6dae.png

5.2 配置redis缓存

字典默认使用hashmap来存放缓存,也支持使用redis 来组二级缓存,这样内存中没有的时候会自动去redis里面找,然后放到内存中,解决了多微服务字典问题,也保证了性能。

开启方式:

easy-trans:  is-enable-redis: true  dict-use-redis: true 

5.3 枚举翻译

直接看代码:

package com.example.pojo;import com.baomidou.mybatisplus.annotation.TableField;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.time.LocalDate;@Datapublic class Users extends BaseEntity implements TransPojo {    private Long id;    private String userName;    private LocalDate hireDate;  //入职时间    private Integer gender;    //用户性别,1--男,0--女    @Trans(type = TransType.ENUM, key = "desc")    @TableField(exist = false)    private UserSexEnum sexEnum;    public UserSexEnum getSexEnum() {        if(gender != null) {            return UserSexEnum.getEnum(gender);        }        return sexEnum;    }    private String phone;}

package com.example.pojo;public enum UserSexEnum {(1,"男"),(0,"女");    private Integer type;    private String desc;    public String getDesc() {        return desc;    }    UserSexEnum(Integer type, String desc) {        this.type = type;        this.desc = desc;    }    public static UserSexEnum getEnum(Integer type) {        UserSexEnum value = null;        for(UserSexEnum temp : UserSexEnum.values()) {            if(type.equals(temp.type)) {                value = temp;                break;            }        }        return value;    }    @Override    public String toString() {        return this.getDesc();    }}

接下来我们来看翻译结果:

ccb86c36ebb430c378b67171e72a2fdc.png

6、跨微服务翻译(TransType.RPC

6.1 使用步骤

首先准备一张 tb_order表和一张 tb_user表,分别存放订单服务的数据和用户服务的数据

ab1110960af746becda158ae6a0fa7b5.png

然后在idea中创建微服务项目,分别创建 order-service服务、user-service服务、eureka-service服务。

e8a916a17206e80f36d36043004cdb7b.png

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务
  • user-service:用户微服务,负责用户相关业务
  • eureak-service:注册中心

接下来,分别在order-service和user-service中引入easy-trans依赖:

            com.fhs-opensource        easy-trans-spring-bootstarter        2.0.12                com.fhs-opensource        easy-trans-mybatis-plusextend        2.0.12    

需求:在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。所以这里需要使用远程翻译 TransType.RPC,使用注解如下:

@Trans(type = TransType.RPC,targetClassName = "cn.itcast.user.pojo.User",fields = "userName",serviceName = "user-service")

serviceName:对方微服务的服务名称TransType.RPC的时候组件自动调用其他微服务的接口获取数据,所以要指定服务名称,easyTrans会自动去注册中心获取对应的服务实例URL进行调用

targetClassName:对方的实体类全名

fields:用来指定我需要对方类的要哪个字段

Order.java (order-service)

package cn.itcast.order.pojo;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;@Datapublic class Order implements TransPojo {    private Long id;    private Long price;    private String name;    private Integer num;    @Trans(type = TransType.RPC,targetClassName = "cn.itcast.user.pojo.User",fields = "userName",serviceName = "user-service")    private Long userId;}

OrderController.java

    @GetMapping()    @TransMethodResult    public List getOrderList() {        // 根据查询所有订单并返回        return orderService.list();    }

然后我们将user-service和order-service以及eureak-service全部启动,调用对应的api,结果如下:

userId已经成功地在微服务环境下翻译成了userName

7、自定义数据源翻译(TransType.AUTO_Trance)

7.1 使用步骤

TransType.AUTO_TRANS 表示自动自定义数据源翻译,如果想组件调用自己写的方法而不通过Mybatis Plus/JPA 的API进行数据查询,就可以使用AutoTrans

如果用了Mybatis Plus或者springDataJPA,官方强烈建议使用SIMPLE Trans来代替AutoTrans,如果非要使用,那么继续往下看:

1、先在application.yam文件配置你的数据源类所在的包:

easy-trans:  autotrans:    package: com.example.service.**;

2、然后在需要翻译的实体类中添加@Trans注解

package com.example.pojo;import com.baomidou.mybatisplus.annotation.TableField;import com.fhs.core.trans.anno.Trans;import com.fhs.core.trans.anno.TransDefaultSett;import com.fhs.core.trans.constant.TransType;import com.fhs.core.trans.vo.TransPojo;import lombok.Data;import java.util.List;@Datapublic class Device extends BaseEntity implements TransPojo {    private Long id;    private String deviceCode;    private String deviceName;    private String devicePlace;    private String deviceImage;    @Trans(type = TransType.AUTO_TRANS, key = "user")    private Long userId;        @TableField(exist = false)    private Users users;}

3、在所在类里实现AutoTransAble接口和添加@AutoTrans注解

package com.example.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.example.mapper.UserMapper;import com.example.pojo.Users;import com.example.service.UserService;import com.fhs.core.trans.anno.AutoTrans;import com.fhs.core.trans.vo.VO;import com.fhs.trans.service.AutoTransable;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.net.ssl.SSLSession;import java.io.Serializable;import java.time.LocalDate;import java.util.ArrayList;import java.util.Arrays;import java.util.List;@Service// namespace 别名,和@Trans注解的key对应上 fields别的类需要我的什么字段这里写什么@AutoTrans(namespace = "user",fields = {"userName","phone"})public class UserServiceImpl extends ServiceImpl implements UserService, AutoTransable {    @Override    public List selectByIds(List ids) {        System.out.println(ids);        List usersList = new ArrayList<>();        for (Object id : ids) {            Users user = this.getById((Long) id);            usersList.add(user);        }        return usersList;    }    @Override    public List select() {        return null;    }    @Override    public Users selectById(Object primaryValue) {        return null;    }}

为了查询方便,我这里仍然使用了Mybatis plus作为查询,但因为这里是自定义数据源,可以自己写sql执行查询。接下来我们来看结果:

需要更详细说明请参考官方文档!!

链接:Easy-Trans | Easy-Trans

来源地址:https://blog.csdn.net/csdn_0921/article/details/128380310

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

数据翻译——Easy_Trans的简单使用

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

下载Word文档

猜你喜欢

哪款中英翻译器简单实用?在线翻译的简单方法

如何利用中英翻译器轻松完成中英翻译?英语作为一种国际通用语言,当你出国旅游时无论去哪,只要掌握了英语都很方便,但如果你的英文很差时该怎么办呢?当然是利用中英翻译器来解决翻译问题,今天小编将要教大家如何完成在线翻译。
2023-06-04

条件数据库Android:sqllite的简单使用

SQLite分析 SQLite是轻量级的、嵌入式的、关系型数据库,现在已经在iPhone、Android等手机系统中应用,SQLite可移植性好,很轻易应用,很小,高效而且牢靠。SQLite嵌入到应用它的应用程序中,它们共用
2022-06-06

Android string-array数据源简单使用

在Android中,用string-array是一种简单的提取XML资源文件数据的方法。 例子如下: 把相应的数据放到values文件夹的arrays.xml文件里 <
2022-06-06

Android使用SQLite数据库的简单实例

先画个图,了解下Android下数据库操作的简单流程:1.首先,写一个自己的数据库操作帮助类,这个类继承自Android自带的SQLiteOpenHelper. 2.在自己的DAO层借助自己的Helper写数据库操作的一些方法 3.Acti
2022-06-06

Android数据库(SQLite)的简单使用——增、删、查改功能的简单实现

记录一下Android数据库的增删查改的简单使用 话不多说,先献上你们最爱的效果图~ 这边我用的是一个ListView来展示数据库里的数据准备工作: 先写一个类继承SQLiteOpenHelper,因为SQLiteOpenHelper.ja
2022-06-06

Python使用zlib对数据进行简单压

在Python丰富的库中,也有着对数据进行压缩处理的库(zlib)。对于需要数据压缩的应用程序,此模块中的功能允许使用zlib库进行压缩和解压缩。 (本文只对简单的字符串数据进行压缩,如需压缩文件等复杂数据类型,详见zlib官网进行更详细的
2023-01-31

java 使用HttpURLConnection发送数据简单实例

java 使用HttpURLConnection发送数据简单实例每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection
2023-05-31

使用Java获取Json中的数据简单示例

开发过程中经常会遇到json数据的处理,而单独对json数据进行增删改并不方便,下面这篇文章主要给大家介绍了关于使用Java获取Json中的数据,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-15

解析Android中string-array数据源的简单使用

在Android中,用string-array是一种简单的提取XML资源文件数据的方法。例子如下:把相应的数据放到values文件夹的arrays.xml文件里 代码如下:
2022-06-06

Java数据结构之位图的简单实现和使用

位图, 是一种非常常见的结构, 它使用每个二进制位来存放一个值的状态, 就类似于 Java 当中 HashSet 存储元素的功能。本文主要来介绍一下位图的简单实现和使用,需要的可以参考一下
2023-05-19

Android使用Intent传大数据简单实现详解

这篇文章主要为大家介绍了Android使用Intent传大数据简单实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-01

怎样使用阿里云数据库简单易上手的使用指南

阿里云数据库是阿里云推出的一款高性能、高可用的数据库服务,旨在帮助企业提高数据处理效率,提升业务运营水平。本文将详细介绍如何使用阿里云数据库。使用步骤:创建阿里云数据库实例首先,你需要在阿里云上创建一个数据库实例。这可以通过阿里云的控制台完成。在控制台中,选择“数据库”服务,然后点击“创建实例”按钮。在创建实例的
怎样使用阿里云数据库简单易上手的使用指南
2023-12-09

Pinia简单使用及数据持久化怎么实现

这篇文章主要讲解了“Pinia简单使用及数据持久化怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pinia简单使用及数据持久化怎么实现”吧!基本介绍Pinia 是 Vue.js 的轻
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录