【Mybatis】<foreach>标签在mybatis中的使用
mapper.xml如下:
<select id="selectCkspcb" parameterType="java.util.Map"
resultType="java.util.Map"> SELECT
COALESCE (pg.goodsid, 0) spbm,
COALESCE (pg.goodsname, '') spmc,
COALESCE (
(
SELECT
classname
FROM
pub_goodsclass vv
WHERE
vv.classcode = (
SELECT
CASE
WHEN lent.len < 4 THEN
''
ELSE
substr(lent.classcode, 0, 5)
END AS code
FROM
(
SELECT
LENGTH (ccc.classcode) len,
ccc.classcode
) lent
LIMIT 1 OFFSET 0
)
),
''
) zybm,
COALESCE (pb.brandname, '') pp,
COALESCE (pd.depotname, '') ck,
COALESCE (pg.goodscode, '') spcode,
COALESCE (ssgss.stockqty, 0) zmsl, COALESCE (
(
SELECT
SUM (taxprice * ssgss.stockqty)
FROM
sp_st_batch
WHERE
stgoodsid = ssgg.stgoodsid
AND depotid = ssgss.depotid
),
0
) zmcb,
CASE
WHEN ssgss.stockqty > 0 THEN
(
SELECT
SUM (taxprice * ssgss.stockqty) / ssgss.stockqty
FROM
sp_st_batch
WHERE
stgoodsid = ssgg.stgoodsid
AND depotid = ssgss.depotid
)
ELSE
'0'
END cbjj,
ssgg.stgoodsid,
ssgss.depotid,
ssgg.stayinqty,
ssgg.stayoutqty,
ssgg.presaleqty
FROM
sp_st_goodsstock ssgss
LEFT JOIN sp_st_goods ssgg ON ssgss.stgoodsid = ssgg.stgoodsid
LEFT JOIN pub_depot pd ON ssgss.depotid = pd.depotid
LEFT JOIN pub_goods pg ON ssgg.goodsid = pg.goodsid
LEFT JOIN pub_brand pb ON pg.brandid = pb.brandid
LEFT JOIN pub_goodsclass ccc ON pg.goodsclassid = ccc.classid
WHERE
1 = 1
AND ssgss.enterpriseid = #{enterpriseid,jdbcType=NUMERIC}
<!-- 商品搜索框的商品编码条件查询 -->
<if test="spbm != null and spbm!='' ">
AND ssgg.stgoodsid=#{spbm,jdbcType=NUMERIC}
</if> <!-- 仓库编码查询 -->
<!--<if test="ckbms != null and ckbms !='' ">不能进行空字符串判断,不然报错-->
<if test="ckbms != null ">
AND ssgss.depotid in
<foreach collection="ckbms" item="ckbm" index="index" open="(" close=")" separator=","> #{ckbm}</foreach>
</if> <!-- 商品分类编码查询 -->
<if test="zybms != null ">
AND ccc.classid in
<foreach collection="zybms" item="zybm" index="index" open="(" close=")" separator=",">#{zybm}</foreach>
</if> <!-- 品牌编码查询 -->
<if test="pp != null and pp!='' ">
AND pb.brandid=#{pp,jdbcType=NUMERIC}
</if> <!-- 包括保管账为0 -->
<if test=" isZero!=0">
AND ssgss.stockqty <> 0
</if> <!-- 分页查询 -->
limit #{pageSize,jdbcType=NUMERIC} offset #{start,jdbcType=NUMERIC}
</select>
其中仓库编码和商品分类编码都使用了foreach进行迭代循环,页面jsp场景如下:


业务需求中需要查询多个仓库和商品分类的值,所以在页面将仓库和分类的id值用逗号隔开,以一串string传入后台,并将其拆解成List<Integer>或者List<String>,最后塞进map里面传到xml。
例如:
controller
@RequestMapping(value = { "reportform/queryData" }, method = { RequestMethod.GET,
RequestMethod.POST })
@ResponseBody
public JsonResult queryData(
ModelMap model,
@RequestParam(value = "enterpriseid", required = false) Integer enterpriseid,
@RequestParam(value = "pageSize", required = false,defaultValue ="4") Integer pageSize,
@RequestParam(value = "pageNo", required = false,defaultValue="1") Integer pageNo,
@RequestParam(value = "spbm", required = false) Long spbm,
@RequestParam(value = "ckbm", required = false) String ckbm,
@RequestParam(value = "zybm", required = false) String zybm,
@RequestParam(value = "pp", required = false) Long pp,
@RequestParam(value = "spmc", required = false) String spmc,
@RequestParam(value = "ck", required = false) String ck,
@RequestParam(value = "zmsl", required = false) Integer zmsl,
@RequestParam(value = "zmcb", required = false) String zmcb,
@RequestParam(value = "cbjj", required = false) String cbjj,
@RequestParam(value = "jyfs", required = false) String jyfs,
@RequestParam(value = "jglx", required = false) String jglx,
@RequestParam(value = "spsx", required = false) String spsx,
@RequestParam(value = "isZero", required = false) Integer isZero
) {
JsonResult jrs=null;
try {
List<Integer> ckbms = tranStrToListOfInter(ckbm);
List<Integer> zybms = tranStrToListOfInter(zybm);
PageRequest pageRequest = new PageRequest(pageNo-1, pageSize);
Page<Map<String, Object>> resultList=spStGoodFacade.selectCkspcb(enterpriseid,pageRequest,ckbms,spbm,zybms,pp,spmc,ck,spsx,jglx,jyfs,zybm,isZero,zmsl);
jrs=JsonResult.createSuccess();
jrs.addData(resultList);
} catch (Exception e) {
e.printStackTrace();
}
return jrs;
}
/**
* 将前台输入框的多选字符串转为List
* @param str
* @return
*/
public List<Integer> tranStrToListOfInter(String str){
if(str!=null && str!=""){
String[] sx=str.split(",");
List<Integer> listx=new ArrayList<Integer>();
for(int i=0;i<sx.length;i++){
listx.add(Integer.valueOf(sx[i]));
}
return listx;
}else{
return null;
}
}
service
public Page<Map<String, Object>> selectCkspcb(Integer enterpriseid,PageRequest pageRequest,List ckbms,Long spbm,List zybms,Long pp,String spmc,String ck,String spsx,String jglx,String jyfs,String zybm,Integer isZero,Integer zmsl){
Map<String, Object> dataMap= new HashMap<String, Object>();
int offset = pageRequest.getOffset();
int pageSize = pageRequest.getPageSize();
dataMap.put("pageSize", pageSize);
dataMap.put("start",offset);
dataMap.put("enterpriseid", enterpriseid);
dataMap.put("ckbms",ckbms);
dataMap.put("spbm",spbm);
dataMap.put("zybms", zybms);
dataMap.put("pp",pp);
dataMap.put("ck", ck);
dataMap.put("spmc", spmc);
dataMap.put("isZero",isZero);
dataMap.put("zybm",zybm);
dataMap.put("jyfs",jyfs);
dataMap.put("jglx",jglx);
dataMap.put("spsx",spsx);
Integer total= spStGoodDao.selectCkspcbTotalCount(dataMap);//获取总单记录数
List<Map<String, Object>> resultList= spStGoodDao.selectCkspcb(dataMap);//获取总单记录
List<Map<String, Object>> sum = spStGoodDao.selectCkspcbTotalZMSL(dataMap);
resultList.addAll(sum);
Page<Map<String, Object>> page=null;
if(resultList!=null && resultList.size()>0 && total!=null){
page = new PageImpl<Map<String, Object>>(resultList, pageRequest, total);
}
return page;
}
【Mybatis】<foreach>标签在mybatis中的使用的更多相关文章
- Mybatis foreach标签含义
背景 考虑以下场景: InfoTable(信息表): Name Gender Age Score 张三 男 21 90 李四 女 20 87 王五 男 22 92 赵六 女 19 94 孙七 女 23 ...
- mybatis <forEach>标签的使用
MyBatis<forEach>标签的使用 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis.当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名 ...
- MyBatis foreach标签遍历数组
有时候开发中需要根据多个ID去查询,可以将ID封装为List或者数组然后使用MyBatis中的foreach标签构建in条件. 这里我将ID封装为String[]作为参数. <select id ...
- mybatis foreach标签
一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrde ...
- MyBatis foreach标签的用法
From<MyBatis从入门到精通> 一.foreach实现in集合 1.映射文件中添加的代码: <!-- 4.4 foreach用法 SQL语句有时会使用IN关键字,例如id i ...
- mybatis foreach标签的解释 与常用之处
情景:查询数据库中文章的相关文章 文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...
- 【数据库_Mysql】<foreach>标签在Mysql中的使用
foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.info.details.具体说明:在list和数组中是其中的对象,在map中是val ...
- Mybatis批量insert 返回主键值和foreach标签详解
Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...
- mybatis <where>、<set>、<trim>、<sql>、<foreach>标签的使用
转:http://www.cnblogs.com/lixiujie/p/5766669.html <resultMap>标签的使用:这个类似于hibernte用于映射我们创建的vo对象与数 ...
随机推荐
- easyui -validatebox 验证框加载
问题: easyui验证狂框有时会验证输入字符的位数,或者验证有效字符组合 解决: 使用easyui的验证框,继承验证框,指定输入框为验证框即可 $(function(){ $.extend($.fn ...
- Java 中的正则(Pattern)
/**String 中 replaceAll(),matches(),split() 等方法,都是调用Pattern中的方法.学习了,瞬间觉得Pattern强大了 public String repl ...
- NUnit基本使用方法
通常的单元测试框架都以他们支持的语言的开头字母加上Unit作为名字,他们统称为xUnit框架.C++的叫做CppUnit,Java的叫做JUnit,.Net的叫做NUnit.当然不是所有的都这么命名, ...
- 设计模式C++实现
准备写一系列笔记用来记录学习设计模式的过程,同时写出自己对几种主要的设计模式的理解,以及编码实现,同时总结. 主要参考书籍就是 <Head First Design Patterns>这本 ...
- Spark配置参数的三种方式
1.Spark 属性Spark应用程序的运行是通过外部参数来控制的,参数的设置正确与否,好与坏会直接影响应用程序的性能,也就影响我们整个集群的性能.参数控制有以下方式:(1)直接设置在SparkCon ...
- Kafka安装之三 spring-kafka实践
一.spring-kafka配置详解 1.1 要是用spring-kafka 我们首先要在pom要.xml中引入spring-kafka包 <dependencies> <depen ...
- Kafka安装之二 在CentOS 7上安装Kafka
一.简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这 ...
- gopherjs
An example implementation of a GopherJS client and a Go server using the Improbable gRPC-Web impleme ...
- SQL行列轉換方法(詳細例子)
普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法. 问题:假设有张学生成绩表(tb)如下 ...
- [redis] linux下哨兵篇(3)
一.前言1.为何部署sentinel哨兵前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化.主要功能有:1)不时监控主从服务正常运行2)可 ...