本文共 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 { ListfindAll(); 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() { Listaccounts = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!