zoukankan      html  css  js  c++  java
  • Mybatis的多表查询

    一、示例1:用户和账户       

              * 一个用户可以有多个账户

             * 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 

            注:Mybatis就把多对一看成了一对一。

          1.主配置文件

             请看:https://www.cnblogs.com/cqyp/p/12491801.html

          2.一对一(查询出一个账户所对应一个用户)

              1)创建Account的实体类以及接口:              

        private Integer id;
        private Integer uid;
        private Double money;
        //从表实体应该包含一个主表实体的对象引用
        private User user;
     
    //set、get方法

            2)创建user的实体类以及接口:

        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;
    //set、get方法

           3)配置IAccountDao.xml文件       

    <mapper namespace="com.li.dao.IAccountDao">
        <!--定义封装account和user的resultMap-->
        <resultMap id="accountUserMap" type="account">
            <id property="id" column="aid"></id>
            <result column="uid" property="uid"></result>
            <result property="money" column="money"></result>
            <!--一对一的关系映射,配置封装user内容
             property:要封装的属性名称,和实体类中的名称一致
             column:通过uid去查找
             javaType:封装到那个实体
            -->
            <association property="user" column="uid" javaType="user">
                <id property="id" column="id"></id>
                <result column="username" property="username" ></result>
                <result column="address" property="address"></result>
                <result column="sex" property="sex" ></result>
                <result column="birthday" property="birthday"></result>
            </association>
        </resultMap>
    <!--查询所有-->
    <!--resultType:封装到那个结果集,返回值的类型-->
        <select id="findAll" resultMap="accountUserMap">
           SELECT u.*,a.id AS aid,a.uid,a.money FROM account a,USER u WHERE a.uid=u.id;
        </select>

           4)测试        

     @Test
        public void testFindAll() {
            //5.执行查询所有的方法
            List<Account> accounts = accountDao.findAll();
            accounts.forEach(account -> 
            {
                System.out.println("-------------");
                System.out.println(account);
                System.out.println(account.getUser());
            });
        }

         3.一对多(查询出一个用户以及所对应的多个账户)

            1)创建Account的实体类:       

      private Integer id;
        private Integer uid;
        private Double money;
    //set、get方法

            2)创建User的实体类

    private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;
    //一对多映射:主表实体应该包含从表实体的集合引用
    private List<Account> accounts //set、get方法

           3)配置IAccountDao.xml文件

    <mapper namespace="com.li.dao.IUserDao">
        <!--定义User的resultMap-->
        <resultMap id="userAccountMap" type="user">
            <id property="id" column="id"/>
            <result column="username" property="username"/>
            <result column="address" property="address"/>
            <result column="sex" property="sex"/>
            <result column="birthday" property="birthday"/>
            <!--配置user对象中accounts集合的映射
             property:要封装的属性名称
             ofType:几何中元素的类型
        -->
            <collection property="accounts" ofType="account">
                <id property="id" column="aid"/>
                <result property="uid" column="uid"/>
                <result property="money" column="money"/>
            </collection>
        </resultMap>
    
    
        <!--查询所有-->
        <!--resultType:封装到那个结果集,返回值的类型-->
        <select id="findAll" resultMap="userAccountMap">
            select * from user u left join account a on u.id = a.uid
        </select>
    </mapper>

            4)测试        

    @Test
        public void findAllTest(){
            List<User> userList= userDao.findAll();
            userList.forEach(user -> {
    
                System.out.println(user);
                System.out.println(user.getAccounts());
            });
    
        }

    二、示例2:用户和角色

                    一个用户可以有多个角色

                   一个角色可以赋予多个用户

               注意:需要有中间表

           1.多对多(用户角色关系)

               1)创建角色的实体类以及接口             

    private Integer roleId;
        private String roleName;
        private String roleDesc;
        //多对多的关系映射:一个角色可以赋予多个用户
        private List<User> users;

              2)创建用户的实体另外i以及接口

              

     private Integer id;
        private String username;
        private String address;
        private String sex;
        private Date birthday;
        //多对多的关系映射:一个用户具备多个角色
        private List<Role> roles;

               3)从角色到用户(查询所有角色对应的用户)

       

    <mapper namespace="com.li.dao.IRoleDao">
        <resultMap id="roleMap" type="role">
            <id property="roleId" column="rid"/>
            <result property="roleName" column="role_name"/>
            <result property="roleDesc" column="role_desc"/>
            <collection property="users" ofType="user">
                <id property="id" column="id"/>
                <result property="username" column="username"/>
                <result property="address" column="address"/>
                <result property="sex" column="sex"/>
                <result property="birthday" column="birthday"/>
            </collection>
        </resultMap>
        <select id="findAll" resultMap="roleMap">
        select u.*,r.id as rid,r.role_name,r.role_desc from role r
        left join user_role ur on r.id=ur.rid
        left join user u on u.id=ur.uid
        </select>
    </mapper>

           4)从用户到角色(查询所有用户对应的角色)

    <mapper namespace="com.li.dao.IUserDao">
        <resultMap id="userMap" type="user">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="address" column="address"/>
            <result property="sex" column="sex"/>
            <result property="birthday" column="birthday"/>
            <collection property="roles" ofType="role">
                <id property="roleId" column="rid"/>
                <result property="roleName" column="role_name"/>
                <result property="roleDesc" column="role_desc"/>
            </collection>
        </resultMap>
        <!--查询所有-->
        <!--resultType:封装到那个结果集,返回值的类型-->
        <select id="findAll" resultMap="userMap">
            select u.*,r.id as rid,r.role_name,r.role_desc from user u
            left join user_role ur on u.id=ur.uid
            left join role r on r.id=ur.rid
        </select>
    </mapper>
  • 相关阅读:
    最高级的自律是享受孤独
    【黑马】交换两个变量的值
    字符串换行
    互联网视频直播/点播流媒体服务器使用http和rtmp做点播时有什么区别?
    视频互联网直播/点播服务器中关于内容分发CDN的相关问题汇总
    网页直播系统推流端和拉流端都有哪些环节?
    线上课堂教育行业选择互动直播时有哪些直播方案?
    自建视频流媒体服务器需要满足哪些条件?
    互联网直播点播平台在进行iframe直播分享时如何禁止本地视频自动播放?
    视频直播/点播流媒体服务器是否可以对接RTSP视频流?
  • 原文地址:https://www.cnblogs.com/cqyp/p/12493990.html
Copyright © 2011-2022 走看看