Mybatis HashMap返回类型和EL表达式显示

由于 Mybatis 语言自定义的方式,有时候,返回类型会多种多样;我们可以通过设置ResultMap的方式,就像这样:

<resultMap id="BaseResultMap" type="com.peng.....entity.SeckillOrder">
        <id column="orderId" property="orderId" jdbcType="CHAR"/>
        <result column="createTime" property="createTime" jdbcType="TIMESTAMP"/>
        <result column="state" property="state" jdbcType="INTEGER"/>
        <!--多对一-->
        <association property="seckillId" javaType="com.......entity.Seckill">
            <id column="seckill_id" property="seckillId" jdbcType="BIGINT" />
            <result column="sname" property="sname" jdbcType="VARCHAR" />
            ...
        </association>
        <!--一对多-->
        <collection property="userId" ofType="com.....entity.User">
            <id column="uid" property="uid" jdbcType="CHAR"/>
            <result column="loginname" property="loginname" jdbcType="VARCHAR"/>
           ...
        </collection>
    </resultMap>

这样非常不方便,而且,我并不希望,为了增加输出的列名,去修改自己的实体类属性;于是就有了HashMap返回类型。

Mybatis Mapper文件的写法

连接查询时,仅仅增加一列的返回值 c.cname

 <select id="selectAll" resultMap="BaseResultMapSeckill类的返回值" >
    select *
    from t_seckill
  </select>

>>>

  <select id="selectAllToHashMap" resultType="java.util.HashMap" >
    select t.*,c.cname
    from t_seckill t INNER JOIN t_category c
    WHERE  t.cid = c.cid order by create_time desc
  </select>

查询的结果为list对应的输出类型 List<Map<String,Object>>
查询的结果为为单个数据对应的输出类型 Map<String,Object>

测试数据库

CREATE TABLE `t_seckill` (
  `seckill_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sname` varchar(120) DEFAULT NULL,
  `numbers` int(11) DEFAULT NULL,
  `start_time` datetime DEFAULT NULL,
  `end_time` datetime DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `seckill_desc` varchar(120) DEFAULT NULL,
  `price` decimal(8,2) DEFAULT NULL,
  `cid` bigint(20) NOT NULL,
  `image` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`seckill_id`),
  KEY `cid` (`cid`),
  CONSTRAINT `cid` FOREIGN KEY (`cid`) REFERENCES `t_category` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 ;
public class Seckill {

    private Long seckillId;

    private String sname;

    private Integer numbers;

    private Date startTime;

    private Date endTime;

    private Date createTime;

    private String seckillDesc;

    private BigDecimal price;

    private Long cid;//所属分类id

    private String image;
    ...
CREATE TABLE `t_category` (
  `cid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `cname` varchar(50) DEFAULT NULL COMMENT '分类名称',
  `cdesc` varchar(100) DEFAULT NULL COMMENT '分类描述',
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=1006 DEFAULT CHARSET=utf8;
public class Category {
    private Long cid;

    private String cname;

    private String cdesc;

Spring 注解方式测试

@RunWith(SpringJUnit4ClassRunner.class) // 表示继承了SpringJUnit4ClassRunner类
@ContextConfiguration(locations = { "classpath:spring/spring-dao.xml","classpath:spring/spring-service.xml" })//导入Mybatis的配置文件
.....
    @Autowired
    private SeckillDao seckillDao;
     /**
     * 测试hashmap查询
     */
    @Test
    public void testLike3(){
        List<HashMap<String,Object>> hashMapList = seckillDao.selectAllToHashMap();
        for(HashMap hashMap :hashMapList){
            Iterator iterator = hashMap.entrySet().iterator();
            while (iterator.hasNext()){
                Map.Entry entry = (Map.Entry) iterator.next();
                Object key = entry.getKey();
                Object value = entry.getValue();
                System.out.println(key + ":" + value);
            }
        }
    }

输出的结果类型

....
start_time:2017-04-20 11:23:56.0
image:57e3b072N661cd00d.jpg
create_time:2017-04-19 11:28:21.0
seckill_id:1
sname:小米(MI)Air 13.3英寸全金属超轻薄笔记本电脑(i5-6200U 8G 256G PCIE固态硬盘 940MX独显 FHD WIN10)银 
price:4899.00
numbers:99
end_time:2017-05-18 11:24:15.0 
cname:电脑办公
seckill_desc:4.19 10点-4.21 直降100元【i5 独立显卡】全高清窄边框 8G内存 256G固态硬盘 支持SSD硬盘扩容 薄至14.8mm 轻至1.28kgcid:1001
.....

注意HashMap输出的日期格式是这样的2017-04-19 11:28:21.0而不是这种格式Thu Apr 20 12:10:06 CST 2017,可以说更方便于El表达式回显,不用Jstl 来进行 StringDate

El表达式显示

Controller

 List<HashMap<String,Object>> hashMapList = ....;
 model.addAttribute("seckillAlllist", hashMapList);

xx.jsp

<c:forEach var="seckill" items="${seckillAlllist}" varStatus="sort">

有三种方式
注意 key 的名称是数据库对应列名,你可以在Spring测试输出时查看

1. ${seckill['price']}
2. ${seckill.price}
3. ${seckill.get("price")}

日期格式化(不必通过<fmt:parseDate>转换)
<fmt:formatDate   value="${seckill.start_time}" pattern="yyyy年MM月dd日 HH:mm:ss" />

 </c:forEach>

jstl标签

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值