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. 【React】Stateless Function

    React创建组件的时候,有3种写法: // 1. 传统写法 const App = React.createClass({}); // 2. es6 的写法 class App extends Re ...

  2. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备三)

    接下来,我们将继续分析UIlib.h文件中其他的文件, UIContainer.h, UIRender.h, WinImplBase.h, UIManager.h,以及其他布局.控件等: 1. UIR ...

  3. WPF时间格式化

    日期格式化示例: <TextBox  Name="txtCreateTime" HorizontalAlignment="Left" Width=&quo ...

  4. Andriod学习笔记5:通过NDK在C++中实现日志输出

    开发环境 android studio 1.5.1 实现步骤 新建android项目 项目名称为AndroidCLog,选择Empty Activity模板,其他默认即可. 下载配置ndk 在项目上右 ...

  5. eclipse怎么打开工程文件的所在位置

    首先得有eclipse 一.在eclipse的菜单栏中点击 Run -->External Tools -->External Tools Configurations..       如 ...

  6. Data组件的JSON数据格式

    {     // "@type" - 类型标识,"table"表明这个JSON是一个table结构的数据     "@type" : &qu ...

  7. 在CHROME里安装 VIMIUM 插件, 方便操作

    VIMIUM 插件使用方法 VIMIUM 命令列表 网页导航 j, :向下滚动网页 k, :向上滚动网页 h : 向左滚动 l : 向右滚动 gg : 滚动到网页头部 G : 滚动到网页底部 :向上翻 ...

  8. SQL 语句与性能之执行顺序

    select * , t3.Name from t1 left join t2 on t1.sysno = t2.Asysno left join t3 on t3.sysno = t2.Bsysno ...

  9. junit的学习

    junit 是一种单元检测的工具包,他能解决的问题主要是有两点 : 1.  不用将方法都调到main方法去执行一次来看结果 2.  测试的结果可以不用我们人工去对比,这里主要使用的是junit的断言类 ...

  10. CharacterEncodingFilter-Spring字符编码过滤器

    通过源码可以看到在web.xml配置CharacterEncodingFilter 时,可以配置两个参数:encoding和forceEncoding : encoding:编码格式: forceEn ...