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"%>
MyBatisEL表达式(表达式语言)是一种可以用来在XML配置文件动态取值的语言。EL表达式可以通过`${}`来引用Java对象的属性或方法,从而实现动态取值的功能。常用的EL表达式包括: 1. `${paramName}`:可以用来获取请求参数的值,其paramName是请求参数的名称。 2. `${headerName}`:可以用来获取请求头的值,其headerName是请求头的名称。 3. `${sessionScope.attrName}`:可以用来获取会话(session)的属性值,其attrName是属性的名称。 4. `${applicationScope.attrName}`:可以用来获取应用程序(application)的属性值,其attrName是属性的名称。 5. `${requestScope.attrName}`:可以用来获取请求(request)的属性值,其attrName是属性的名称。 需要注意的是,在使用EL表达式时,需要确保被引用的对象已经存在或者被正确设置。同时,EL表达式也可以进行一些简单的运算和逻辑判断。 总结一下,MyBatis常用的EL表达式包括`${paramName}`、`${headerName}`、`${sessionScope.attrName}`、`${applicationScope.attrName}`和`${requestScope.attrName}`。这些表达式可以用来动态取值,方便在XML配置文件进行逻辑判断和属性获取。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [有关 Mybatis 使用el表达式问题](https://blog.csdn.net/qq_36423978/article/details/101675398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [EL表达式取值与类的get方法](https://blog.csdn.net/m0_51864047/article/details/121482709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java企业报表管理系统源码](https://download.csdn.net/download/m0_55416028/88269629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值