1、建立数据库表如下:

DROP TABLE IF EXISTS t_demo_user;
CREATE TABLE IF NOT EXISTS t_demo_user(
userid varchar(255),
username varchar(100),
password varchar(100),
PRIMARY KEY(userid)
)ENGINE=InnoDB DEFAULT CHARSET=gbk; insert into t_demo_user(userid, username, password) values("1001","fredric","fredric2001"); DROP TABLE IF EXISTS t_demo_role;
CREATE TABLE IF NOT EXISTS t_demo_role(
roleid int(20) NOT NULL AUTO_INCREMENT,
rolename varchar(100),
userid varchar(255),
FOREIGN KEY(userid) references t_demo_user(userid),
PRIMARY KEY(roleid)
)ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ; insert into t_demo_role(rolename, userid) values("role1","1001"),("role2","1001");

2、建立对应的模型和接口JAVA

public class Role {
private int roleid;
private String rolename;
private String userid;
public class User {

    private String userid;
private String username;
private String password;
private List<Role> roles;
public interface IUserOperation {
List<User> queryAfterJoin();
}

3、配置对应的XML文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mdemo.service.IUserOperation">
<resultMap id="listMap" type="User">
<id column="userid" property="userid"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<collection property="roles" javaType="java.util.List" ofType="Role">
<id column="roleid" property="roleid"/>
<result column="rolename" property="rolename" />
</collection>
</resultMap>
<select id="queryAfterJoin" resultMap="listMap">
SELECT
u.userid,
u.username,
u.password,
r.roleid roleid,
r.rolename rolename
FROM
t_demo_user u
LEFT JOIN
t_demo_role r
ON
u.userid = r.userid
</select>
</mapper>

4、使用测试如下:

IUserOperation userOperation = session.getMapper(IUserOperation.class);
List<User> users = userOperation.queryAfterJoin(); for(User u:users){
System.out.println(u.getUserid());
System.out.println(u.getUsername());
System.out.println(u.getPassword());
List<Role> roles = u.getRoles();
for(Role r:roles){
System.out.println(r.getRolename());
System.out.println(r.getRoleid());
}
} session.commit();

MyBatis(跨表查询)的更多相关文章

  1. django(3) 一对多跨表查询、ajax、多对多

    1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询hos ...

  2. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  3. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

  4. django之跨表查询及添加记录

    一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出 ...

  5. django之 基于queryset和双下划线的跨表查询

    前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(...)  对象.关联对象_set.all(...)  -->反向 基于对象的跨表查询例如: book_obj= Book ...

  6. django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)

    models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True),  OneToOneField("Author" ...

  7. python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

  8. python 全栈开发,Day73(django多表添加,基于对象的跨表查询)

    昨日内容回顾 多表方案: 如何确定表关系呢? 表关系是在2张表之间建立的,没有超过2个表的情况. 那么相互之间有2条关系线,先来判断一对多的关系. 如果其中一张表的记录能够对应另外一张表的多条记录,那 ...

  9. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  10. Django框架----跨表查询及添加记录

    一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出 ...

随机推荐

  1. maven打包时,依赖包打不进jar包中

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  2. Rdeis 详解 小白

    Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-v ...

  3. Anaular指令详解

    目录:directive()   restrict   replace   template   templateUrl  scope  transclude   ng-transclude   co ...

  4. github push时,要求密码的问题

    整几次才搞的有点明白: 1 clone 项目 用 SSH: 在github 上如下图 2 C:\Users\<用户名> 下如果有 "_netrc" 文件: 如果含有 如 ...

  5. linux菜鸟日记(4)

    使用一个简单的for循环和if判断语句实现某个网段内所有ping所有客户机的shell程序: ..} do >&; then echo " ${i}通" else e ...

  6. echo.js 延迟加载图片控件

    echo.js的github地址:https://github.com/toddmotto/echo   echo是一个独立的JavaScript.轻量级的.延迟图片加载插件,echo压缩后体积不到1 ...

  7. 由overflow-x:scroll产生的收获

    我们都知道float:left属性会让元素向左浮动,如果用一个div将几个左浮动的li包起来,是不是div的宽度被li撑得很长很长呢,代码: <!DOCTYPE html> <htm ...

  8. 提交数据url太长导致提交失败

    使用了dojo开发.在datagrid过滤的时候.为了让过滤好处理,直接设置为完全二叉树的方式来存查询条件.但是在提交数据的时候,默认是get?url的方式.结果导致条件选择一两个,url会特别长.然 ...

  9. 初步了解CPU

    了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. ...

  10. 【ORACLE】MD5加密

        今天乌干达充值卡入库时,发现有资源已经存在的异常, 异常原因经过核实是由于卡资源密码在库中已经存在, 为进一步查找存在的原因, 因此需要对导入文件密码的MD5 加密, 通过MD5加密后的字符串 ...