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>one2many</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. 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">
    
      
      
        <resultMap id="userAccountMap" 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>
    
            <!-- 配置user对象中accounts集合的映射 -->
            <!-- ofType是指定accounts集合中元素的类型 我这里写Account是因为我去了别名的 -->
            <!-- 一切用到实体类的, 没取别名的就要使用全限定类名 -->
            <collection property="accounts" ofType="Account">
                <!-- 我这里column写的是aid 注意我的sql语句 我给id取了个别名 -->
                <!-- property只能写实体类的属性 -->
                <id property="id" column="aid"></id>
                <result property="uid" column="uid"></result>
                <result property="money" column="money"></result>
            </collection>
        </resultMap>
    
      
      
    
        <!-- 查询所有用户操作(使用mybatis一对多映射关系) -->
        <select id="findAll" resultMap="userAccountMap">
             select user.*, account.id as aid, account.uid as uid, account.money as money from user left join account on user.id = uid
        </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<Account> accounts;
    
        public List<Account> getAccounts() {
            return accounts;
        }
    
        public void setAccounts(List<Account> accounts) {
            this.accounts = accounts;
        }
    
        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. Account

    package com.xiaoge.domain;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/16 下午6:02
     * @Description: TODO
     */
    public class Account {
    
        private Integer id;
        private Integer uid;
        private Double money;
    
        // 从表实体应该包含一个主表实体的对象引用
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        public Double getMoney() {
            return money;
        }
    
        public void setMoney(Double money) {
            this.money = money;
        }
    
        @Override
        public String toString() {
            return "Account{" +
                    "id=" + id +
                    ", uid=" + uid +
                    ", money=" + money +
                    '}';
        }
    }
    

持久层接口

  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();
        
    
    }
    
    

测试持久层接口方法

  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.getAccounts());
            }
          
          	// 运行结果
          	-----------每个user信息------------
            User{id=41, username='老王', address='北京', sex='男', birthday=Wed Feb 28 07:47:08 CST 2018}
            [Account{id=1, uid=41, money=1000.0}]
            -----------每个user信息------------
            User{id=42, username='小二王', address='北京金燕龙', sex='女', birthday=Sat Mar 03 05:09:37 CST 2018}
            [Account{id=2, uid=42, money=1000.0}]
            -----------每个user信息------------
            User{id=43, username='小二王', address='北京金燕龙', sex='女', birthday=Mon Mar 05 01:34:34 CST 2018}
            [Account{id=3, uid=43, money=2000.0}, Account{id=4, uid=43, money=3000.0}]
            -----------每个user信息------------
            User{id=46, username='老王', address='北京', sex='女', birthday=Thu Mar 08 07:37:26 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}
            []
        }
    
    
    }
    
    
发布了323 篇原创文章 · 获赞 104 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zsx1314lovezyf/article/details/104923615
今日推荐