动态查询表数据实现方式,mybatis+数据库函数
postgrep数据库新建函数
create function get_id_by_field(p_table_name text, p_field_value text) returns text security definer language plpgsql as $$ DECLARE v_field_name TEXT; v_id TEXT; v_sql TEXT; v_id_field TEXT := 'id'; -- 默认ID字段名 BEGIN -- 根据表名赋值不同的字段名 IF p_table_name = 'A' THEN v_field_name := 'F1'; ELSEIF p_table_name = 'B' THEN v_field_name := 'F2'; ELSE v_field_name := 'F3'; END IF; -- 动态构建SQL(使用参数化查询防止SQL注入) v_sql := format('SELECT %I FROM %I WHERE %I = $1 LIMIT 1', v_id_field, p_table_name, v_field_name); -- 执行查询 EXECUTE v_sql INTO v_id USING p_field_value; RETURN v_id; EXCEPTION WHEN others THEN RAISE NOTICE 'Error searching % in %.%: %', p_field_value, p_table_name, v_field_name, SQLERRM; RETURN NULL; END; $$; alter function get_id_by_field(text, text) owner to test;
在mybatis-plus的某个mapperxml中加入方法
<select id="getIdByTableAndField" parameterType="com.entity.DTO.erp.ERPUpdateInfo" resultType="java.lang.String"> select get_id_by_field(#{tableName}, #{voucherNumber}); </select>
mapper接口
String getIdByTableAndField(ERPUpdateInfo dto);
使用
var id = prcReimbursementMapper.getIdByTableAndField(info);