SpringBoot+MyBatis多表联合查询

写在前面

联合查询在实际工作中用的并不多,因为很多表的数据比较大,或者说未来比较大的表,都要谨慎使用联合查询

数据准备

建表语句

create table m_user
(id         bigint       not nullprimary key,username   varchar(64)  null,avatar     varchar(255) null,email      varchar(64)  null,password   varchar(64)  null,status     int(5)       not null,created    datetime     null,last_login datetime     null
);create index UK_USERNAMEon m_user (username);
create table m_blog
(id          bigint       not nullprimary key,user_id     bigint       not null,title       varchar(255) not null,description varchar(255) not null,content     longtext     null,created     datetime     not null on update CURRENT_TIMESTAMP,status      tinyint      null
)charset = utf8mb4;

插入数据

插入数据(数据很多都是没用的,那都是我平时自己测试用的,但是不影响使用

INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (1, '文章一', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', 'zhangxi@qq.com', '96e79218965eb72c92a549dd5a330112', 0, '2021-06-02 17:52:01', null);
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (2, '张liu', 'new', 'zhangliu@qq.com', '123456', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (3, '王wu', 'old', 'wangwu@qq.com', '2222222', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (4, 'si', 'sisi', 'sisisi', 'sisisisi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (5, 'wu', 'wuwu', 'wuwuwu', 'wuwuwuwuwu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (6, 'liu', 'liuliu', 'liuliuliu', 'liuliuliuliu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (7, 'qi', 'qiqi', 'qiqiqi', 'qiqiqiqi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (8, 'ba', 'baba', 'bababa', 'babababa', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (9, 'jiu', 'jiujiu', 'jiujiujiu', 'jiujiujiujiu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (10, 'shi', 'shishi', 'shishishi', 'shishishishi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (11, 'shiyi', 'shiyiyi', 'shiyiyiyi', 'shiyiyiyiyi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (12, 'shier', 'shierer', 'shiererer', 'shierererer', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (13, 'shisan', 'shisansan', 'shisansansan', 'shisansansansan', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (14, 'shisi', 'shisisi', 'shisisisi', 'shisisisisi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (15, 'shiwu', 'shiwuwu', 'shiwuwuwu', 'shiwuwuwuwu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (16, 'shiliu', 'shiliuyliu', 'shiliuliuliu', 'shiliuliuliuliu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (17, 'shiqi', 'shiqiqi', 'shiqiqiqi', 'shiqiqiqiqi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (18, 'shiba', 'shibaba', 'shibabababa', 'shibababababa', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (19, 'shijiu', 'shijiujiu', 'shijiujiujiu', 'shijiujiujiujiu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (21, 'ershi', 'ershishi', 'ershishishi', 'ershishishishi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_user (id, username, avatar, email, password, status, created, last_login) VALUES (22, 'ershiyi', 'ershiyiyi', 'ershiyiyiyi', 'ershiyiyiyiyi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (1, 1, '文章一', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-17 17:36:11', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (2, 1, '文章一2', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-17 17:36:11', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (3, 2, '文章一3', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (4, 3, '文章一4', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (5, 2, '文章一5', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (6, 4, '文章一6', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (7, 4, '文章一7', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-09-29 17:45:29', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (8, 5, '文章一8', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-11-14 14:12:37', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (9, 5, '文章一8', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-11-14 14:12:37', 0);
INSERT INTO testgroup.m_blog (id, user_id, title, description, content, created, status) VALUES (11, 6, '文章一8', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-11-14 14:12:37', 0);

entity层

package com.newcrud.entity;import lombok.Data;@Data
public class Blog {private Integer id;private Integer user_id;private String title;private String description;private String content;private String created;private Integer status;
}
package com.newcrud.entity;import lombok.Data;@Data
public class User {private Integer id;private String username;private String avatar;private String email;private String password;private Integer status;private String created;private String last_login;
}

多表联合查询的思路

首先我们来举一个例子,就像上面两张表

1、作者和多条博客为一对多的关系,也就是一条m_user对应了多条m_blog的数据

2、一条博客和作者为一对一的关系,也就是一条m_blog对应了一条m_user的数据

对于一对一,我们可以在m_blog的entity层加入一个User实例,但是对于一对多,我们就需要在m_user的entity层加入一个List,里面的内容为User。然后我们再去编写mybatis的xml文件,对于一对一,我们在xml文件中需要用到一个关键词为:association,意思为关联,对于一对多,我们在xml文件中需要用到一个关键词为:collection,意思为集合。

一对一

一篇博客对应一个作者

entity

首先,我们在m_bloh的entity里加入User

package com.newcrud.entity;import lombok.Data;@Data
public class Blog {private Integer id;private Integer user_id;private String title;private String description;private String content;private String created;private Integer status;private User user;
}

mapper

package com.newcrud.mapper;import com.newcrud.entity.Blog;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
@Mapper
public interface BlogMapper {Blog getBlogById(Integer id);
}

service

package com.newcrud.service;import com.newcrud.entity.Blog;import java.util.List;public interface BlogService {Blog getBlogById(Integer id);
}

impl

package com.newcrud.service.impl;import com.newcrud.entity.Blog;
import com.newcrud.mapper.BlogMapper;
import com.newcrud.service.BlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BlogServiceImpl implements BlogService {@AutowiredBlogMapper blogMapper;@Overridepublic Blog getBlogById (Integer id){return blogMapper.getBlogById(id);}
}

mybatis的xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--这里一定要把namespace写全了,要不然会找不到对应的UserMapper里的每一个方法-->
<mapper namespace="com.newcrud.mapper.BlogMapper"><resultMap id="blog" type="Blog"><id column="id" property="id" javaType="Integer"></id><result column="user_id" property="user_id" javaType="Integer"></result><result column="title" property="title" javaType="String"></result><result column="description" property="description" javaType="String"></result><result column="content" property="content" javaType="String"></result><result column="created" property="created" javaType="String"></result><result column="status" property="status" javaType="Integer"></result><!--通过association关键字将User的属性引入进来,几乎每一个表对应的xml都有一个关于本表所有字段的resultMap,其实直接把User的全表resultMap内容复制过来即可--><association property="user" javaType="User"><id column="id" property="id" javaType="Integer"></id><result column="username" property="username" javaType="String"></result><result column="avatar" property="avatar" javaType="String"></result><result column="email" property="email" javaType="String"></result><result column="password" property="password" javaType="String"></result><result column="status" property="status" javaType="Integer"></result><result column="created" property="created" javaType="String"></result><result column="last_login" property="last_login" javaType="String"></result></association></resultMap><select id="getBlogById" resultType="Blog" resultMap="blog" parameterType="Integer">select a.* from m_user a,m_blog b<where><trim suffixOverrides="and" prefixOverrides="and">b.user_id=a.id and b.id= #{id}</trim></where></select>
</mapper>

测试类

package com.newcrud.service.impl;import com.newcrud.entity.Blog;
import com.newcrud.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.testng.annotations.Test;@SpringBootTestpublic class BlogServiceImplTest extends AbstractTransactionalTestNGSpringContextTests {@AutowiredBlogServiceImpl blogService;@Testpublic void getBlogByIdTest(){Blog blog= blogService.getBlogById(1);User user=blog.getUser();System.out.println(user);}
}

结果

User(id=1, username=文章一, avatar=https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg, email=zhangxi@qq.com, password=96e79218965eb72c92a549dd5a330112, status=0, created=2021-06-02 17:52:01, last_login=null)

如果xml文件不这样写呢

我们把m_user从xml文件中摘出来

    <select id="getBlogById" resultType="Blog" resultMap="blog" parameterType="Integer">select * from m_blog <where><trim suffixOverrides="and" prefixOverrides="and">id= #{id}</trim></where></select>

同样的测试类,结果

User(id=1, username=null, avatar=null, email=null, password=null, status=0, created=2021-06-17 17:36:11, last_login=null)

emmmm,经过分析得知,这个结果是将blog表里和user的表里有相同的字段,直接将blog的字段结果填充到了user的数据里,为什么这样谁能给我解释一下。。。

一对多

entity

关键:private List blogs; 是一个List

package com.newcrud.entity;import lombok.Data;import java.util.List;@Data
public class User {private Integer id;private String username;private String avatar;private String email;private String password;private Integer status;private String created;private String last_login;/*** 由于一个作者对应了多篇博客,所以这里用List来加入Blog* */private List<Blog> blogs;
}

最好呢,将Blog的entity还原成下面这个样子,我们暂时先不还原,看看结果如何。

package com.newcrud.entity;import lombok.Data;@Data
public class Blog {private Integer id;private Integer user_id;private String title;private String description;private String content;private String created;private Integer status;
}

mapper

package com.newcrud.mapper;import com.newcrud.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 这里有两种方法,一种是像我们一样使用@Mapper,一种是在CrudApplication上面新增了@MapperScan备注。直接扫描了整个包* https://www.cnblogs.com/JackpotHan/p/10286496.html* 不过不知道为啥,不加上这个好像是不行,没办法auto,稍微有那么点尴尬* **/
@Mapper
public interface UserMapper {/*** 一对多联合查询* */User getUserAndBlog(Integer id);
}

service

package com.newcrud.service;import com.newcrud.entity.User;
import com.newcrud.outInParam.PageRequest;
import com.newcrud.outInParam.PageResult;import java.util.List;public interface UserService {/*** 一对多联合查询* */User getUserAndBlog(Integer id);
}

impl

package com.newcrud.service.impl;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.newcrud.entity.User;
import com.newcrud.mapper.UserMapper;
import com.newcrud.outInParam.PageRequest;
import com.newcrud.outInParam.PageResult;
import com.newcrud.service.UserService;
import com.newcrud.utils.PageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl  implements UserService {@Autowiredprivate UserMapper userMapper;/*** 一对多联合查询* */@Overridepublic User getUserAndBlog(Integer id){return userMapper.getUserAndBlog(id);}

xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newcrud.mapper.UserMapper"><resultMap id="userAndBlog" type="User"><!--重点1:这里的column对应的值为sql语句中对应字段的别名--><id column="uid" property="id" javaType="Integer"></id><result column="username" property="username" javaType="String"></result><result column="avatar" property="avatar" javaType="String"></result><result column="email" property="email" javaType="String"></result><result column="password" property="password" javaType="String"></result><result column="ustatus" property="status" javaType="Integer"></result><result column="ucreated" property="created" javaType="String"></result><result column="last_login" property="last_login" javaType="String"></result><!--重点2:这里一定要用ofType不能用javaType了,因为对应的Blog是一个List,如果用javaType的话就会报错数据类型不匹配--><collection property="blogs" ofType="Blog" ><id column="bid" property="id" javaType="Integer"></id><result column="user_id" property="user_id" javaType="Integer"></result><result column="title" property="title" javaType="String"></result><result column="description" property="description" javaType="String"></result><result column="content" property="content" javaType="String"></result><result column="bcreated" property="created" javaType="String"></result><result column="bstatus" property="status" javaType="Integer"></result></collection></resultMap><select id="getUserAndBlog" resultMap="userAndBlog" parameterType="Integer"><!--重点3:我们查询出了一条记录所有的值,但是两个表有很多字段都是重名的怎么办,那就需要为同名字段起一个别名,别忘了修改resultMap对应字段的column值哦-->select a.id uid,a.username,a.avatar,a.email,a.password,a.status ustatus,a.created ucreated,a.last_login,b.id bid,b.user_id,b.title,b.description,b.content,b.created bcreated,b.status bstatus from m_user a , m_blog b where a.id=b.user_id and a.id=#{id}</select>
</mapper>

测试类

package com.newcrud.service.impl;import com.newcrud.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;import java.util.List;import static org.testng.Assert.*;@SpringBootTest
public class UserServiceImplTest  extends AbstractTestNGSpringContextTests {@AutowiredUserServiceImpl userService;@Testpublic void testGetUserById() {User users = userService.getUserAndBlog(1);System.out.println(users);}

结果

User(id=1, username=文章一, avatar=https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg, email=zhangxi@qq.com, password=96e79218965eb72c92a549dd5a330112, status=0, created=2021-06-02 17:52:01, last_login=null, blogs=[Blog(id=1, user_id=1, title=文章一, description=第一篇文章, content=第一篇文章第一篇文章第一篇文章, created=2021-06-17 17:36:11, status=0, user=null), Blog(id=2, user_id=1, title=文章一2, description=第一篇文章, content=第一篇文章第一篇文章第一篇文章, created=2021-06-17 17:36:11, status=0, user=null)])

有没有注意到blog里有一段user=null,我们把entity层的Blog还原就行了

优化

一个小小的优化,一是我们并不需要返回那么多字段信息,二是实际工作中这个xml里的sql,其实更多的是使用union的方式,而不是像我们上面的那种

entity

package com.newcrud.entity;import lombok.Data;import java.util.List;@Data
public class User {private Integer id;private String username;private String avatar;private String email;private String password;private Integer status;private String created;private String last_login;/*** 由于一个作者对应了多篇博客,所以这里用List来加入Blog* */private List<Blog> blogs;
}

mapper

package com.newcrud.mapper;import com.newcrud.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 这里有两种方法,一种是像我们一样使用@Mapper,一种是在CrudApplication上面新增了@MapperScan备注。直接扫描了整个包* https://www.cnblogs.com/JackpotHan/p/10286496.html* 不过不知道为啥,不加上这个好像是不行,没办法auto,稍微有那么点尴尬* **/
@Mapper
public interface UserMapper {/*** 一对多联合查询-union方式* */User getAllUserAndBlog(Integer id);
}

service

package com.newcrud.service;import com.newcrud.entity.User;
import com.newcrud.outInParam.PageRequest;
import com.newcrud.outInParam.PageResult;import java.util.List;public interface UserService {/*** 一对多联合查询-union方式* */User getAllUserAndBlog(Integer id);
}

impl

package com.newcrud.service.impl;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.newcrud.entity.User;
import com.newcrud.mapper.UserMapper;
import com.newcrud.outInParam.PageRequest;
import com.newcrud.outInParam.PageResult;
import com.newcrud.service.UserService;
import com.newcrud.utils.PageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl  implements UserService {@Autowiredprivate UserMapper userMapper;/*** 一对多联合查询-union方式* */@Overridepublic User getAllUserAndBlog(Integer id){return userMapper.getAllUserAndBlog(id);}
}

mybatis的xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newcrud.mapper.UserMapper">
<resultMap id="AllUserAndBlog" type="User"><id column="uid" property="id" javaType="Integer"></id><result column="username" property="username" javaType="String"></result><result column="email" property="email" javaType="String"></result><collection property="blogs" ofType="Blog"><id column="bid" property="id" javaType="Integer"></id><result column="title" property="title" javaType="String"></result><result column="description" property="description" javaType="String"></result></collection></resultMap><select id="getAllUserAndBlog" resultMap="AllUserAndBlog" parameterType="Integer">select a.id uid,a.username,a.email,b.id bid,b.title,b.description  from m_user a left outer join m_blog b on a.id = b.user_id where a.id=#{id}</select>
</mapper>

测试类

package com.newcrud.service.impl;import com.newcrud.entity.Blog;
import com.newcrud.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;import javax.jws.soap.SOAPBinding;
import java.util.List;import static org.testng.Assert.*;@SpringBootTest
public class UserServiceImplTest  extends AbstractTestNGSpringContextTests {@AutowiredUserServiceImpl userService;@Testpublic void testgetAllUserAndBlog(){User user = userService.getAllUserAndBlog(1);System.out.println(user);}}

结果

User(id=1, username=文章一, avatar=null, email=zhangxi@qq.com, password=null, status=null, created=null, last_login=null, blogs=[Blog(id=1, user_id=null, title=文章一, description=第一篇文章, content=null, created=null, status=null), Blog(id=2, user_id=null, title=文章一2, description=第一篇文章, content=null, created=null, status=null)])

SpringBoot+MyBatis多表联合查询相关推荐

  1. MyBatis 多表联合查询及优化

    关于优化 对于优化嘛,我这里简单的提几点,大家可以考虑一下.首先,就是对表的设计,在设计表初期,不仅仅要考虑到数据库的规范性,还好考虑到所谓的业务,以及对性能的影响,比如,如果从规范性角度考虑的话,可 ...

  2. mybatis主从表关联查询,返回对象带有集合属性

    昨天有同事让我帮着看一个问题,mybatis主从表联合查询,返回的对象封装集合属性.我先将出现的问题记录一下,然后再讲处理方法也简单说明一下: VersionResult为接收返回数据对象,get\s ...

  3. springboot+mybatis+mysql 多表联合查询

    ###springboot+mybatis+mysql 多表查询 这里有两张表 用户表和用户信息表user.info 两个实体类展示他们一对一的关系 通过springboot注解的方式实现多表联合查询 ...

  4. MyBatis框架 多表联合查询实现

    三种方式: ①业务装配 对两个表编写单表查询语句,在业务层(Serivce)把查询的两个结果进行关联 ②使用Auto Mapping特性 在实现两表联合查询时通过别名完成映射,使用Maybatis的& ...

  5. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。

    多表联合查询 一个根据机场查询航线的例子.有两张表,机场表包含机场信息:机场id.机场名字.机场城市. 航班包含航线信息:航班id.飞机编号.飞行时间.票价.起飞机场id.降落机场id. 需要查询的结 ...

  6. mybatis学习五-mybatis的多表联合查询

    1. 一对一的关系 首先先看数据库 tb_user tb_orders 执行这条sql: 也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id 也就是说, 从后面看, 就是每 ...

  7. Mybatis---多表联合查询(1)

    Mybatis---多表联合查询(1) 前言 测试准备 一.一对一 新建方法 添加关联 测试 二.一对多 新建实体类 添加方法 添加关联 测试 前言 在开发过程中单表查询不能满足项目需求分析功能,对于 ...

  8. MyBatis-映射文件06-多表联合查询

    MyBatis-映射文件06-多表联合查询 使用标签中的标签和标签来处理多表联合查询时查询得到的字段值与JavaBean成员变量的对应问题,即多表联合查询时的封装规则 使用到的实体类的定义: //Em ...

  9. oracle主从关系表查询,Oracle 主从表联合查询解决方法

    Oracle 主从表联合查询 表A id   type   name 1    E      AA 2    F 表B id   Aid    name 1    2      BB 2    2   ...

最新文章

  1. ORA-24247: network access denied by access control list (ACL)
  2. acwing算法题--分组背包问题
  3. 改变图标颜色_LOL设计师宣布修改装备图标:提高清晰度、颜色差异化
  4. linux 网络编程:使用两线程实现socket同时收发数据
  5. 解决win10使用GPU跑程序遇到的一系列报错
  6. 使用 mybatis + flying + 双向相关建模 的电商后端
  7. Ubuntu下一个好用的MySQL客户端tora
  8. 分享一份 sublime 的个人配置文件
  9. 【渝粤教育】广东开放大学 电子商务项目管理 形成性考核 (22)
  10. 2019年宁波高职技能考计算机,2019年宁波职业技术学院高职提前招生考试综合素质测试大纲...
  11. 数据库期末知识点汇总
  12. ARM启动流程及启动代码分析
  13. St. Luke’s University Health Network是世界首批试用远程患者管理解决方案Masimo SafetyNet™来协助COVID-19住院患者的机构之一
  14. win10系统更新后打开chrome浏览器几秒后自动闪退
  15. html奇偶选择器,css奇偶后代选择器
  16. 请查收 | 2022 阿里妈妈技术文章回顾
  17. 循环调用scrapy框架出现的问题:twisted.internet.error.ReactorNotRestartable,解决方法
  18. 流体机械原理及设计07
  19. 万维网互联网计算机网络的区别,姜多多:万维网,互联网与因特网有什么区别?...
  20. 计算机函数公式用法教程average,average函数怎么用?Excel下average函数的使用方法...

热门文章

  1. 【028】中国语言资源保护工程–了解不同方言和少语
  2. Peercast简介、分析及常见问题处理 (一)
  3. openstack api_探索适用于PowerVC的OpenStack REST API
  4. Java Web图书管理系统毕业设计
  5. Python爬取网站图片(爬虫入门demo)
  6. 腾讯暑期实习笔经面经-为你准备(独家资料)
  7. html ol li 数字点去掉,HTML 去除 li 前面的小黑点及 ul、li 部分属性介绍
  8. 打造SDN容器百宝箱(二)
  9. CSDN博客初识红外通信(51)学习心得
  10. 【愚公系列】2023年06月 网络安全(交通银行杯)-地理位置分析