简介
开发中会经常遇到这样的场景:比如在成绩表有一个student_id,如果我要查看成绩列表需要学生的名称,一般写法就是使用join,现在大部分ORM框架对于表关联支持并不是很友好,所以很多时候我们都要自己写SQL去实现。翻译服务就是为了简化这种查询的写法,使用翻译服务,您只需要单表查询成绩表即可,然后调用翻译服务的transMore方法即可。
demo
如下这样写即可实现根据parkId翻译parkName
@TransTypes(types = {"pagex"})
public class PayCarcome extends BaseDO<PayCarcome> implements Syncable {
//DO中给需要翻译的字段加注解
@Trans(type="pagex",key="parking")
private String parkId;
}
//注入翻译服务
@Autowired
private TransService transService;
//使用翻译服务翻译结果
List<PayCarcome> comrecords = carcomeService.findCarComeListByPlatNumberLike(payCarcome.getPlateNumber(),null);
transService.transMore(comrecords);
//翻译后每个PayCarcome.getTransMap 中就已经有翻译的结果了。
原理
所有的DO都继承了SuperBean,SuperBean中包含一个属性叫做transMap,翻译服务根据反射获取到哪些字段需要翻译,id是多少,然后去对应的缓存中(可以是redis,也可以是进程级缓存)获取翻译出来的结果put到transMap中。
如何实现一个翻译服务-java方式
@Service
public class AreaTransServiceImpl implements ITransTypeService,InitializingBean {
/**
* redis 缓存服务
*/
@Autowired
private RedisCacheService<String> redisCacheService;
/**
* 将自身注册为一个服务
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
TransService.registerTransType("areaInfo", this);
}
/**
* 翻译单条数据
* @param obj 需要翻译的对象
* @param toTransList 需要翻译的字段
*/
@Override
public void transOne(SuperBean<?> obj, List<Field> toTransList) {
for (Field tempField : toTransList)
{
tempField.setAccessible(true);
String areaID = null;
try
{
areaID = StringUtil.toString(tempField.get(obj));
}
catch (IllegalArgumentException | IllegalAccessException e)
{
e.printStackTrace();
}
obj.getTransMap().put(tempField.getName() + "AreaName", redisCacheService.getStr(Constant.AREA_NAME + areaID));
}
}
/**
* 翻译多条数据
* @param objList 需要翻译的对象集合
* @param toTransList 需要翻译的字段集合
*/
@Override
public void transMore(List<? extends SuperBean<?>> objList, List<Field> toTransList) {
for(SuperBean<?> obj : objList)
{
transOne(obj, toTransList);
}
}
}
FHS自带了哪些翻译服务
areaInfo - 省市区 编码翻译省市区名称,wordbook 字典,可以根据字典编码翻译为字典的显示值,比如0翻译为男,1翻译为女。 sysUser - 系统用户翻译,sysOrganizationInfo 系统组织机构id 翻译组织机构名称。 SysUser如何使用字典和组织机构翻译demo:https://gitee.com/fhs-opensource/fhs-framework/blob/master/fhs_framework_base_business/src/main/java/com/fhs/ucenter/bean/SysUser.java
FHS AutoTrans服务
将一张表设置为翻译数据源。
@Service("parkParkingService")
@AutoTrans(namespace = "parking",fields = {"parkName"},useCache = false)
public class ParkParkingServiceImpl extends BaseServiceImpl<ParkParking> implements ParkParkingService {
}
PAGEX使用:
{name:'park_id',title:'停车场名称',width:'20%',trans:'auto',key:'parking',showField:'transMap.parkName',align:'center'}
普通java po使用;
@Trans(type="auto",key="parking")
private String parkId;
使用pagex开发翻译服务
假如有一个t_park_parking表,我们需要使用park_id翻译park_name,可以这样写:
var modelConfig= {title:'停车场',pkey:'id',type:'uuid',orderBy:'update_time Desc',
namespace:"parking",table:'t_park_parking',trans:true,extendsParam:'parent_park_id=${param.parent_park_id}',
joinColumns:JSON.stringify({park_name:'parkName'}),db:"park",dp:JSON.stringify({id:'parkIds'}),isMultiTenant:true};
主要是pkey和joinColumns 2个key的配置,pkey代表这个表的主键joinColumns代表别人关联我,需要拿我的什么,demo中是需要拿我的parkName(park_name是db字段,parkName是transMap放的时候的key),,更多pagex玩法参考pagex章节介绍。 更多翻译服务请参考源码:https://gitee.com/fhs-opensource/fhs-framework/tree/master/fhs_framework_parent/src/main/java/com/fhs/system/trans