一、mybatis的结果映射成map集合
在mapper接口方法上添加注解@MapKey(value="id"),映射成map集合。
二、工具类
在创建工具类时,应该使用final定义工具类,并且私有化构造方法。
public final class TimeUtil {
private TimeUtil(){}
public static Timestamp getNow(){
return new Timestamp(System.currentTimeMillis());
}
}
三、springmvc date以及timestamp的自动映射
<mvc:annotation-driven conversion-service="conversionService" validator="validator"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="org.springframework.format.Formatter接口实现类,比如DateFormatter"/>
<bean class="org.springframework.format.Formatter接口实现类,比如TimestampFormatter"/>
</set>
</property>
</bean>
这样配置后,前端传给controller的字符串就会自动映射成时间日期类型
四、mybatis参数问题
我在mybatis中写select时,传入了一个List集合,但后面的参数也进行了赋值。
<where>
<if test="null != taskIds">
a.task_id in
<foreach collection="taskIds" item="taskId" open="(" close=")" separator=",">
#{taskId}
</foreach>
</if>
<if test="null != taskId " >
AND a.task_id = #{taskId}
</if>
</where>
也就是说,我的entity中,传了一个非空的taskIds,传了一个空的taskId,但mybatis在映射时,把上面foreach的值也传给了taskId,因此导致sql语句多了一个条件。
把foreach中的item换一个名字就好了。
五、ecache的使用
在使用ecache时,特别注意key的生成策略。
下面的这种情况,如果先加载method1,那method2就失效了
@Override
@Cacheable(value = "specialFocusCache")
public List<xxx> method1(String param1) {
...
}
@Override
@Cacheable(value = "specialFocusCache")
public List<xxx> method2(String param2) {
...
}
即使加上key="param"也不行,查看了一下echache的源码,发现echache key的默认生成策略非常简单,如下:
public Object generate(Object target, Method method, Object... params) {
if (params.length == 0) {
return NO_PARAM_KEY;
}
if (params.length == 1) {
Object param = params[0];
if (param == null) {
return NULL_PARAM_KEY;
}
if (!param.getClass().isArray()) {
return param;
}
}
return Arrays.deepHashCode(params);
}
如果只是方法只带了一个参数,那他的生成策略就只和参数有关,和方法名、返回值都没有关系。所以在这个基础上,
我直接修改一下key,如下:
@Override
@Cacheable(value = "specialFocusCache",key = "#orderCode + '1'")
public List<SpecialFocusVo> getNodeSpecialFocus(String orderCode) {
SpecialFocusVo sfv = new SpecialFocusVo();
sfv.setOrderCode(orderCode);
sfv.setThreshold(NumCons.NODE_THRESHOLD);
List<SpecialFocusVo> list = resRollOutMapper.getNodeSpecialFocus(sfv,new PageCond());
doDealSpecialFocus(list);
return list;
}
@Override
@Cacheable(value = "specialFocusCache",key = "#orderCode + '2'")
public List<SpecialFocusVo> getOrderSpecialFocus(String orderCode) {
SpecialFocusVo sfv = new SpecialFocusVo();
sfv.setOrderCode(orderCode);
sfv.setThreshold(NumCons.ORDER_THRESHOLD);
List<SpecialFocusVo> list = resRollOutMapper.getOrderSpecialFocus(sfv,new PageCond());
doDealSpecialFocus(list);
return list;
}
如果是多个参数,则生成策略要复杂些,使用的是deepHashCode。如果参数类型不一样,也不会出现失效的问题。