想将下面的代码用表驱动的方法实现,应该怎么创建这个“表”呢
if(key.equals("所属国家 :")) {
tblwine.setCountry(value);
}
else if(key.equals("葡萄酒类型 :")) {
tblwine.setType(value);
}
else if(key.equals("规格 :")) {
tblwine.setSize(value);
}
else if(key.equals("酒精度 :")) {
tblwine.setPercent(value);
}
else if(key.equals("葡萄品种 :")) {
tblwine.setPtype(value);
}
else if(key.equals("生产年份 :")) {
tblwine.setYear(value);
}
回答
如果需要使用表来维护的数据,都是很少有变动,并且很重要的数据。因为查表的速度肯定不如直接执行代码来得快。如果用代码解决,你可以使用:
1.if…else
2.switch…
3.enum..枚举值来匹配
4.?: 三目运算符来解决
或者用表驱动法
#建表语句
CREATE TABLE `resource` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`gmt_create` datetime NOT NULL COMMENT '数据新增时间',
`creator` varchar(128) NOT NULL DEFAULT '0' COMMENT '创建者',
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据修改时间',
`modifier` varchar(128) NOT NULL DEFAULT '0' COMMENT '修改者',
`is_deleted` char(1) NOT NULL DEFAULT 'n' COMMENT '是否逻辑删除,默认为n',
`type` varchar(32) DEFAULT NULL COMMENT '资源类型',
`name` varchar(64) DEFAULT NULL COMMENT '资源名称',
`value` varchar(2048) DEFAULT NULL COMMENT '值',
`ordering` bigint(20) DEFAULT NULL COMMENT '排序',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3026 DEFAULT CHARSET=utf8 COMMENT='系统资源表';
#运行SQL:
SELECT
r.VALUE
FROM
resource r
WHERE
NAME = #{传入参数}
这种情况如果需要用表驱动来解决的话,可能比较麻烦,而且感觉得不偿失.
private static Map map = new HashMap<>();
static {
map.put("", new A1());
}
private static class A1 implements A {
@Override
public void doSomething(Tblwine tblwine, String value) {
tblwine.setCountry(value);
}
}
public interface A {
public void doSomething(Tblwine tblwine, String value);
}
public static void main(String[] args) {
map.get("所属国家 :").doSomething(tblwine,value);
}
如果有疑问,欢迎指正
提供一种使用表实现的思路,表定义如下:
key
method
所属国家
setCountry
葡萄酒类型
setType
…
…
代码如下:
String name=findMethodByKey(key); //查询Key对应的方法名
Method m= tblwine.getClass().getMethod(name,Object.class);
m.invoke(tblwine,value);
当然如果key是比较固定的, 建议 findMethodByKey 方法用HashMap实现, 没有必要用数据库。
也许题主是希望能动态改变对应关系,那么使用数据库存储也未尝不可。 不过为了提高执行的效率,最好可以将数据库表的信息缓存到HashMap中, 当数据库发生变更时,再更新HashMap。
也可以用Java8的函数式接口
private Map> map = new HashMap<>();
{
map.put("所属国家 :", (tblwine, value) -> tblwine.setCountry(value));
// other...
}
调用
map.get(key).accept(tblwine, value);