MyBatis实现多表联查的详细代码

目录
  • 一、通过映射配置文件实现多表联查
  • 二、使用注解的方式

一、通过映射配置文件实现多表联查

首先,使用Mysql数据库,创建两个表,分别为学生表Student表和班级表Class表,在Student表中添加列classid参照主表的列id的外键约束。

学生表Student表:

班级表Class表 :

现在去写Dao层和实体类

Student实体类:

package com.ape.bean;

import java.util.Date;

public class Student {
    private Integer sid;
    private String sname;
    private Date birthday;
    private String ssex;
    private int classid;
/*
    一对一
*/
    private Classs banji;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(Integer sid, String sname, Date birthday, String ssex, int classid, Classs banji) {
        this.sid = sid;
        this.sname = sname;
        this.birthday = birthday;
        this.ssex = ssex;
        this.classid = classid;
        this.banji = banji;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    public int getClassid() {
        return classid;
    }

    public void setClassid(int classid) {
        this.classid = classid;
    }

    public Classs getBanji() {
        return banji;
    }

    public void setBanji(Classs banji) {
        this.banji = banji;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", birthday=" + birthday +
                ", ssex='" + ssex + '\'' +
                ", classid=" + classid +
                ", banji=" + banji +
                '}';
    }
}

Class实体类:

package com.ape.bean;

import java.util.List;

public class Classs {
    private int classid;
    private String classname;
/*
    一对多
*/
    private List<Student> xuesheng;

    public Classs() {
    }

    public Classs(int classid, String classname, List<Student> xuesheng) {
        this.classid = classid;
        this.classname = classname;
        this.xuesheng = xuesheng;
    }

    public int getClassid() {
        return classid;
    }

    public void setClassid(int classid) {
        this.classid = classid;
    }

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        this.classname = classname;
    }

    public List<Student> getXuesheng() {
        return xuesheng;
    }

    public void setXuesheng(List<Student> xuesheng) {
        this.xuesheng = xuesheng;
    }

    @Override
    public String toString() {
        return "Classs{" +
                "classid=" + classid +
                ", classname='" + classname + '\'' +
                ", xuesheng=" + xuesheng +
                '}';
    }
}

 Mapper接口:

public interface ClassMapper {

    public List<Class> findClass();
}
public interface StudentMapper {
    public List<Student> findStudent();
/*
    一对多
*/
    public List<Student> findduobiao();
}

一对一关系的xml文件配置:

实现一对一的关系查询,即一条student信息对应一条class信息

<resultMap id="stu_class_Map" type="Student">
		<result column="sid" property="sid" />
		<result column="sname" property="sname"/>
		<result column="birthday" property="birthday"/>
		<result column="ssex" property="ssex"/>
		<result column="classid" property="classid"/>
        <!-- 一对一的关系映射,配置封装student的内容 -->
		<association property="banji">
			<result column="classid" property="classid"/>
			<result column="classname" property="classname"/>
		</association>
	</resultMap>
	<select id="findduobiao" resultMap="stu_class_Map">
		select * from student inner join class on student.classid = class.classid;
	</select>

这里主要配置的就是resultMap了,配置javabean类中属性与数据库列名的对应关系,association是用来指定从表方的引用实体属性的。
注意最后写的findstudent方法中,是使用到resultMap作为接收结果值返回,与上文配置的resultMap相对应。

一对多查询xml文件配置:

<resultMap id="class_stu_Map" type="Classs">
		<result column="classid" property="classid"/>
		<result column="classname" property="classname"/>
        <!-- Class中的集合映射 -->
		<collection property="xuesheng">
			<result column="sid" property="sid" />
			<result column="sname" property="sname"/>
			<result column="birthday" property="birthday"/>
			<result column="ssex" property="ssex"/>
			<result column="classid" property="classid"/>
		</collection>
	</resultMap>
	<select id="yiduiduo" resultMap="class_stu_Map">
		select * from class left join student on class.classid = student.classid order by class.classid;
	</select>

虽然知道使用这条sql语句查询后的结果会有重复项,但是不用担心,应为mybatis会自动识别到重复的内容,只保留一个。

二、使用注解的方式

还是同样的我们需要再建实体类,跟上面的一样;其次Mapper接口中的方法需要加注解。

一对一:

public interface AccountDao {
  @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="mediacomm.dao.UserDao.findUserById",fetchType= FetchType.DEFAULT))
  })
  List<Account> findAccountWithUser();
public interface UserDao {
@Select("select * from user where id=#{id}")
  User findUserById(int id);

 一对多:

public interface UserDao {
  @Select(value = "select * from user")
  @Results(id = "userMap",value = {
      @Result(id = true,column = "id",property = "id"),
      @Result(column = "username",property = "username"),
      @Result(column = "password",property = "password"),
      @Result(column = "address",property = "address"),
      @Result(property = "accounts",column = "id",
          many = @Many(select = "mediacomm.dao.AccountDao.findAccountByUid",fetchType = FetchType.DEFAULT))
  })
  List<User> findAllUser();
 
public interface AccountDao {
 @Select("select * from account where uid=#{uid}")
  List<Account> findAccountByUid(int uid);

到此这篇关于MyBatis如何实现多表联查的文章就介绍到这了,更多相关MyBatis多表联查内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis-Plus 多表联查分页的实现代码

    上一节,简单讲述了 Mybatis-Plus 搭建与使用入门,这一节,简单讲一下如何使用 MP 实现多表分页. 分析 使用的工程,依旧是 spring-boot,关于分页,官网给出了一个单表的demo,其实多表分页实现原理相同,都是通过 mybatis 的拦截器 (拦截器做了什么?他会在你的 sql 执行之前,为你做一些事情,例如分页,我们使用了 MP 不用关心 limit,拦截器为我们拼接.我们也不用关心总条数,拦截器获取到我们 sql 后,拼接 select count(*) 为我们查询总条

  • Mybatis多表关联查询的实现(DEMO)

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入几条测试数据. create table Category ( Id int not null auto_increment, Name varchar(80) null, constraint pk_category primary key (Id) ); INSERT INTO category

  • mybatis-plus多表关联查询功能的实现

    学习目标: mybatis-plus多表关联查询 学习内容: mybatis-plus多表关联查询 实体类部分代码 @Data @AllArgsConstructor @NoArgsConstructor @TableName("wb_member") public class WbMember implements Serializable { private static final long serialVersionUID=1L; /** * 用户ID */ @ApiModel

  • MyBatis-Plus多表联查的方法(动态查询和静态查询)

    目录 建库建表 依赖 配置 代码 测试 1.静态查询 2.动态查询 1.不传条件 2.传条件 建库建表 DROP DATABASE IF EXISTS mp; CREATE DATABASE mp DEFAULT CHARACTER SET utf8; USE mp; DROP TABLE IF EXISTS `t_user`; DROP TABLE IF EXISTS `t_blog`; SET NAMES utf8mb4; CREATE TABLE `t_user` ( `id` BIGIN

  • Spring boot2基于Mybatis实现多表关联查询

    模拟业务关系: 一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysql创表和模拟数据sql CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `company_id` int(11) NOT NULL, PRI

  • 使用AOP+反射实现自定义Mybatis多表关联查询

    目录 一.需求 二.核心代码 MapTo DoMap IDualMapper DualMapper DoMapAspect 三.使用方法 SysUser SysRole SysPermission SysUserService DoMapTests 测试数据 测试结果 一.需求 目前使用的ORM框架是Mybatis Plus,是Mybatis的增强框架,基础的CRUD的方法都集成了,开发起来很是方便.但是项目中总是需要多表关联查询. Mybatis的多表关联有两种 一.在Mapper中使用@Re

  • 关于QueryWrapper,实现MybatisPlus多表关联查询方式

    目录 QueryWrapper实现MybatisPlus多表关联查询 1.dao层接口使用Select注解写SQL 2.service层代码示例 3.反射工具类 4.判空工具类 MybatisPlus QueryWrapper简单用法 QueryWrapper实现MybatisPlus多表关联查询 1.dao层接口使用Select注解写SQL 重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为

  • MyBatis实现多表联查的详细代码

    目录 一.通过映射配置文件实现多表联查 二.使用注解的方式 一.通过映射配置文件实现多表联查 首先,使用Mysql数据库,创建两个表,分别为学生表Student表和班级表Class表,在Student表中添加列classid参照主表的列id的外键约束. 学生表Student表: 班级表Class表 : 现在去写Dao层和实体类 Student实体类: package com.ape.bean; import java.util.Date; public class Student { priva

  • mybatis如何根据表逆向自动化生成代码实例

    前言 自动生成代码总结(1)--(mybatis自动生成实体类.mapper文件.mapper.xml文件) 若采用mybatis框架,数据库新建表,手动编写的话,需要编写大量的实体类.mapper文件.mapper.xml文件,都是一些重复且有规律的工作. 我们可以引用插件,然后做配置,自动生成这些文件,提供工作效率. 本博客包含的内容: ①自动生成插件的引入 ②定义配置文件 ③运行插件,生成代码 1.引入插件 在项目的pom文件中引入generator插件 <plugin> <gro

  • Mybatis使用连表查询的操作代码

    某天,产品经理给了这么一个需求技术小哥,能不能帮用户添加一个搜索栏,查询包含某个关键字的所有类目.技术小哥稍微想了一下,目前跟类目相关的表有两个,一个是content_category类目表,一个是content_system内容系统表.而用户要查找的关键字是存在content_system表里面,这样一来需要连表查询一下.难度好像不大,也就爽快地答应了. 技术小哥再仔细分析了一下两个表的结构: CREATE TABLE `content_category` ( `category_id` in

  • MyBatis使用动态表或列代码解析

    有时候会不可避免使用动态表或者列进行业务处理.下面学习几种动态表/列的使用方式: [1]使用预编译 即,默认值. <select id="hisNumber" parameterType="hashmap" resultType="hashmap" > select number from ${oldTableName} <!--这里使用"$"!!!--> where name=#{name} and

  • Yii2.0小部件GridView(两表联查/搜索/分页)功能的实现代码

     GridView 两表联查/搜索/分页 当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中,对数据进行搜索,排序. Ⅰ.控制器层Controller <?php namespace backend\controllers; header("Content-type:text/html;charset=utf-8"); use Yii; use yii\web\C

  • 通过Mybatis实现单表内一对多的数据展示示例代码

    表: 需求: 将表中的数据,按照一级二级分类返回给前端json数据 代码实现: java代码: public class ResultIndustry { private String industryFirst;//一级行业 private List<String> industrySecondList;//二级行业 mybatis代码: <select id="getResultIndustryList" resultMap="resultIndustr

  • MyBatis动态创建表的实例代码

    项目中业务需求的不同,有时候我们需要动态操作数据表(如:动态建表.操作表字段等).常见的我们会把日志.设备实时位置信息等存入数据表,并且以一定时间段生成一个表来存储,log_201806.log_201807等.在这里我们用MyBatis实现,会用到动态SQL. 动态SQL是Mybatis的强大特性之一,MyBatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此对动态sql进行处理. 在动态sql解析过程中,#{ }与${ }的效果是不一样的:

  • Mybatis注解开发单表、多表操作的实现代码

    一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了 常用注解 @Select("查询的 SQL 语句"):执行查询操作注解 @Insert("查询的 SQL 语句"):执行新增操作注解 @Update("查询的 SQL 语句"):

  • mybatis根据表逆向自动化生成代码的实现

    目录 1.引入插件 2.修改generatorConfig.xml文件 3.运行插件,生成代码 .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); border-top-left-radius: 7px; border-top-right-radius: 7px; color: rgba(255, 255, 255, 1); height: 1.8

  • Mybatis自动创建表和更新表结构

    最近有小伙伴问我mybatis有没有自动创建表结构的功能,因为他们之前一直使用hibernate用习惯了,理所当然的认为,在实体类上配置下注解或者写写映射文件,系统启动后就可以自动创建表. 我只能很遗憾的告诉他,mybatis并没有这个功能,看他兴致阑珊的样子,我只能安慰他,就算没有这功能,我们可以自己开发啊~~ 所以就有了下面这套系统,已开源大家可以下来看看~~ Mybatis_BuildTable_V0.2 https://git.oschina.net/sunchenbin/Mybatis

随机推荐