- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MyBatis 配置之集合的嵌套方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在一些查询结果包装类中,包含一些 List 集合属性,使用 collection 标签可以声明该 List 集合中属性的类型,便于 MyBatis 对包装类中的集合类型属性进行映射.
例如商城,取出某一个商品信息以及该商品的评价列表,其中商品包装类 Product 的定义代码如下:
1
2
3
4
5
6
7
8
9
10
|
package
cn.com.mybatis.pojo;
public
class
Product{
//商品id
private
int
pid;
//商品名称
private
String pname;
//商品的评价信息
private
List<Reply> replys;
//get和set方法
}
|
此时,商品的评价信息就是一个 List,所以在定义结果映射配置时,使用 collection 来定义评价结果集合,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
resultMap
id
=
"productResult"
type
=
"cn.com.mybatis.pojo.Product"
>
<
id
property
=
"pid"
column
=
"product_id"
/>
<
result
property
=
"pname"
column
=
"product_name"
/>
<
collection
property
=
"replys"
select
=
"queryReplyByProductId"
column
=
"product_id"
ofType
=
"Reply"
/>
</
resultMap
>
<
select
id
=
"queryProductInfo"
parameterType
=
"int"
resultMap
=
"productResult"
>
select
P.id as product_id,
P.name as product_name
from product P WHERE P.id = #{id}
</
select
>
<
select
id
=
"queryReplyByProductId"
parameterType
=
"int"
resultType
=
"Reply"
>
select * from reply R WHERE R.pid = #{ProductId}
</
select
>
|
以上示例中,Product 与商品评价 Reply 会进行关联,一个商品评价 Reply 的 pid 只对应一个商品 Product 的 id,而一个商品 Product 的 id 可对应多个商品评价 Reply 的 pid,是一对多的关系.
通过配置集合的嵌套结果,就可以将查询结果中的包装类的集合类型的属性嵌套到结果集中。通过上面的配置最终得到一个包含 Reply 的 List 的商品包装类 Product.
collection 标签也可以引入外部的 resultMap 配置。如果 queryReplyByProductId 配置的 sql 查询结果中使用了别名,或数据库字段名与 Reply 类属性名不对应,此时需要返回一个名为 replyResult 的 resultMap,那么 productResult 中的 collection 可以做如下配置:
1
2
3
4
5
6
7
8
9
10
11
|
<
resultMap
id
=
"productResult"
type
=
"cn.com.mybatis.pojo.Product"
>
<
id
property
=
"pid"
column
=
"product_id"
/>
<
result
property
=
"pname"
column
=
"product_name"
/>
<
collection
property
=
"replys"
ofType
=
"Reply"
resultMap
=
"replyResult"
columnPrefix
=
"reply_"
>
</
resultMap
>
<
resultMap
id
=
"replyResult"
type
=
"Reply"
>
<
id
property
=
"id"
column
=
"id"
/>
<
result
property
=
"username"
column
=
"username"
/>
<
result
property
=
"info"
column
=
"info"
/>
</
resultMap
>
|
columnPrefix 代表为外部引入的 resultMap 中的每一个元素的 column 属性加上一个前缀.
在一些查询结果包装类中,包含一些 List 集合属性,可使用 collection 标签声明该 List 集合中属性的类型。以便于 MyBatis 对包装类中的集合类型属性进行映射。可以在 collection 标签中配置,也可以引入外部的 resultMap 做配置.
1
2
3
4
5
|
<
collection
property
=
"posts"
ofType
=
"domain.blog.Post"
>
<
id
property
=
"id"
column
=
"post_id"
/>
<
result
property
=
"subject"
column
=
"post_subject"
/>
<
result
property
=
"body"
column
=
"post_body"
/>
</
collection
>
|
集合元素的作用几乎和关联是相同的。实际上,它们也很相似,文档的异同是多余的。 所以我们更多关注于它们的不同.
我们来继续上面的示例,一个博客只有一个作者。但是博客有很多文章。在博客类中, 这可以由下面这样的写法来表示
1
|
private List<
Post
> posts;
|
要映射嵌套结果集合到 List 中,我们使用集合元素。就像关联元素一样,我们可以从 连接中使用嵌套查询,或者嵌套结果.
首先,让我们看看使用嵌套查询来为博客加载文章.
1
2
3
4
5
6
7
8
9
10
11
|
<
resultMap
id
=
"blogResult"
type
=
"Blog"
>
<
collection
property
=
"posts"
javaType
=
"ArrayList"
column
=
"id"
ofType
=
"Post"
select
=
"selectPostsForBlog"
/>
</
resultMap
>
<
select
id
=
"selectBlog"
resultMap
=
"blogResult"
>
SELECT * FROM BLOG WHERE ID = #{id}
</
select
>
<
select
id
=
"selectPostsForBlog"
resultType
=
"Post"
>
SELECT * FROM POST WHERE BLOG_ID = #{id}
</
select
>
|
这里你应该注意很多东西,但大部分代码和上面的关联元素是非常相似的。首先,你应 该注意我们使用的是集合元素。然后要注意那个新的“ofType”属性。这个属性用来区分 JavaBean(或字段)属性类型和集合包含的类型来说是很重要的。所以你可以读出下面这个 映射
1
|
<
collection
property
=
"posts"
javaType
=
"ArrayList"
column
=
"id"
ofType
=
"Post"
select
=
"selectPostsForBlog"
/>
|
读作: “在 Post 类型的 ArrayList 中的 posts 的集合。” 。
javaType 属性是不需要的,因为 MyBatis 在很多情况下会为你算出来。所以你可以缩短 写法
1
|
<
collection
property
=
"posts"
column
=
"id"
ofType
=
"Post"
select
=
"selectPostsForBlog"
/>
|
至此,你可以猜测集合的嵌套结果是如何来工作的,因为它和关联完全相同,除了它应 用了一个“ofType”属性 。
首先, 让我们看看 SQL:
1
2
3
4
5
6
7
8
9
10
11
12
|
<
select
id=
"selectBlog"
resultMap=
"blogResult"
>
select
B.id
as
blog_id,
B.title
as
blog_title,
B.author_id
as
blog_author_id,
P.id
as
post_id,
P.subject
as
post_subject,
P.body
as
post_body,
from
Blog B
left
outer
join
Post P
on
B.id = P.blog_id
where
B.id = #{id}
</
select
>
|
我们又一次联合了博客表和文章表,而且关注于保证特性,结果列标签的简单映射。现 在用文章映射集合映射博客,可以简单写为:
1
2
3
4
5
6
7
8
9
|
<
resultMap
id
=
"blogResult"
type
=
"Blog"
>
<
id
property
=
"id"
column
=
"blog_id"
/>
<
result
property
=
"title"
column
=
"blog_title"
/>
<
collection
property
=
"posts"
ofType
=
"Post"
>
<
id
property
=
"id"
column
=
"post_id"
/>
<
result
property
=
"subject"
column
=
"post_subject"
/>
<
result
property
=
"body"
column
=
"post_body"
/>
</
collection
>
</
resultMap
>
|
同样,要记得 id 元素的重要性,如果你不记得了,请阅读上面的关联部分.
同样, 如果你引用更长的形式允许你的结果映射的更多重用,你可以使用下面这个替代 的映射
1
2
3
4
5
6
7
8
9
10
11
|
<
resultMap
id
=
"blogResult"
type
=
"Blog"
>
<
id
property
=
"id"
column
=
"blog_id"
/>
<
result
property
=
"title"
column
=
"blog_title"
/>
<
collection
property
=
"posts"
ofType
=
"Post"
resultMap
=
"blogPostResult"
columnPrefix
=
"post_"
/>
</
resultMap
>
<
resultMap
id
=
"blogPostResult"
type
=
"Post"
>
<
id
property
=
"id"
column
=
"id"
/>
<
result
property
=
"subject"
column
=
"subject"
/>
<
result
property
=
"body"
column
=
"body"
/>
</
resultMap
>
|
注意 这个对你所映射的内容没有深度,广度或关联和集合相联合的限制。当映射它们 时你应该在大脑中保留它们的表现.
你的应用在找到最佳方法前要一直进行的单元测试和性 能测试。好在 myBatis 让你后来可以改变想法,而不对你的代码造成很小(或任何)影响.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/fageweiketang/article/details/80905295 。
最后此篇关于MyBatis 配置之集合的嵌套方式的文章就讲到这里了,如果你想了解更多关于MyBatis 配置之集合的嵌套方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1.概述 转载:MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么是 SqlSession 级别的缓存呢?一级缓存的本质
1.概述 转载:核心配置综述之StatementHandler 2.MyBatis 四大组件之StatementHandler StatementHandler 是四大组件中最重要的一个对象,负责操作
1.概述 转载:MyBatis 启动流程 MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。My
1.概述 转载:MyBatis 基础搭建及架构概述 2.MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、
1.概述 转载:核心配置综述之 ParameterHandler MyBatis 四大核心组件我们已经了解到了两种,一个是 Executor ,它是MyBatis 解析SQL请求首先会经过的第一道关卡
1.概述 转载:核心配置综述之 ResultSetHandler 我们之前介绍过了MyBatis 四大核心配置之 Executor、StatementHandler、 ParameterHandler
如果我使用mybatis,我可以很容易地得到更新的行数,就像 update table set desc = 'xxx' where name = ? 但是,如果我想获取更新的行数,而不是计数,我该如
如何在MyBatis 3中使用小于等于 SELECT * FROM( SELECT * FROM TABLE1 WHERE COL1 =#{COL1,jdbc
我将 mybatis3.0.6 与 java 一起使用 哪个性能更好? [select id="getData" parameterType="Integer" resultType="Integer
我无法在 mybatis 中使用动态排序类型创建 SQL,如下例 select user_profile.user_profile_id, user_profile.first_name
这是一个流行的例子。 insert into ACCOUNT ( ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL )values (
我下载了MyBatis,文件夹中有一个mybatis-3.0.4-javadoc.jar,我解压并打开它,但它几乎是空的。 哪里可以找到MyBatis的API文档? 最佳答案 http://repo1
我正在尝试为 ArrayList 编写类型处理程序,但这给了我错误,任何人都可以帮助我。 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其检索为 ArrayList。 packa
目录 依赖 配置 CodeGenerator mybatis-plus-generator + clickhouse 自动生成代码 依赖
目录 三者实现对比 使用fluent mybatis 来实现上面的功能 换成mybatis原生实现效果 换成mybatis plus
例如,我有查询从员工中选择 ID、姓名、年龄、地址,而不是拥有员工对象列表。我希望有一个 map 列表,如 list{ map{ ("id", 123), ("name","jac
我在使 MyBatis (3.4.6) 工作时遇到一些麻烦。 我已将 mybatis-config.xml 文件放置在项目的 src/main/resources 文件夹中,但是当我运行单元测试时,出
我现在使用 Mybatis 和 spring-boot。我没有添加mybatis-config.xml。我根据说明通过 application.properties 为数据源和 mybatis 进行所
这是我的第一篇文章,用我糟糕的英语...... 我使用的是MyBatis3.0 在查询中,我使用 SqlBuilder 的方法如下: public class DataStatisticSqlBuil
主题:MyBatis:Boolean Paraeter:MyBatis 正在使用 Getter 内容: 大家好, 我一直在寻找解决我近乎简单的 MyBatis 问题的方法: 给定代码(仅必要部分):
我是一名优秀的程序员,十分优秀!