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. accountDao.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.AccountDao">
    
        <!-- 定义封装account和user的resultMap -->
        <resultMap id="accountUserMap" type="account">
            <id property="id" column="id"></id>
            <result property="uid" column="uid"></result>
            <result property="money" column="money"></result>
            <!-- 一对一的关系映射, 配置封装user的内容 -->
            <!-- javaType是下面谢谢信息, 封装在哪个实体类中 -->
            <association property="user" column="uid" javaType="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>
            </association>
        </resultMap>
    
    
        <!-- 查询所有 (这是使用了mybatis映射关系实现的一对一)(实际开发中通常使用这种) -->
        <select id="findAll" resultMap="accountUserMap">
            <!-- select * from account -->
            select user.username, user.address, account.* from account, user where user.id = account.uid
        </select>
    
      
        <!-- 查询所有账户同时包含用户名和地址 (这是用了新的实体类完成的一对一) -->
        <select id="findAllAccount" resultType="AccountUser">
            select user.username, user.address, account.* from account, user where user.id = account.uid
        </select>
    </mapper>
    

实体类

  1. User

    package com.xiaoge.domain;
    
    import java.util.Date;
    
    /**
     * @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;
    
        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. AccountUser

    package com.xiaoge.domain;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/17 上午11:57
     * @Description: TODO
     */
    public class AccountUser extends Account {
    
        private String username;
        private String address;
    
        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;
        }
    
        @Override
        public String toString() {
            return super.toString() + "        AccountUser{" +
                    "username='" + username + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    
  3. 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. AccountDao

    package com.xiaoge.dao;
    
    import com.xiaoge.domain.Account;
    import com.xiaoge.domain.AccountUser;
    
    import java.util.List;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/3/16 下午6:08
     * @Description: TODO
     */
    public interface AccountDao {
    
        /**
         * 查询所有账户, 同时还要获取当前账户的所属用户信息
         * @return
         */
        public List<Account> findAll();
    
    
        /**
         * 查询所有账户, 并且带有用户名称和地址信息
         * @return
         */
        public List<AccountUser> findAllAccount();
    
    }
    
    

测试持久层接口方法

  1. AccountTest

    package com.xiaoge.test;
    
    import com.xiaoge.dao.AccountDao;
    import com.xiaoge.domain.Account;
    import com.xiaoge.domain.AccountUser;
    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 AccountTest {
    
        private SqlSession session;
        private AccountDao accountDao;
        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();
            accountDao = session.getMapper(AccountDao.class);
        }
    
        @After
        public void destroy() throws IOException {
    
            if (session != null) {
                session.commit();
                session.close();
            }
    
            if (is != null) {
                is.close();
            }
    
        }
    
        /**
         * 测试查询所有(这是使用了mybatis映射关系实现的)
         */
        @Test
        public void findAllTest(){
            List<Account> list = accountDao.findAll();
    
            for (Account account : list) {
                System.out.println("-----------每个account信息------------");
                System.out.println(account);
                System.out.println(account.getUser());
            }
          
          	// 运行结果
            -----------每个account信息------------
            Account{id=1, uid=41, money=1000.0}
            User{id=1, username='老王', address='北京', sex='null', birthday=null}
            -----------每个account信息------------
            Account{id=2, uid=42, money=1000.0}
            User{id=2, username='小二王', address='北京金燕龙', sex='null', birthday=null}
            -----------每个account信息------------
            Account{id=3, uid=43, money=2000.0}
            User{id=3, username='小二王', address='北京金燕龙', sex='null', birthday=null}
            -----------每个account信息------------
            Account{id=4, uid=43, money=3000.0}
            User{id=4, username='小二王', address='北京金燕龙', sex='null', birthday=null}
        }
    
        /**
         * 测试查询所有账户, 同时包含用户名称和地址 (这是使用了新的实体类完成的)
         */
        @Test
        public void findAllAccountUserTest(){
            List<AccountUser> list = accountDao.findAllAccount();
    
            for (AccountUser accountUser : list) {
                System.out.println(accountUser);
            }
          
          	// 运行结果
          	Account{id=1, uid=41, money=1000.0}        AccountUser{username='老王', address='北京'}
            Account{id=2, uid=42, money=1000.0}        AccountUser{username='小二王', address='北京金燕龙'}
            Account{id=3, uid=43, money=2000.0}        AccountUser{username='小二王', address='北京金燕龙'}
            Account{id=4, uid=43, money=3000.0}        AccountUser{username='小二王', address='北京金燕龙'}
    
        }
    
    }
    
    
发布了323 篇原创文章 · 获赞 104 · 访问量 4万+

猜你喜欢

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