听说mybatis一对一有三种写法,今天我试了一下。

数据库表准备

为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一。

表  gl_role_men:id,role_id,menu_id     --------->  实体类 GlrolemenuModel  private String id;private String roleId;private String menuId;private MenuModel menu;

表  menu:id,menu_name,url         --------->  实体类 MenuModel private String id;private String menuName;private String url;

一对一第一种写法

glrolemenuMapper.xml

这个映射文件里的写法有几个要注意的地方,因为是GlrolemenuModel里放了MenuModel的信息,所以我称GlrolemenuModel是维护关系的一方,那么resultMap的type就是GlrolemenuModel

property对应是实体类的属性,column对应的是数据库里表字段名
<resultMap type="com.tieasy.model.GlrolemenuModel" id="glrolemenu_menu_map">
<id property="id" column="id" />
<result property="roleId" column="role_id" />
<result property="menuId" column="menu_id" /> <!-- 上面是GlrolemenuModel表里的信息,下面是MenuModel表里的信息,应该很清楚了吧,注意下面的property的写法,同时实体类GlrolemenuModel
里也要加上private MenuModel menu -->
<result property="menu.menuName" column="menu_name" />
<result property="menu.url" column="url" />
</resultMap>
<select id="glrolemenu_getAllGlrolemenuAndMenu" resultMap="glrolemenu_menu_map">
select
gl_role_menu.id,
gl_role_menu.role_id,
gl_role_menu.menu_id,
menu.menu_name,
menu.url
from gl_role_menu left join menu on gl_role_menu.menu_id = menu.id;<!-- 一个简单的关联查询 -->
</select>

GlrolemenuDao

List<GlrolemenuModel> getAllGlrolemenuAndMenu();

GlrolemenuDaoImpl

public List<GlrolemenuModel> getAllGlrolemenuAndMenu() {
return baseDao.selectList("com.tieasy.model.mapper.glrolemenu_getAllGlrolemenuAndMenu", null);
}

Action里调用接口实现方法

List<GlrolemenuModel> list = glrolemenuDao.getAllGlrolemenuAndMenu();

返回list的json

[{"id":"02ce54203c514b3ca176a3203957c222-1484040384-510","roleId":"02ce54203c514b3ca176a3203957ce0e-1484040384-581","menuId":"00dfcf127f4b4ba1bc8a891938519be0-1484040323-960","menu":{"menuName":"权限管理","url":"/quanxianguanli"}}]

一对一第二种写法

这边使用到了association,这个真的很神奇,原谅我很土鳖,和第一种的写法区别不大,主要就是把被维护的哪一方MenuModel换成用<association>来写

glrolemenuMapper.xml

淡黄色背景的就是改动的部分

<resultMap type="com.tieasy.model.MenuModel" id="menuResultMap">
<id property="id" column="id" />
<result property="menuName" column="menu_name" />
<result property="url" column="url" />
</resultMap>
<resultMap type="com.tieasy.model.GlrolemenuModel" id="glrolemenu_menu_map">
<id property="id" column="id" />
<result property="roleId" column="role_id" />
<result property="menuId" column="menu_id" /> <association property="menu" resultMap="menuResultMap" />
</resultMap>
<select id="glrolemenu_getAllGlrolemenuAndMenu" resultMap="glrolemenu_menu_map">
select
gl_role_menu.id,
gl_role_menu.role_id,
gl_role_menu.menu_id,
menu.menu_name,
menu.url
from gl_role_menu left join menu on gl_role_menu.menu_id = menu.id;
</select>

其它文件都不需要动

元素<association>被用来导入“有一个”(has-one)类型的关联。在上述的例子中,我们使用了<association>元素引用了另外的在同一个XML文件中定义的<resultMap>。
同时我们也可以使用<association> 定义内联的resultMap。

<resultMap type="com.tieasy.model.GlrolemenuModel" id="glrolemenu_menu_map">
<id property="id" column="id" />
<result property="roleId" column="role_id" />
<result property="menuId" column="menu_id" /> <association property="menu" javaType="com.tieasy.model.MenuModel" >
<id property="id" column="id" />
<result property="menuName" column="menu_name" />
<result property="url" column="url" />
</association>
</resultMap>
<select id="glrolemenu_getAllGlrolemenuAndMenu" resultMap="glrolemenu_menu_map">
select
gl_role_menu.id,
gl_role_menu.role_id,
gl_role_menu.menu_id,
menu.menu_name,
menu.url
from gl_role_menu left join menu on gl_role_menu.menu_id = menu.id;
</select>

一对一第三种写法

glrolemenuMapper.xml

还是只有映射文件有改变,但是我这边是因为数据库里每张表只有一条数据,所以其实实际id="glrolemenu_getAllGlrolemenuAndMenu"的这个select是要有个查询条件parameterType,哎,我是有多懒。不过反正是查出来了。

在此方式中,<association>元素的select属性被设置成了id为glrolemenu_getMenuById的语句。这里,两个分开的SQL语句将会在数据库中分别执行。

看看mybatis打印的信息,确定是分两次查询的

<resultMap type="com.tieasy.model.MenuModel" id="menuResultMap">
<id property="id" column="id" />
<result property="menuName" column="menu_name" />
<result property="url" column="url" />
</resultMap>
<select id="glrolemenu_getMenuById" parameterType="String" resultMap="menuResultMap">
select
id,
menu_name,
url
from menu where id = #{id};
</select> <resultMap type="com.tieasy.model.GlrolemenuModel" id="glrolemenu_menu_map">
<id property="id" column="id" />
<result property="roleId" column="role_id" />
<!-- <result property="menuId" column="menu_id" /> --> <association property="menu" column="menu_id" select="glrolemenu_getMenuById" />
</resultMap>
<select id="glrolemenu_getAllGlrolemenuAndMenu" resultMap="glrolemenu_menu_map">
select
id,
role_id,
menu_id
from gl_role_menu;
</select>

总结

这个mybatis一对一配置,对于我这种懒人我选的话可能会选第一二种写法,但是需要强调的是第三种方法可以实现懒加载,因为它是分两个sql先后执行的,当选择懒加载的时候,只会执行第一个sql,只有当我们需要访问到第二条sql的数据的时候,才会触发它执行,这就是所谓的懒加载。

嗯,那什么,就和单例模式的饿汉模式和懒汉模式类似。

mybatis一对一映射配置详解的更多相关文章

  1. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

  2. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  3. Spring MVC、MyBatis整合文件配置详解

    Spring:http://spring.io/docs MyBatis:http://mybatis.github.io/mybatis-3/ Building a RESTful Web Serv ...

  4. 深入浅出Mybatis系列四-配置详解之typeAliases别名(mybatis源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(三)---配置详解之properties ...

  5. Mybatis(三) 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...

  6. Spring、Spring MVC、MyBatis整合文件配置详解

    原文  http://www.cnblogs.com/wxisme/p/4924561.html 主题 MVC模式MyBatisSpring MVC 使用SSM框架做了几个小项目了,感觉还不错是时候总 ...

  7. 【转】Spring、Spring MVC、MyBatis整合文件配置详解

    见:http://www.tuicool.com/articles/eyINveF web.xml的配置 web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经支持注解配置方式 ...

  8. Spring、Spring MVC、MyBatis整合文件配置详解2

    使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Spring:http://spring.io/docs MyBatis ...

  9. Spring、Spring MVC、MyBatis 整合文件配置详解

    使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Spring:http://spring.io/docs MyBatis ...

随机推荐

  1. 《java入门第一季》之java语法部分小案例

    到这里举一个小例子把语法部分梳理一下,下一节开始进入java正式基础--面向对象的学习整理. 案例: /* 某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全, 在传递过程中需要加密 ...

  2. Hibernate统计表中的条数

     /** * 判断积分日志表中是否有某个用户的注册日志 */@Transactional(propagation = Propagation.REQUIRED)public boolean isE ...

  3. PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)

    下列公式中,A代表了上面图层像素的色彩值(A=像素值/255),B代表下面图层像素的色彩值(B=像素值/255),C代表了混合像素的色彩值(真实的结果像素值应该为255*C).该公式也应用于层蒙板. ...

  4. sql将查询结果建立为新表

    1.sqlserver中,使用: select * into tab_new from tab_old SELECT * into anzhiresult from (select * from fa ...

  5. android自定义view实现公章效果

    上次去一个公司面试,面试官问了一个题,怎么用android的自定义view实现一个公章的效果,据说这是华为之前的面试题,我想了下,要是公章的效果,最外层是一个圆,里面是一个五角星,但是这文字怎么画呢, ...

  6. java--加强之 jdk1.5简单新特性,枚举,注解

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9944041 Jdk1.51新特性(静态导入,可变参数,加强for循环,自动拆装箱) 08.ja ...

  7. ruby读取源代码自身的一种方法

    我们知道ruby中如果源代码中一行开头(必须在行的开头)有__END__标示,则表示下面的都是数据行,可以用IO对象DATA来访问这些行.但是如果我们用DATA.rewind一下的话,就可以将文件流指 ...

  8. LAMP的搭建

    可以在网上找整合包: httpd-2.4.18 + mysql-5.6.29 + php-5.5.30编译安装过程: 编译源代码后安装软件的位置:/usr/local/ 一.编译安装apache ap ...

  9. 关于期权池Option Pools与Vesting:码农创业防身必备法器

    之前又看到饿了么创始人团队纠纷的几篇文章,参考了百科.wiki.36Kr.虎嗅.知乎以及邵亦波老师的文章,对之前一直感兴趣的期权汇编初略总结了下 ,仍觉粗糙,对一些具体操作还是不甚了了,不过感觉在中国 ...

  10. 走进netty

    三月份开始看公司RPC框架的源码,发现如果要折腾明白,网络通讯这块知识必不可少.于是从如下几点开始逐步研究. 一.基础知识篇 1.Unix下5种I/O模型 Linux的内核将所有外部设备都看作一个文件 ...