zoukankan      html  css  js  c++  java
  • mybatis一对一映射配置详解

    听说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的数据的时候,才会触发它执行,这就是所谓的懒加载。

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

  • 相关阅读:
    java 输出质数
    各大OJ
    使用css让图片居中
    poj 1250 Tanning Salon
    Struts2 中整合DWR3实现文件上传
    C语言I博客作业02
    The first essay.
    tar命令
    wBox Demo
    缓存记录
  • 原文地址:https://www.cnblogs.com/shamo89/p/7071922.html
Copyright © 2011-2022 走看看