内容简介:MyBatis collection 集合嵌套查询树形节点
MyBatis collection 集合
MyBatis 是数据持久层框架,支持定制化 SQL 、存储过程以及高级映射。尤其强大在于它的映射语句,比如高级映射中的 collection 集合。
collection 集合,集合常用的两个场景是集合的嵌套查询、集合的嵌套结果。集合的嵌套结果就是查询结果对应嵌套子对象。这里就是利用 collection 集合嵌套查询树形节点。下面来一一实现。
查询树形节点 Web 案例
创建数据库表
节点表:
CREATE TABLE `node` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `parent_id` int(11) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='节点表'
简单的节点父子关系设计,下面插入几条数据:
INSERT INTO node (name, parent_id) VALUES ('一级节点A', 0); INSERT INTO node (name, parent_id) VALUES ('一级节点B', 0); INSERT INTO node (name, parent_id) VALUES ('一级节点C', 0); INSERT INTO node (name, parent_id) VALUES ('二级节点AA', 1); INSERT INTO node (name, parent_id) VALUES ('二级节点aa', 1); INSERT INTO node (name, parent_id) VALUES ('二级节点BB', 2); INSERT INTO node (name, parent_id) VALUES ('三级级节点AAA', 4); INSERT INTO node (name, parent_id) VALUES ('三级级节点aaa', 4); INSERT INTO node (name, parent_id) VALUES ('三级级节点BBB', 6);
mybatis-collection-tree 工程
pom.xml 添加 mybatis 依赖:
4.0.0springbootmybatis-collection-tree0.0.1-SNAPSHOTMyBatis :: collection 集合嵌套查询树形节点org.springframework.bootspring-boot-starter-parent1.5.1.RELEASE1.2.05.1.39org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.mybatis.spring.bootmybatis-spring-boot-starter${mybatis-spring-boot}mysqlmysql-connector-java${mysql-connector}junitjunit4.12
在 application.properties 应用配置文件,增加 Mybatis 相关配置:
## 数据源配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ## Mybatis 配置 mybatis.typeAliasesPackage=org.mybatis.domain mybatis.mapperLocations=classpath:mapper/*.xml
mybatis.typeAliasesPackage 配置为 org.mybatis.domain,指向实体类包路径。mybatis.mapperLocations 配置为 classpath 路径下 mapper 包下,* 代表会扫描所有 xml 文件。
重要的还是看 collection 在 xml 的映射实现,NodeMapper.xml 代码如下:
id, name SELECT FROM node WHERE parent_id = #{id} SELECT FROM node WHERE parent_id = 0
在 dao 层,我们只调用 getNodeTree
方法, parent_id = 0
代表顶级节点。然后通过 collection 节点继续调用 getNextNodeTree
方法进行循环调用。
<collection column="id" property="next" javaType="java.util.ArrayList" ofType="org.mybatis.domain.Node" select="getNextNodeTree"/>
以下是关键的知识点:
- column 代表会拿父节点 id ,作为参数获取 next 对象
- javaType 代表 next 对象是个列表,其实可以省略不写
- ofType 用来区分 JavaBean 属性类型和集合包含的类型
- select 是用来执行循环哪个 SQL
工程代码地址:https://github.com/JeffLi1993/myabtis-learning-example
工程演示后的结果如图所示:
思考小结
这样的实现原理,嵌套 SQL 执行,这里就存在一个性能上的问题。比如 10 万条数据,需要执行 10 万次 SELECT 语句。所以不推荐数据量级大的树形结构。
如果结构不经常改变,数量级还行,可以考虑加缓存。这样,读取的数据库的次数大大减少,比如省市区。
还有一种常用的树形节点实现是,读取几次,内存处理。这样的好处就是减少对数据库查询次数,内存处理速度很快,性能大大提升。
参考文献:
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
以上所述就是小编给大家介绍的《MyBatis collection 集合嵌套查询树形节点》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 树形结构数据存储方案(五):区间嵌套
- MySQL 实现树形的遍历
- 巧用 MyBatis 构建树形结构
- js 将线性数据转为树形
- 树形结构数据存储方案(三):闭包表
- 树形结构数据存储方案(二): 物化路径
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Don't Make Me Think
Steve Krug / New Riders Press / 18 August, 2005 / $35.00
Five years and more than 100,000 copies after it was first published, it's hard to imagine anyone working in Web design who hasn't read Steve Krug's "instant classic" on Web usability, but people are ......一起来看看 《Don't Make Me Think》 这本书的介绍吧!