个人是采用了定义无特定语义的字段来实现的。采用JavaBean的原因在于一是方便取用数据,方便对数据进行校验。
JavaBean如下:
/*
*我这边限定了最多查询条件,所以5个字段就足够了。
*如果任意多个字段的话可以采用LinkedHashMap
*/
public class ReportResult {
private String time;
private String byField1;
private String byField2;
private String byField3;
private String byField4;
private String byField5;
private Float result;
}
接口定义如下:
/**
* 执行报表SQL
* @param sql
* @return
*/
List<ReportResult> superManagerSelect(String sql);
XML定义如下:
<!-- 通用查询映射结果 -->
<resultMap id="reportResultResultMap" type="com.xxx.ReportResult">
<result column="time" property="time"/>
<result column="by_field1" property="byField1"/>
<result column="by_field2" property="byField2"/>
<result column="by_field3" property="byField3"/>
<result column="by_field4" property="byField4"/>
<result column="by_field5" property="byField5"/>
<result column="result" property="result"/>
</resultMap>
<select id="superManagerSelect" parameterType="String" resultMap="reportResultResultMap">
${value}
</select>
注意:
这里变量名为什么写value而不是sql呢?
因为MyBatis默认是将参数当作对象而不是调用toString()
的。所以我们这里其实是调用的String对象
还有。这里使用的${value},相当于直接拼接SQL了,所以一定要注意对于用户输入参数的校验,避免SQL注入风险。
private final char value[];