EasyTrans,一个注解搞定数据翻译,减少30%SQL代码量

介绍


easy trans适用于3种场景

1 有userId/idCardNo(身份证号码-唯一键场景) 需要 userName,无需联表查询。

2 有gender code 0 需要 男。

3 枚举指定属性给前端

亮点

1 缓存支持

2 跨微服务翻译支持(User和Order 是2个不同微服务,order里面有userId 需要userName)

3 国际化支持

4 多种ORM框架适配

5 多数据源支持

6 集合支持(userIds [1,2,3] 翻译为张三,李四,王五)

使用步骤


技术经理/架构 需要做的事情

1 、先把maven 引用加上(注意,阿里云Maven仓库可能无法获取最新版本,切到腾讯或者使用中央仓库即可。当然也可以选择阿里云有的版本使用)

    <dependency>
            <groupId>com.fhs-opensource</groupId>
            <artifactId>easy-trans-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

Mybatis plus 扩展:

      <dependency>
            <groupId>com.fhs-opensource</groupId>
            <artifactId>easy-trans-mybatis-plus-extend</artifactId>
            <version>2.1.5</version>
        </dependency>

JPA 扩展:

     <dependency>
            <groupId>com.fhs-opensource</groupId>
            <artifactId>easy-trans-jpa-extend</artifactId>
            <version>2.1.5</version>
        </dependency>

Beetl SQL 扩展:

          <dependency>
            <groupId>com.fhs-opensource</groupId>
            <artifactId>easy-trans-beetl-sql-extend</artifactId>
            <version>2.1.5</version>
        </dependency>

TK Mybatis(通用mapper) 扩展:

        <dependency>
            <groupId>com.fhs-opensource</groupId>
            <artifactId>easy-trans-tk-extend</artifactId>
            <version>2.1.5</version>
        </dependency>

如果使用Redis请添加redis的引用(如果之前加过了请不要重复添加)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、在yaml中添加如下配置

easy-trans:
   #启用redis缓存 如果不用redis请设置为false
   is-enable-redis: true
   #启用全局翻译(拦截所有responseBody进行自动翻译),如果对于性能要求很高可关闭此配置
   is-enable-global: true 
   #启用平铺模式
   is-enable-tile: true
   #字典缓存放到redis 微服务模式请开启
   dict-use-redis: true 
   # ruoyi相关的请开启
   is-enable-map-result: true

3、如果不使用redis,请在启动类加禁用掉redis的自动配置类

@SpringBootApplication(exclude = { RedisAutoConfiguration.class })

4、初始化字典数据(如果你们项目没字典表请忽略)

    @Autowired  //注入字典翻译服务
       private  DictionaryTransService dictionaryTransService;
       //在某处将字典缓存刷新到翻译服务中,以下是demo
       Map<String,String> transMap = new HashMap<>();
       transMap.put("0","男");
       transMap.put("1","女");
       dictionaryTransService.refreshCache("gender",transMap);

5、微服务配置

A、白名单添加 /easyTrans/proxy/** 保证其不被拦截,RPC trans的时候easytrans会自动调用目标微服务的接口来获取数据。

B、应用之间的认证可以通过filter/interceptor实现,然后自定义RestTemplate 保证easytrans在请求用户服务的时候带上需要认证的参数

普通程序员需要做的事情

pojo 中添加

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
//实现TransPojo  接口,代表这个类需要被翻译或者被当作翻译的数据源
public class Student implements TransPojo {
     // 字典翻译 ref为非必填
    @Trans(type = TransType.DICTIONARY,key = "sex",ref = "sexName")
    private Integer sex;

    //这个字段可以不写,实现了TransPojo接口后有一个getTransMap方法,sexName可以让前端去transMap取
    private String sexName;
    
    //SIMPLE 翻译,用于关联其他的表进行翻译    schoolName 为 School 的一个字段
    @Trans(type = TransType.SIMPLE,target = School.class,fields = "schoolName")
    private String schoolId;
 
 //远程翻译,调用其他微服务的数据源进行翻译
 @Trans(type = TransType.RPC,targetClassName = "com.fhs.test.pojo.School",fields = "schoolName",serviceName = "easyTrans",alias = "middle")
    private String middleSchoolId;
 
 // 枚举翻译,返回文科还是理科给前端
 @Trans(type=TransType.ENUM,key = "desc")
    private StudentType studentType = StudentType.ARTS;

    public static enum StudentType{

        ARTS("文科"),
        SCIENCES("理科");

        private String desc;
        StudentType(String desc){
            this.desc = desc;
        }
    }
}

然后访问你的controller,看返回结果。

easy trans 支持的五种类型

字典翻译(TransType.DICTIONARY)

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

简单翻译(TransType.SIMPLE)

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

跨微服务翻译(TransType.RPC)

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

AutoTrans(TransType.AUTO)

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

枚举翻译(TransType.ENUM)

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

项目地址


https://gitee.com/dromara/easy_trans

示例项目


https://gitee.com/fhs-opensource/easy_trans_springboot_demo

插件文档


http://easy-trans.fhs-opensource.top/

已经使用此插件的企业(非完全统计)


1、陕西小伙伴网络科技有限公司

2、中软国际云智能业务集团

3、深圳市易流科技股份有限公司

4、陕西逐道科技有限公司

5、深圳市易联联盟科技有限公司

6、中体数科(北京)体育发展有限公司

7、首都信息发展股份有限公司

8、航天神舟智慧系统技术有限公司

9、小诺V2 https://gitee.com/xiaonuobase/snowy

10、山东大小同屏科技有限公司

11、山东酸橙网络科技有限公司

12、桔子数字科技有限公司

13、成都新潮传媒集团股份有限公司

14、陕西汇每家信息科技有限公司(每一天便利店连锁)

15、江西云牛科技

16、广州彩讯数字技术有限公司

17、江苏誉鸣航智能科技有限公司

18、maku-boot https://gitee.com/makunet/maku-boot

19、北京大美星空科技有限公司

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 iBatis 中,可以使用注解方式执行 SQL 查询并返回一个实体类里包含另一个实体类。这可以通过使用 `@Result` 注解中的 `association` 属性来实现。 首先,需要在执行 SQL 查询的方法上使用 `@Select` 注解指定 SQL 语句,并通过 `resultMap` 属性指定返回结果的映射关系。 然后,在 `@Results` 注解中使用 `@Result` 注解来指定主实体类的属性映射关系,并使用 `@Association` 注解来指定从属实体类的属性映射关系。 以下是一个示例代码: ```java public interface MyMapper { @Select("SELECT a.id AS a_id, a.name AS a_name, b.id AS b_id, b.name AS b_name FROM table_a a JOIN table_b b ON a.id = b.a_id WHERE a.id = #{id}") @Results({ @Result(property = "id", column = "a_id"), @Result(property = "name", column = "a_name"), @Result(property = "subEntity", column = "b_id", javaType = SubEntity.class, one = @One(select = "getSubEntityById")) }) MyEntity getEntityById(@Param("id") int id); @Select("SELECT id AS id, name AS name FROM table_b WHERE id = #{id}") SubEntity getSubEntityById(@Param("id") int id); } public class MyEntity { private int id; private String name; private SubEntity subEntity; // Getters and setters } public class SubEntity { private int id; private String name; // Getters and setters } ``` 在这个例子中,`MyMapper` 接口定义了两个方法 `getEntityById` 和 `getSubEntityById`,分别执行两个不同的 SQL 查询语句。 `MyEntity` 类中包含了一个 `SubEntity` 类的属性 `subEntity`,通过使用 `@Result` 注解中的 `association` 属性,指定了从属实体类的映射关系。在 `@One` 注解中,通过 `select` 属性指定了调用的方法名。 当需要执行这个查询并返回一个实体类里包含另一个实体类时,只需要调用 `getEntityById` 方法并传入相应的参数即可。返回的结果将会是一个完整的 `MyEntity` 对象,其中的 `subEntity` 属性也会被填充为对应的 `SubEntity` 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值