<update id="updateSelective">
UPDATE ${table.name}
<set>
<#list table.columnList as c>
<#if c.isEdit?? && c.isEdit == "1">
<if test="${c.javaFieldId} != null" >
${c.name} = ${"#"}{${c.javaFieldId}},
</if>
</#if>
</#list>
</set>
WHERE id = ${"#"}{id}
</update>
jeesite是一个很好用的开源框架,尤其是权限角色的管理,不需要改什么就可以直接拿来用。
但使用中还是有一点不满足需求,就试着改了一下。
用jeesite自带的代码生成器,生成的实例如下:
@RequiresPermissions("test:testData:view")
@RequestMapping(value = {"list", ""})
public String list(TestData testData, HttpServletRequest request, HttpServletResponse response, Model model) {
Page<TestData> page = testDataService.findPage(new Page<TestData>(request, response), testData);
model.addAttribute("page", page);
return "jeesite/test/testDataList";
}
调用abstract class CrudService的findPage方法
/**
* 查询分页数据
* @param page 分页对象
* @param entity
* @return
*/
public Page<T> findPage(Page<T> page, T entity) {
entity.setPage(page);
page.setList(dao.findList(entity));
return page;
}
这样查到的是一个对象集合,也可以带参数查询,只要是参数的属性即可。
但是如果需要太多,查询条件不是一个表对应的对象属性,查询到的结果是几个表关联查询的结果,
以前的处理方式是,封装成HashMap<String,Object>的形式.查到的结果是List<HashMap<String,Object>>
这样就不需要封装到对象,交流一下代码。
jsp:
<form:form id="searchForm" modelAttribute="baseBusMddkApplication" action="${ctx}/contract/busMddkApplication/" method="post" class="breadcrumb form-search">
模糊搜索:<input class="resetClass" type="text" name="orderNo" id="orderNo"/>
<li class="btns">
<input id="btnSubmit" class="btn btn-primary" type="submit" value="确定"/>
</li>
<li class="clearfix"></li>
</form:form>
本来有很多参数,就不都贴出来了。
会按name值查询(orderNo)
controller:
@RequiresPermissions("contract:busMddkApplication:view")
@RequestMapping(value = { "list", "" })
protected String list(BusMddkApplicationVo BusMddkApplicationVo, HttpServletRequest request,
HttpServletResponse response, Model model) {
Page<BusMddkApplication> page = new Page<BusMddkApplication>(request, response);
Map<String, Object> params = request.getParameterMap();
List<Map<String, Object>> list = busMddkApplicationService.findPage(page, params);
return "modules/bus/contract/busMddkApplicationList";
}
这里的params会有一个{orderNo=}
page对象,可以封装成任意一个entity,这里我封装的是这个controller对应的entity
调用service的重写的findPage(Page<BusMddkApplication> page, Map<String, Object> params)方法
dao:
List<Map<String, Object>> findListByPage(@Param("page")Page<BusMddkApplication> page,@Param("params")Map<String, Object> params);
注意@param注解,一定要加,否则找不到参数的错。
mapper.xml:
<!-- 自定义sql begin -->
<sql id="busMddkApplicationColumnsMap">
a.application_id AS "applicationId",
a.order_no AS "orderNo",
b.merchants AS "merchants",
c.application_name AS
"applicationName",
ar1.name AS "pArea.name",
ar2.name AS "cArea.name"
</sql>
<sql id="busMddkApplicationJoinsMap">
LEFT JOIN sys_area ar1 ON ar1.id = a.area_id_provice
LEFT
JOIN sys_area ar2 ON ar2.id = a.area_id_city
LEFT JOIN
bus_mddk_application_customer c ON c.application_id = a.application_id
LEFT JOIN bus_mddk_application_office b ON b.application_id = a.application_id
</sql>
<!-- 自定义sql end -->
<select id="findListByPage" resultType="java.util.HashMap">
SELECT
<include refid="busMddkApplicationColumnsMap" />
FROM bus_mddk_application a
<include refid="busMddkApplicationJoinsMap" />
<where>
1 = 1
<!-- like -->
<if test="params.orderNo != null and params.orderNo != ''">
AND b.merchants like
concat('%',concat(#{params.orderNo},'%'))
</if>
<if test="params.orderNo != null and params.orderNo != ''">
AND c.application_name like
concat('%',concat(#{params.orderNo},'%'))
</if>
<if test="params.orderNo != null and params.orderNo != ''">
AND a.order_no like
concat('%',concat(#{params.orderNo},'%'))
</if>
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY #{page.orderBy}
</when>
<otherwise>
ORDER BY a.update_date DESC
</otherwise>
</choose>
</select>
这样就多表关联查询,将结果封装到Map
jsp回显数据:
<c:forEach items="${list}" var="baseBusMddkApplication">
<input type="hidden" id="applicationId" value="${baseBusMddkApplication.applicationId}"/>
</c:forEach>
也是遍历之后,对象.属性的方式,可以根据map的key值获取value值。
关于updateSelective方法,jeesite没有提供这个方法。他都是先查再更新。
但是有时候页面的数据太多,updateSelective方法比较实用,如果传过来的参数有值就更新,没有就保持原来的值。
jeesite代码生成的模板在resources/templates/modules/gen文件夹下,
找到dao下的mapper.xml
增加下面的代码:
再生成的就有updateSelective方法了。