• (三)mybatis级联的实现


    mybatis级联的实现

    开篇

            级联有三种对应关系:

                    1.一对一(association):如学号与学生

          2.一对多(collection):如角色与用户

          3.多对多(discriminator):如一个角色可以对应多个用户,一个用户也可以兼任多个角色

    下面做一个一对多级联

      数据库表描述:(使用的是derby数据库)

        user表中的role_id 对应role表中的id,一个用户对应一个角色,一个角色对应多个用户。

        standard_user表:

      

        role表:

      1.使用上篇分享的代码生成工具mybatis generator,对两个表进行代码生成(链接:http://t.cn/RHbiQ6l

        生成代码目录如图选中部分(最后会给出详细代码)

      2.对xml文件添加collection级联

        修改UserMapper.XML,同时在user的bean中添加Role的定义。(加粗部分)

    UserMapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     3 <mapper namespace="com.standard.dao.UserMapper">
     4   
     5   <resultMap id="BaseResultMap" type="com.standard.model.User">
     6     <id column="ID" jdbcType="INTEGER" property="id" />
     7     <result column="ACCOUNT" jdbcType="VARCHAR" property="account" />
     8     <result column="NAME" jdbcType="VARCHAR" property="name" />
     9     <result column="PASSWORD" jdbcType="VARCHAR" property="password" />
    10     <result column="ROLE_ID" jdbcType="INTEGER" property="roleId" /> 
    11     <collection property="role" column="role_id" select="com.standard.dao.RoleMapper.findRoleById"></collection>
    12  </resultMap>
    13   <sql id="Base_Column_List">
    14     ID, ACCOUNT, NAME, PASSWORD, ROLE_ID
    15   </sql>
    16  //省略sql语句代码...
    17 </mapper>

    User.java

    package com.standard.model;
    
    import java.io.Serializable;
    
    public class User implements Serializable{
        private Integer id;
        
        private String account;
        
        private String name;
        
        private String password;
        
        private Integer roleId;
        
        private Role role;
        
        //get  set方法省略...
    }

      3.测试

     1 public class UserTest {
     2     static SqlSession sqlSession=null;
     3     static UserMapper userMapper;
     4     public static void main(String[] args ) {
     5         try{
     6             sqlSession=SqlSessionFactoryUtil.openSqlSession();
     7             userMapper=sqlSession.getMapper(UserMapper.class);
     8             UserTest userTest=new UserTest();
     9             //查询
    10             userTest.select();
    11             sqlSession2.commit();
    12             
    13         }catch(Exception e){
    14             System.err.println("---"+e.getMessage());
    15             sqlSession.rollback();
    16         }finally{
    17             if(sqlSession!=null){
    18                 sqlSession.close();
    19             }
    20         }
    21     }
    22     public List<User> select(){
    23         List<User> list=userMapper.select();
    24         int l=list.size();
    25         for(int j=0;j<l;j++){
    26             System.out.println(list.get(j).getRole().getName());
    27         }
    28         System.out.println("-----------");
    29         return list;
    30     }
    31 }

      最后查看控制台是否能够输出角色名,若输出成功,则通过用户查询角色成功。(若需要通过角色查询用户,需要在role相关的文件进行配置)。

      【补充】

      1.mapper.xml中ResultMap可以被继承

      2.超过三层关联时尽量少用级联

      3.会有N+1性能问题:使用延迟加载解决:

        两个全局参数:lazyLoadingEnabled和aggressiveLazy Loading

        lazyLoadingEnabled:是否开启延迟加载

        aggressiveLazy Loading:对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将按需加载

      配置:

    <settings>
    
        <setting name=”lazyLoadingEnabled” value=”true”/>
    
        <setting name=”aggressiveLazyLoading” value=”false”/>
    
    </settings>

      4.局部延迟加载:在association和collection元素上加属性值fetchType(eager、lazy)默认为eager,默认值会被全局变量覆盖

      5.另一种级联:尽量使用左连接,定义映射规则

        eg.(来自《深入浅出mybatis技术原理与实战》)

         discriminator是根据sex的结果来判断使用哪个类做映射。

    结束。

  • 相关阅读:
    PhoneGap+jQuery Mobile+Rest 访问远程数据
    VS2013 安装phonegap
    Visual Studio 2015 和 Apache Cordova
    Jquery Mobile 百度地图 Demo
    《C++ primer》--第11章
    十个顶级的C语言资源助你成为优秀的程序员
    转载:ofstream和ifstream详细用法
    总结c++ primer中的notes
    vim使用
    转载:fstream和ifstream详细用法
  • 原文地址:https://www.cnblogs.com/zuzZ/p/8107907.html
Copyright © 2020-2023  润新知