2021年啦,Mybatis Plus/Jpa的使用越来越多,项目中写SQL越来越少了,有的时候不得已还得写sql,比如: 关联字典,关联其他的表使用外键拿其他表的title/name 等等,为了更优雅的实现id变name/title 字典码变字典描述,easy trans横空出世,通过2个注解就能实现数据翻译,配合自己封装的一些baseService baseController,在配合一些代码生成器插件(比如EasyCode),可真正实现简单的CRUD不写一行代码的目标。
先看效果:
easy trans适用于三种场景
1 我有一个id,但是我需要给客户展示他的title/name 但是我又不想做表关联查询
2 我有一个字典吗 sex 和 一个字典值0 我希望能翻译成 男 给客户展示。
3 我有一组user id 比如 1,2,3 我希望能展示成 张三,李四,王五 给客户
easy trans的三种模式
1 使用redis缓存模式
一般用于分布式/微服务系统,比如我有用户服务和订单服务,在订单列表中需要展示创建人,他们又不是同一个进程,db也不是同一个,可使用redis 翻译模式
2 内存缓存(hashmap)模式
一般用于单体模式,缓存放到hashmap中。
3 非缓存模式
非缓存模式不使用缓存,调用 findbyids方法来获取数据用于翻译,一般用于表数据量比较大,缓存扛不住的情况。
1 、先把maven 引用加上
<dependency> <groupId>com.fhs-opensource</groupId> <artifactId>easy-trans-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency>
2、如果使用Redis请添加redis的引用(如果之前加过了请不要重复添加)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
3、在yaml中添加如下配置
easy-trans: autotrans: #您的service所在的包 支持通配符比如com.*.**.service.**,他的默认值是com.*.*.service.impl package: com.fhs.test.service.** #启用redis缓存 is-enable-redis: true #yixi spring: redis: host: 192.168.0.213 port: 6379 password: 123456 database: 0 timeout: 6000
4、如果不使用redis,请在启动类加禁用掉redis的自动配置类
@SpringBootApplication(exclude = { RedisAutoConfiguration.class })
1、字典翻译使用说明---直接上代码了,可以配合InitializingBean一起玩.
1.1 翻译缓存初始化
@Autowired //注入字典翻译服务 private DictionaryTransService dictionaryTransService; //在某处将字典缓存刷新到翻译服务中,以下是demo Map<String,String> transMap = new HashMap<>(); transMap.put("0","男"); transMap.put("1","女"); dictionaryTransService.refreshCache("sex",transMap);
1.2 字典翻译使用
//在对应的字段上 加此注解,type为TransType.DICTIONARY,key为字典分组码 @Trans(type = TransType.DICTIONARY,key = "sex") private Integer sex;
2、AutoTrans(除了字典外的其他表翻译)使用说明---直接上代码了,可以配合InitializingBean一起玩.
2.1 service实现类改动,主要2个点1是添加AutoTrans注解,2 是实现AutoTransAble 接口
@Service @AutoTrans(namespace = "teacher",fields = "name",defaultAlias = "teacher",useCache = true,useRedis = true) //namespace = 表别名 fields = 哪些字段需要出现在翻译结果中这里写了name defaultAlias =默认别名,比如我这里有个name字段别的表也有个name字段,为了区分这里配置为teacher 在翻译结果中 就会出现teacherName 而不是name useCache = 是否使用缓存 useRedis = 是否使用redis缓存 public class TeacherService implements AutoTransAble { //在不使用缓存的时候使用,如果transMore的时候会拼接teacherid集合,调用此方法获取id集合对应的teacher对象 public List<P> findByIds(List<?> ids) { //推荐使用JPA/Mybatis Plus的方法哦 return this.baseMapper.selectBatchIds(ids); } // 在开启缓存的时候,springboot启动完成后会拿所有数据放到缓存里 @Override public List select() { return this.baseMapper.selectList((Wrapper)null) } // 在不开启缓存的时候,transone会通过此方法获取翻译数据 @Override public VO selectById(Object primaryValue) { return this.baseMapper.selectById(primaryValue); }
以上,建议在baseservice中添加以上几个方法,这样子service就不用每个都写了。
2.2 Autotrans翻译使用
//指定翻译的namespace,和翻译类型为TransType.AUTO_TRANS @Trans(type = TransType.AUTO_TRANS,key = "teacher") private String teacherId; //如果有2个teacherid 可以通过namespace#别名 来起别名区分 @Trans(type = TransType.AUTO_TRANS,key = "teacher#english") private String englishteacherId;
3、POJO修改 a 实现vo接口(Teacher类也要实现哦),提供一个transMap,框架会把翻译结果put到这个map中,建议使用basePOJO 的方法来实现
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class Student implements VO { private String studentName; @Trans(type = TransType.AUTO_TRANS,key = "teacher") private String teacherId; @Trans(type = TransType.AUTO_TRANS,key = "teacher#english") private String englishteacherId; @Trans(type = TransType.DICTIONARY,key = "sex") private Integer sex; public Map<String,String> transMap = new HashMap<>(); @Override public Map<String, String> getTransMap() { return transMap; } }
4、框架中没有使用JPA/Mybatis Plus怎么办
//vo中有一个getPkey 方法默认是找@Id 或者 @TableId 标识的字段,如果没有使用JPA/Mybatis Plus 可重写此方法返回表主键的值比如 return this.id; @JsonIgnore @JSONField(serialize = false) default Object getPkey(){ Field idField = getIdField(true); try { return idField.get(this); } catch (IllegalAccessException e) { return null; } }
5、准备工作已经完成,最后一步,使用翻译服务进行翻译
@Autowired private TransService transService; @Test public void transOne(){ Student student = new Student(); student.setStudentName("张三"); student.setTeacherId("1"); student.setEnglishteacherId("2"); student.setSex(1); //翻译一个对象 transService.transOne(student); System.out.println(JsonUtils.bean2json(student)); } @Test public void transMore(){ Student student = new Student(); student.setStudentName("张三"); student.setTeacherId("1"); student.setEnglishteacherId("2"); student.setSex(1); List<Student> studentList = new ArrayList<>(); studentList.add(student); //翻译多个对象 transService.transMore(studentList); System.out.println(JsonUtils.list2json(studentList)); }
6、缓存刷新
6.1 非集群模式下的缓存刷新
调用AutoTransService的refreshCache(Map<String, Object> messageMap)
map中put一个namespace 为teacher的话,就代表刷新teacher的缓存,如果map中什么都不put代表刷新所有缓存。
6.2 集群模式下的缓存刷新(必须开启redis支持才可以)
@Autowired private RedisCacheService redisCacheService; Map<String, String> message = new HashMap(); message.put("transType", "auto"); message.put("namespace", "teacher"); this.redisCacheService.convertAndSend("trans", JsonUtils.map2json(message));
7、DEMO https://gitee.com/fhs-opensource/easy_trans_springboot_demo
教程看起来挺麻烦,只需要做2处封装,使用起来就很简单了,第一就是baseserivce的封装(主要提供那三个获取翻译数据的方法 和 缓存刷新的方法),第二就是base pojo的封装(主要是getTransMap 给翻译服务返回一个hashmap用来装填数据用),作者已经和ruoyi guns 做好了对接,需要资料什么的可以直接加群联系作者。
中文翻译: 1 curl_easy_setopt(3) libcurl 手册 curl_easy_setopt(3) 2 3 名称 4 curl_easy_setopt -curl的设置选项 5 6 概要 7 #include <curl/curl.h> 8 9 CU
1 affine仿射变换概念 在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,"和。..相关")由一个线性变换接上一个平移组成。 2 agg::trans_affine成员函数说明 2.1 缩放 inline const trans_affine&trans_affine::scale(double x, double y) 参数一对x横坐标的缩放系数,参数
中文翻译: curl_easy_setopt(3) libcurl 手册 curl_easy_setopt(3) 名称 curl_easy_setopt -curl的设置选项 概要 #include <curl/curl.h> CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); 描述 curl_easy_se
EasyRpc——一个简单的RPC框架 项目介绍 easy-RPC 是一款低性能的服务框架,主要用于学习造轮子! 学习本项目可以让你从零开始实现一个类似 Dubbo 服务框架 mini 版RPC。 如果你认真学下来,可以掌握以下的技术: 底层网络层基于 netty,学完 netty 入门没有问题; 使用自定义注解,学完可以了解注解的基本运行机制; 服务注册基于 zookeeper,学完 zk 入门
1 affine仿射变换概念 在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,"和。..相关")由一个线性变换接上一个平移组成。 2 agg::trans_affine成员函数说明 2.1 缩放 inline const trans_affine&trans_affine::scale(double x, double y) 参数一对x横坐标的缩放系数,参数
各位朋友大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com。最近EasyAR终于迎来了一次重大的版本更新:v1.10,真可谓是“千呼万唤始出来”啊,所以在官方文档和示例项目基本完善的情况下,博主决定将EasyAR尝鲜系列教程继续下去。本次教程主要以官方新发布的Unity示例项目为基础来进行讲解,关注Androis/iOS原生应用开发的朋友请自行针
我们在EasyAR 初学者入门系列的第一篇教程中展现了EasyAR 最基本的功能,使得一个模型以AR技术呈现在我们面前,实在炫酷。扫描识别图之后展现一个模型,如果仅仅是静态的,体验效果也不是很好,所以根据市面上的常见AR APP,给大家总结了几种常见的AR模型的交互方式。我们在最基础的 HelloAR 这个项目的基础上进行开发,前提是大家已经掌握好了如何基础性的搭建EasyAR+unity 的开发
问题内容: 我有包含以下代码的python代码。 不幸的是,对python中的所有键进行循环并不能达到我的目的,因此我想将此代码转换为C 。对于以元组为键的python词典,最佳的C 数据结构是什么?以上代码的C ++等价物是什么? 我在boost库中查看了稀疏矩阵,但是找不到简单的方法来仅在非零元素上循环。 问题答案: 字典将是c ++中的std :: map,具有两个元素的元组将是std ::
我正试着翻阅这本字典 我想要跟踪这本字典中最大的数字,以及与这个数字对应的键的名称 下面是我的代码: 但我得到了以下类型的错误:的值 我不知道我在哪里错过了适当的迭代。请帮忙。谢谢
网页版 http://h5.m.taobao.com/borrowbook/braille.html 联系作者:刘学炜 liu.xuewei@hotmail.com 简介: toBraille是一个Java盲文翻译库目前支持简体、繁体中文、字母、数字、图片中的文字换为盲文,而且还能智能识别数据源中的拼音串转换成对应发音的盲文,并能将数据源通过TTS语音合成技术朗读出来。 (暂时不支持外文,但已加
问题内容: 我在相当大的Angular项目上使用angular-translate。我将项目分为多个模块以使其更易于管理,但是无法分解每个模块的翻译字符串。 例如,我有模块A和B,其中B是A的子模块。有一些与模块A覆盖的HTML有关的字符串,它们位于’/json/localization/A/en.json’中。同样,我在’/json/localization/B/en.json’中放置了与B有关
本文向大家介绍JavaScript通过字典进行字符串翻译转换的方法,包括了JavaScript通过字典进行字符串翻译转换的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript通过字典进行字符串翻译转换的方法。分享给大家供大家参考。具体分析如下: 这里实际上就是先设置一个对照的字典,然后通过翻译函数,从字典中找到相应的键值。需要在JavaScript 1.8以上版本使用
您可使用 Google Translate™ 应用程式翻译词组: 按下侧边电源按钮打开应用程式菜单,找到并轻触Translate(翻译)。 您将看到翻译源语言与目标语言这两种语言。您可通过轻触某一语言的名称来更改语言。 轻触“麦克风”图标并说出您想翻译的词组。 译文将显示在屏幕上。
我正在用Django做一个中文博客。我用中文写所有我能控制的东西,如文章文本,博客标题,博客导航,评论和联系人表单的标签标签。我唯一不能控制的是表单提交错误,如“此字段是必需的。”,“输入有效的电子邮件地址。”。因为我使用django评论框架和表单库来制作我的评论表单和联系人表单,我不知道如何将英文版替换成中文版。 为什么django翻译一些错误消息而忽略其他错误消息? 如果django不能自动翻
本文向大家介绍python爬虫实现中英翻译词典,包括了python爬虫实现中英翻译词典的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python爬虫实现中英翻译词典的具体代码,供大家参考,具体内容如下 通过根据某平台的翻译资源,提取出翻译信息,并展示出来,包括输入,翻译,输出三个过程,主要利用python语言实现(python3.6),抓取信息展示。 以上就是本文的全部内容,希望对