mybatis如何实现多表查询,mybatisplus无xml多表查询

  mybatis如何实现多表查询,mybatisplus无xml多表查询

  00-1010一对多查询、多对一查询和一对一查询的数据库表和关系摘要

  00-1010表与表之间有几种关系:一对多、多对一、一对一、多对多在多对一关系中,把很多部分分解成一个对象,其实就是一对一关系。比如账户和用户是多对一的,但是每个账户只对应一个用户。因此,在mybatis中,多对一关系可以视为一对一关系。在这里,我总结了一对多和多对一的xml配置方法,以及加载方法。一对多,多对多:通常我们使用延迟加载。多对一,一对一:通常我们使用立即加载。至于注释方法和多对多查询xml和注释方法,我会另写博客。

  00-1010我们以用户和账户为例。用户可以有多个账户,每个账户只能对应一个用户。所以用户和账号是一对多的关系,账号和用户是多对一的关系。如下图,用户表用户、账表账户、账表Uid对应用户表id。

  00-1010首先我们要在用户实体类中添加List accounts的集合成员变量,表示一对多的映射关系。主表实体包含从表实体的集合引用。

  公共类用户实现可序列化的{私有整数id;私有字符串用户名;私有字符串地址;私弦性;私人约会生日;//一对多映射关系,主表实体包含从表实体集合引用的私有ListAccount账户;public list account get accounts(){ return accounts;} public void set accounts(list account accounts){ this . accounts=accounts;} @ Override public String to String(){ return User { id= id ,username= username ,address= address ,sex= sex ,birthday= birthday }}公共整数getId(){ return id;} public void setId(Integer id){ this . id=id;} public String get username(){ return username;} public void set username(String username){ this . username=username;} public String getAddress() {返回地址;} public void setAddress(字符串地址){ this.address=address}公共字符串getSex(){ return sex;} public void setSex(String sex){ this . sex=sex;} public Date getBirthday() {返回生日;} public void setBirthday(日期生日){ this.birthday=生日;}}}同时在用户Dao接口中提供了查询所有用户的方法findAll,在账户Dao接口中提供了根据用户id查询用户的方法FindByid,以便延迟加载时调用。这里因为用户可能对应很多账号,所以我们在查询用户的时候可能不需要账号信息,而如果每次都是马上查询用户的账号信息,账号信息很多的话,内部开销会很大。所以当我们需要账户信息的时候,我们调用findById方法来查询用户对应的账户信息。

  ss="brush:java;">public interface IUserDao { /** * 查询所有操作,并携带账户信息 * @return */ List<User> findAll(); /** * 根据id查询一个用户 * @param uid */ User findById(Integer uid);}

public interface IAccountDao { /** * 查询所有账户 * @return */ List<Account> findAll(); /** * 根据用户id查询账户 * @param uid * @return */ List<Account> findByUid(Integer uid);}

然后配置userDao.xml,说明会在代码中给出。

 

  

<mapper namespace="com.cc.dao.IUserDao"> <!--定义resultMap--> <!--因为在主配置文件中配置了domain包下的所有实体类别名,所以这里封装类型只需要写实体类名即可,不分大小写--> <resultMap id="userWithAccount" type="user"> <!--封装user对象--> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="address" column="address"></result> <result property="sex" column="sex"></result> <result property="birthday" column="birthday"></result> <!--配置user队形中account集合的映射--> <!--定义一对多的关系映射,实现对account的封装,用collection标签 ofType属性指定内容:要封装的实体对象类型 select属性指定内容:查询用户的唯一标识 column属性指定内容:用户根据id查询是所需要的参数 --> <collection property="accounts" ofType="account" column="id" select="com.cc.dao.IAccountDao.findByUid"></collection> </resultMap> <!--查询所有--> <select id="findAll" resultMap="userWithAccount"> select * from user </select> <!--根据id查询一个用户--> <select id="findById" parameterType="java.lang.Integer" resultType="user"> select * from user where id=#{uid}; </select></mapper>

当然我们还要在主配置文件中开启延时加载,默认情况下是立即加载。lazyLoadingEnabled:是否启用延迟加载,mybatis默认为false,不启用延迟加载。lazyLoadingEnabled属性控制全局是否使用延迟加载,特殊关联关系也可以通过嵌套查询中fetchType属性单独配置(fetchType属性值lazy或者eager)。也就是说我们可以不用在主配置文件中配置而在userDao.xml中配置,这里我们采用全局配置。

 

  

<!--配置参数--> <settings> <!--开启Mybatis支持延时加载--> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"></setting> </settings> <!--配置domain包下所有实体类别名--> <typeAliases> <!--<typeAlias type="com.cc.domain.User" alias="user"></typeAlias>--> <package name="com.cc.domain"></package> </typeAliases>

然后我们就可以测试了

 

  

public class UserTest { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private IUserDao userDao; @Before//在测试方法执行之前执行 public void init() throws IOException { //1.读取配置文件,生成字节输入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.生成SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.获取SqlSession sqlSession = factory.openSession(); //4.获取dao的代理对象 userDao = sqlSession.getMapper(IUserDao.class); } @After//在测试方法执行之后执行 public void destory() throws IOException { //提交事务 sqlSession.commit(); //关闭资源 sqlSession.close(); in.close(); } /** * 测试查询所有账户 */ @Test public void TestFindAll() { //5.执行查询所有方法 List<User> userList = userDao.findAll(); for (User user : userList) { System.out.println(user); System.out.println(user.getAccounts()); } }}

先把遍历输出部分代码注释掉,测试可以看出我们只查询了用户信息。

 

  

 

  然后去掉注释,发现当我们需要输出用户账户时,他就会去查询用户的账户信息。

  

 

  

 

  

多对一及一对一查询

步骤其实和一对多差不多。首先我们在account实体类中加入user成员变量表示一对一映射。

 

  

public class Account implements Serializable { 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 + }; }}

Dao接口中需要的的方法在上面总结一对多查询时的图中已经给出。然后配置accountDao.xml,这里是立即查询,在我们已经配置全局延时加载的情况下,我们需要配置fetchType=eager。

 

  

<mapper namespace="com.cc.dao.IAccountDao"> <!--开启account支持二级缓存--> <cache/> <!--定义封装account和user的resultMap--> <resultMap id="accountAndUser" type="account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> <!--定义一对一的关系映射,实现对user的封装 select属性指定内容:查询用户的唯一标识 column属性指定内容:用户根据id查询是所需要的参数 fetchType属性指定内容:lazy延时加载,eager立即加载。 --> <association property="user" column="uid" javaType="user" select="com.cc.dao.IUserDao.findById" fetchType="eager"></association> </resultMap> <!--查询所有--> <select id="findAll" resultMap="accountAndUser"> SELECT * from account </select> <!--根据用户id查询--> <select id="findByUid" parameterType="java.lang.Integer" resultType="account" useCache="true"> select * from account where uid = #{uid} </select></mapper>

然后我们就可以测试。可以看出当查询账户时就立即查询了对应的用户信息。

 

  

 

  

 

  

总结

第一尝试博客,肯定有很多欠缺的地方,希望大家看到能评论指出。我自己学mybatis时间也不是很长,这里只给出了简单的案例。如果什么理解不到位的地方也请大家谅解并指出。以后我会更多的写博客,希望能够给一起处在学习阶段的人一些启发。

 

  到此这篇关于mybatis多表查询的实现(xml方式)的文章就介绍到这了,更多相关mybatis多表查询内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: