#MyBatis多表查询 #多对一的两种实现方式 @FDDLC
发布日期:2021-06-30 20:56:44 浏览次数:2 分类:技术文章

本文共 6162 字,大约阅读时间需要 20 分钟。

 

方式一(常用)

我们知道,一个用户可以对应多个账户,一个账户只能对应一个用户,即账户和用户之间存在多对一的关系。为了表示这种关系,在账户类中额外增加一个用户类的成员:

对应的mapper配置如下:

为了实现对多表查询结果的封装,先定义了一个<resultMap>,然后在<select>标签里使用。这里的难点是<resultMap>的书写。id、money、uid都好理解,可能疑惑的地方是怎么给Account类里的user成员赋值。如你所见,用了个association标签!

association的property是user好理解,但没有column属性,即数据表中没有对应的列名。没有column,但多了个javaType,其实又相当于来了个javaType到相应数据表的映射,即这个association标签相当于是专用于内嵌的<resultMap>标签!

这里补充几个注意事项:

1、如果在SQL语句中字段取了别名的话,column属性也应该填别名,而不能是原字段名。

2、表取了别名后,别名可以随便用;字段取了别名后在where条件里却只能用原字段名,而不能用别名。

 

 

方式二(不常用):使用继承(也可以直接把Account类和User类的部分或全部属性合并)

对应的ExtendedAccount类:

对应的SQL配置:

说明:

1、用的是resultType属性而非像方式一那样必须使用resultMap。

2、account表中的uid和user表中的id是一样的,故只保留了uid。

 


最后附上源码:

 

项目结构:

 

数据库的相关信息:

MySQL:8.0.16    port:3306    database:multi_table

account表:

user表:

 

Account类:

package cn.liuxingchang.domain;import java.io.Serializable;public class Account implements Serializable {    private Integer id;    private Integer uid;    private Double money;    private 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;    }    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }    @Override    public String toString() {        return "Account{" +                "id=" + id +                ", uid=" + uid +                ", money=" + money +                ", user=" + user +                '}';    }}

 

ExtendedAccount类:

package cn.liuxingchang.domain;public class ExtendedAccount extends Account {    private String name;    private Integer age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return super.toString() + " ### " + "ExtendedAccount{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}

 

User类:

package cn.liuxingchang.domain;import java.io.Serializable;public class User implements Serializable {    private Integer id;    private String name;    private Integer age;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return "User{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                '}';    }}

 

AccountDao接口:

package cn.liuxingchang.dao;import cn.liuxingchang.domain.Account;import cn.liuxingchang.domain.ExtendedAccount;import java.util.List;public interface AccountDao {    List
findAll(); List
findAll2();}

 

AccountMapper.xml:

 

mybatis.xml:

 

pom.xml:

4.0.0
org.example
P074_MyBatis_Many2One
1.0-SNAPSHOT
mysql
mysql-connector-java
8.0.16
org.mybatis
mybatis
3.4.5
junit
junit
4.12
test

 

Test.java:

import cn.liuxingchang.dao.AccountDao;import cn.liuxingchang.domain.Account;import cn.liuxingchang.domain.ExtendedAccount;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 java.io.InputStream;import java.util.List;public class Test {    private InputStream in;    private SqlSessionFactory factory;    private SqlSession sqlSession;    private AccountDao accountDao;    @Before    public void before() throws Exception {        in = Resources.getResourceAsStream("mybatis.xml");        factory = new SqlSessionFactoryBuilder().build(in);        sqlSession = factory.openSession();        accountDao = sqlSession.getMapper(AccountDao.class);    }    @After    public void after() throws Exception {        sqlSession.commit();        sqlSession.close();        in.close();    }    @org.junit.Test    public void findAllTest() {        List
accounts = accountDao.findAll(); for (Account account: accounts) { System.out.println(account); } } @org.junit.Test public void findAll2Test() { List
extendedAccounts = accountDao.findAll2(); for(ExtendedAccount extendedAccount: extendedAccounts) { System.out.println(extendedAccount); } }}

 

转载地址:https://liuxingchang.blog.csdn.net/article/details/109084850 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:#删除链表的倒数第n个节点_Java版 @FDDLC
下一篇:#MyBatis动态SQL:<if>、<where>、<foreach>、<sql> @FDDLC

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月29日 08时26分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章