序
由于 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.28kg!
cid:1001
.....
注意:
HashMap
输出的日期格式是这样的2017-04-19 11:28:21.0
而不是这种格式Thu Apr 20 12:10:06 CST 2017
,可以说更方便于El表达式回显,不用Jstl
来进行String
转Date
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"%>