多对一关联关系 Mybatis中是通过一对一实现的
例如 “账户:用户”是多对一的关系,但是对于每一个账户而言只对应一个用户
账户类
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
//多对一(mybatis中的一对一)的映射:一个账户对应一个用户
private User user;
//...
//此处省略了set 和get 以及toString
}
用户类
public class User implements Serializable {
private Integer id;
private String username;
private String sex;
private String address;
private Date birthday;
//一对多的关系映射:一个用户包含多个账户
private List<Account> accountList;
//...
//此处省略了set 和get 以及toString
}
IAccountDAO.interface
public interface IAccountDAO {
//此处使用了立即加载,在获取账户时,一同查询账户所对应的用户的信息
@Select("select * from account")
@Results(id = "accountMap",
value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uid" ,property = "uid"),
@Result(column = "money" ,property = "money"),
@Result(property = "user" ,column = "uid" ,one=@One(select="com.xxx.dao.IUserDAO.findById",fetchType = FetchType.EAGER))
})
List<Account> findALL();
@Select("select * from account where uid=#{uid}")
List<Account> findAccountByUid(Integer uid);
}
IUserDAO.interface
public interface IUserDAO {
@Select("select * from user where id=#{id}")
User findById(Integer id);
//此处使用了懒加载,即只有在要获取用户的账户信息时才会去查询
@Results(
id = "userMap",
value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "username", property = "username"),
@Result(column = "sex", property = "sex"),
@Result(column = "birthday", property = "birthday"),
@Result(column = "address", property = "address"),
@Result(property = "accountList",
column = "id",
many = @Many(
select = "com.zrr.dao.IAccountDAO.findAccountByUid",
fetchType = FetchType.LAZY
)
)})
@Select("select * from user ")
List<User> findALL();
}
测试|IAccountDAO实现的方法
public class TestAccount {
private InputStream in;
private SqlSession session;
private IAccountDAO iAccountDAO;
@Before
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2创建工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
session = factory.openSession();
iAccountDAO = session.getMapper(IAccountDAO.class);
}
@After
public void destory() throws IOException {
//提交事務
session.commit();
session.close();
in.close();
}
@Test
public void testFindAll(){
List<Account> accounts= iAccountDAO.findALL();
for (Account a:accounts
) {
System.out.println("每个账户的信息为:");
System.out.println(a);
System.out.println(a.getUser() );
}
}
}
测试IUserDAO实现的方法
public class TestUser {
private InputStream in;
private SqlSession session;
private IUserDAO iUserDAO;
@Before
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2创建工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
session = factory.openSession();
iUserDAO = session.getMapper(IUserDAO.class);
}
@After
public void destory() throws IOException {
//提交事務
session.commit();
session.close();
in.close();
}
@Test
public void testFindAllInfo(){
List<User> users= iUserDAO.findALL();
for (User u:users
) {
System.out.println("用户 的信息为:");
System.out.println(u);
List<Account> accounts=u.getAccountList();
for (Account a: accounts
) {
System.out.println(a);
}
}
}
}
这里省略了配置信息,具体见上一篇笔记注解开发的环境搭建
https://blog.csdn.net/weixin_49035356/article/details/112345385
记录的笔记主要是给自己以后看的,不一定能解决您的问题,仅供参考