最近工作中遇到一个奇怪的需求,大概是这样的:需要计算一组指标,但是指标的数量不是固定的,后期肯定会进行增减,展示方式如下
指标1 | 指标2 | 指标3 | 指标4 | ... |
其中column1~column5只是暂定的字段,后期动态调整。这样使用mybatis时就不能使用传统的实体类进行数据库操作了。思虑良久,决定采用Map传参的方式,单条保存代码如下:
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into `demo`.t_index
(
<foreach collection="params" separator="," index="key">
${key}
</foreach>
)
values
(
<foreach collection="params" separator="," item="item">
#{item}
</foreach>
)
</insert>
/**
* 新增数据
*
* @param params Map对象
* @return 影响行数
*/
int insert(@Param("params") Map<String, Object> params);
@Autowired
private IndexMapper indexMapper;
@Test
public void test01(){
Map<String,Object> map = new HashMap<>();
map.put("categroy", "分类1");
map.put("data_date", "2024-05-17");
map.put("column1", "aa");
map.put("column2", "bb");
map.put("column3", "cc");
indexMapper.insert(map);
}
测试结果:
可以看到控制台打印的sql,和我们平时使用mybatis没有什么区别,数据库可以查到数据,说明代码可以满足预期。其中要注意的是,在拼接表字段时要使用${}方式,而要保存的值使用#{}方式,这样Map的key会将参数直接拼接到sql中,value则是使用占位符方式。另外,保存方法入参Map中只能包含表字段,不然会报表字段不存在的错误。