Mybatis实现多对多

Mybatis实现多对多

项目结构

在这里插入图片描述

配置文件

  1. pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xiaoge</groupId>
        <artifactId>many2many</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.5</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.13</version>
            </dependency>
    
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
    
    </project>
    
  2. jdbcConfig.properties

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/eesy_mybatis
    jdbc.username=root
    jdbc.password=123456
    
  3. SqlMapConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
    
        <!--配置properties-->
        <properties resource="jdbcConfig.properties">
        </properties>
    
    
        <!-- 使用typeAliases配置别名, 它只能配置domain中类的别名 -->
        <typeAliases>
            <package name="com.xiaoge.domain"></package>
        </typeAliases>
    
        <!--配置环境-->
        <environments default="mysql">
            <!--配置mysql环境-->
            <environment id="mysql">
                <!--配置事务-->
                <transactionManager type="JDBC"></transactionManager>
    
                <!--配置连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="${jdbc.driver}" />
                    <property name="url" value="${jdbc.url}" />
                    <property name="username" value="${jdbc.username}" />
                    <property name="password" value="${jdbc.password}" />
                </dataSource>
    
            </environment>
        </environments>
    
        <mappers>
            <package name="com.xiaoge.dao"></package>
        </mappers>
    </configuration>
    
  4. roleDao.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.xiaoge.dao.RoleDao">
    
      
      
        <!-- 定义role表的resultMap -->
        <resultMap id="roleMap" type="role">
            <id property="roleId" column="rid"></id>
            <result property="roleName" column="role_name"></result>
            <result property="roleDesc" column="role_desc"></result>
    
            <!-- 配置用户集合的映射 -->
            <collection property="users" ofType="user">
                <id property="id" column="id"></id>
                <result property="username" column="username"></result>
                <result property="birthday" column="birthday"></result>
                <result property="sex" column="sex"></result>
                <result property="address" column="address"></result>
            </collection>
        </resultMap>
    
      
      
        <!-- 查询所有 -->
        <select id="findAll" resultMap="roleMap">
            <!-- 注意 id 重复了  不取别名 java程序查出来的结果有误(注意: 这里用了别名, 上面resultMap设置column值时也用别名) -->
            select
                role.id as rid,
                role.role_name as role_name,
                role.role_desc as role_desc,
                user.*
            from
                role
            left join
                user_role
            on
                role.id = user_role.rid
            left join
                user
            on
                user_role.uid = user.id
        </select>
                  
                  
    </mapper>
    
  5. userDao.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.xiaoge.dao.UserDao">
    
      
      
        <!-- 定义user表的resultMap -->
        <resultMap id="userMap" type="user">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="birthday" column="birthday"></result>
            <result property="sex" column="sex"></result>
            <result property="address" column="address"></result>
    
            <!-- 配置角色集合的映射 -->
            <collection property="roles" ofType="role">
                <id property="roleId" column="rid"></id>
                <result property="roleName" column="role_name"></result>
                <result property="roleDesc" column="role_desc"></result>
            </collection>
    
    
        </resultMap>
    
    
      
      
        <!-- 查询所有用户操作 -->
        <select id="findAll" resultMap="userMap">
            <!-- 注意 id 重复了  不取别名 java程序查出来的结果有误(注意: 这里用了别名, 上面resultMap设置column值时也用别名) -->
             select
                user.*,
                role.id as rid,
                role.role_name as role_name,
                role.role_desc as role_desc
            from
                user
            left join
                user_role
            on
                user.id = user_role.uid
            left join
                role
            on
                user_role.rid= role.id
        </select>
    
    
                  
    </mapper>
    

实体类

  1. User

    package com.xiaoge.domain;
    
    import java.util.Date;
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/4 下午4:03
     * @Description: TODO
     */
    public class User {
    
        private Integer id;
        private String username;
        private String address;
        private String sex;
        private Date birthday;
    
        // 多对多关系映射
        // 用户和角色是多对多关系, 但是这里希望的是查询用户的时候, 同时显示角色信息, 所以在该实体类中定义映射关系
        private List<Role> roles;
    
        public List<Role> getRoles() {
            return roles;
        }
    
        public void setRoles(List<Role> roles) {
            this.roles = roles;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", address='" + address + '\'' +
                    ", sex='" + sex + '\'' +
                    ", birthday=" + birthday +
                    '}';
        }
    }
    
    
  2. Role

    package com.xiaoge.domain;
    
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/17 下午3:58
     * @Description: TODO
     */
    public class Role implements Serializable {
    
        private Integer roleId;
        private String roleName;
        private String roleDesc;
    
        // 多对多关系映射
        // 角色和用户是多对多关系, 但是这里希望的是查询角色的时候, 同时显示用户信息, 所以在该实体类中定义映射关系
        private List<User> users;
    
        public List<User> getUsers() {
            return users;
        }
    
        public void setUsers(List<User> users) {
            this.users = users;
        }
    
        public Integer getRoleId() {
            return roleId;
        }
    
        public void setRoleId(Integer roleId) {
            this.roleId = roleId;
        }
    
        public String getRoleName() {
            return roleName;
        }
    
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    
        public String getRoleDesc() {
            return roleDesc;
        }
    
        public void setRoleDesc(String roleDesc) {
            this.roleDesc = roleDesc;
        }
    
        @Override
        public String toString() {
            return "Role{" +
                    "roleId=" + roleId +
                    ", roleName='" + roleName + '\'' +
                    ", roleDesc='" + roleDesc + '\'' +
                    '}';
        }
    }
    
    

持久层接口

  1. UserDao

    package com.xiaoge.dao;
    
    import com.xiaoge.domain.User;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/4 下午4:19
     * @Description: 用户的持久层接口
     */
    public interface UserDao {
    
        /**
         * 查询所有用户, 同时获取到用户所对应的角色
         * @return
         */
        public List<User> findAll();
    
    
    }
    
    
  2. RoleDao

    package com.xiaoge.dao;
    
    import com.xiaoge.domain.Role;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/17 下午4:04
     * @Description: TODO
     */
    public interface RoleDao {
    
        /**
         * 查询所有角色, 及角色所对应的用户信息
         * @return
         */
        public List<Role> findAll();
    
    }
    
    

测试持久层接口方法

  1. UserTest

    package com.xiaoge.test;
    
    import com.xiaoge.dao.UserDao;
    import com.xiaoge.domain.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/16 下午6:12
     * @Description: TODO
     */
    public class UserTest {
    
        private SqlSession session;
        private UserDao userDao;
        private InputStream is;
    
        @Before
        public void init() throws IOException {
            is = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(is);
            session = factory.openSession();
            userDao = session.getMapper(UserDao.class);
        }
    
        @After
        public void destroy() throws IOException {
    
            if (session != null) {
                session.commit();
                session.close();
            }
    
            if (is != null) {
                is.close();
            }
    
        }
    
        /**
         * 测试查询所有
         */
        @Test
        public void findAllTest(){
            List<User> list = userDao.findAll();
    
            for (User user : list) {
                System.out.println("-----------每个user信息------------");
                System.out.println(user);
                System.out.println(user.getRoles());
            }
          
          	// 运行结果
          	-----------每个user信息------------
            User{id=41, username='老王', address='北京', sex='男', birthday=Wed Feb 28 07:47:08 CST 2018}
            [Role{roleId=1, roleName='院长', roleDesc='管理整个学院'}, Role{roleId=2, roleName='总裁', roleDesc='管理整个公司'}]
            -----------每个user信息------------
            User{id=46, username='老王', address='北京', sex='女', birthday=Thu Mar 08 07:37:26 CST 2018}
            [Role{roleId=1, roleName='院长', roleDesc='管理整个学院'}]
            -----------每个user信息------------
            User{id=42, username='小二王', address='北京金燕龙', sex='女', birthday=Sat Mar 03 05:09:37 CST 2018}
            []
            -----------每个user信息------------
            User{id=43, username='小二王', address='北京金燕龙', sex='女', birthday=Mon Mar 05 01:34:34 CST 2018}
            []
            -----------每个user信息------------
            User{id=48, username='小马宝莉', address='北京修正', sex='女', birthday=Fri Mar 09 01:44:00 CST 2018}
            []
            -----------每个user信息------------
            User{id=53, username='啸哥', address='北京四合院', sex='男', birthday=Fri Mar 06 13:10:42 CST 2020}
            []
            -----------每个user信息------------
            User{id=54, username='李四 last insertid', address='北京', sex='男', birthday=Fri Mar 06 14:26:40 CST 2020}
            []
            -----------每个user信息------------
            User{id=55, username='王五 last insertid', address='北京', sex='男', birthday=Fri Mar 06 15:17:43 CST 2020}
            []
            -----------每个user信息------------
            User{id=56, username='李六 last insertid', address='北京', sex='男', birthday=Fri Mar 06 18:47:48 CST 2020}
            []
            -----------每个user信息------------
            User{id=57, username='李六 last insertid', address='北京', sex='男', birthday=Fri Mar 06 19:11:40 CST 2020}
            []
            -----------每个user信息------------
            User{id=59, username='李白 last insertid', address='北京', sex='男', birthday=Wed Mar 11 18:17:20 CST 2020}
            []
    
        }
    
    
    }
    
    
  2. RoleTest

    package com.xiaoge.test;
    
    import com.xiaoge.dao.RoleDao;
    import com.xiaoge.domain.Role;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/16 下午6:12
     * @Description: TODO
     */
    public class RoleTest {
    
        private SqlSession session;
        private RoleDao roleDao;
        private InputStream is;
    
        @Before
        public void init() throws IOException {
            is = Resources.getResourceAsStream("SqlMapConfig.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(is);
            session = factory.openSession();
            roleDao = session.getMapper(RoleDao.class);
        }
    
        @After
        public void destroy() throws IOException {
    
            if (session != null) {
                session.commit();
                session.close();
            }
    
            if (is != null) {
                is.close();
            }
    
        }
    
        /**
         * 测试查询所有
         */
        @Test
        public void findAllTest(){
            List<Role> list = roleDao.findAll();
    
            for (Role role : list) {
                System.out.println("-----------每个role信息------------");
                System.out.println(role);
                System.out.println(role.getUsers());
            }
          
          	// 运行结果
          	-----------每个role信息------------
            Role{roleId=1, roleName='院长', roleDesc='管理整个学院'}
            [User{id=41, username='老王', address='北京', sex='男', birthday=Wed Feb 28 07:47:08 CST 2018}, User{id=46, username='老王', address='北京', sex='女', birthday=Thu Mar 08 07:37:26 CST 2018}]
            -----------每个role信息------------
            Role{roleId=2, roleName='总裁', roleDesc='管理整个公司'}
            [User{id=41, username='老王', address='北京', sex='男', birthday=Wed Feb 28 07:47:08 CST 2018}]
            -----------每个role信息------------
            Role{roleId=3, roleName='校长', roleDesc='管理整个学校'}
            []
        }
    
    
    }
    
    
发布了323 篇原创文章 · 获赞 104 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zsx1314lovezyf/article/details/104927163