mybatis -- HashMap 用法/实例:查找文章分类下文章的数目
2016-05-25 15:11
295 查看
有两张表,一张是文章分类表category,两个字段(id 分类编号,title 分类名称);
一张是文章表article,三个字段(id 文章编号,name 文章标题 ,content 文章内容,categoryid 所属文章分类)
需求: 利用sql查找出一个分类下文章的数目。
分析:常规 xml中 写 sql
SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
最终我们需要三个字段,分类id 分类名称name 和每个分类下的数目count,三个字段里两个字段是文章分类表里有的,而第三个没有,这时就不能直接返回分类表对应的实体类了。采用HashMap就可以很方便的解决这个问题。
mybatis xml 文件中代码如下:
<select id="xxxxx" resultType="java.util.HashMap">
SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
</select>
返回值是HashMap类型,可以理解为动态的创建了一个HashMap集合,以键值对的形式保存从数据库里的返回值,map.put("ID",xxx); map.put("NAME",xxx); map.put("COUNT",xxx);
需要注意的有两点:
1.在Mapper.java里,返回类型应写成 List<Map<String,Object>>
2.map里的键全都是相应字段的大写字母:map.put("ID",xxx); map.put("NAME",xxx); map.put("COUNT",xxx);
这里贴一张数据库查看的结果方便理解:
补充:今天又遇到一个问题,如果title在数据库里的类型是clob类型,就取不到汉字了,需要对取出来的字段做类型处理,直接应用ResultMap将会更简单,下面直接上代码
xxxMapper.xml 代码:
<resultMap type="HashMap" id="categoryHashMap">
<result property="ID" column="id"/>
<result property="TITLE" column="title" javaType="String"/> <!-- 这里将clob类型直接转换为了String类型 -->
<result property="COUNT" column="count"/>
</resultMap>
<select id="xxxxx" resultMap="categoryHashMap">
SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
</select>
----- 笔者水平有限,如有不严谨的地方,请指教必改。
一张是文章表article,三个字段(id 文章编号,name 文章标题 ,content 文章内容,categoryid 所属文章分类)
需求: 利用sql查找出一个分类下文章的数目。
分析:常规 xml中 写 sql
SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
最终我们需要三个字段,分类id 分类名称name 和每个分类下的数目count,三个字段里两个字段是文章分类表里有的,而第三个没有,这时就不能直接返回分类表对应的实体类了。采用HashMap就可以很方便的解决这个问题。
mybatis xml 文件中代码如下:
<select id="xxxxx" resultType="java.util.HashMap">
SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
</select>
返回值是HashMap类型,可以理解为动态的创建了一个HashMap集合,以键值对的形式保存从数据库里的返回值,map.put("ID",xxx); map.put("NAME",xxx); map.put("COUNT",xxx);
需要注意的有两点:
1.在Mapper.java里,返回类型应写成 List<Map<String,Object>>
2.map里的键全都是相应字段的大写字母:map.put("ID",xxx); map.put("NAME",xxx); map.put("COUNT",xxx);
这里贴一张数据库查看的结果方便理解:
补充:今天又遇到一个问题,如果title在数据库里的类型是clob类型,就取不到汉字了,需要对取出来的字段做类型处理,直接应用ResultMap将会更简单,下面直接上代码
xxxMapper.xml 代码:
<resultMap type="HashMap" id="categoryHashMap">
<result property="ID" column="id"/>
<result property="TITLE" column="title" javaType="String"/> <!-- 这里将clob类型直接转换为了String类型 -->
<result property="COUNT" column="count"/>
</resultMap>
<select id="xxxxx" resultMap="categoryHashMap">
SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
</select>
----- 笔者水平有限,如有不严谨的地方,请指教必改。
相关文章推荐
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法
- SpringMVC整合mybatis实例代码
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- MyBatis学习笔记(二)之关联关系
- 浅析Mybatis 在CS程序中的应用
- Java Mybatis框架入门基础教程
- Windows下Java+MyBatis框架+MySQL的开发环境搭建教程
- Mybatis与Ibatis的区别
- MyBatis学习教程(二)―如何使用MyBatis对users表执行CRUD操作
- MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题
- Java简单实现SpringMVC+MyBatis分页插件
- MyBatis批量添加、修改和删除
- MyBatis与Hibernate的比较
- 浅析mybatis和spring整合的实现过程
- 在Java的MyBatis框架中建立接口进行CRUD操作的方法
- 整理Java的MyBatis框架中一些重要的功能及基本使用示例
- mybatis的动态sql详解(精)
- MyBatis实践之动态SQL及关联查询
- 详解Mybatis动态sql