解析Mybatis对sql表的一对多查询问题

Mybatisd对sql表的一对多查询

select * from
projectrecord pr
left join
projects po
on po.pid=pr.pid
left join
emp e
on e.empno = pr.empno
where pr.pid=1

<?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.msb.mapper.EmpMapper">
    <!--resultMap是一个映射表,对应的字段会对应数据表的字段
    -->
    <resultMap id="projectMap" type="projects">
        <id column="pid" property="pid"></id>
        <result column="pname" property="pname"></result>
        <result column="money" property="money"></result>
        <collection property="projectrecordList" ofType="projectrecord">
            <id property="pid" column="pid"></id>
            <id property="empno" column="empno"></id>
            <association property="emp" javaType="emp">
                <id property="empno" column="empno"></id>
                <result property="ename" column="ename"></result>
                <result property="job" column="job"></result>
                <result property="sal" column="sal"></result>
                <result property="hiredate" column="hiredate"></result>
                <result property="mgr" column="mgr"></result>
                <result property="comm" column="comm"></result>
                <result property="deptno" column="deptno"></result>
            </association>
        </collection>
    </resultMap>
    <!--Projects findPiddle(int pid);-->
    <select id="findPiddle" resultMap="projectMap">
        select *from
            emp e
                inner join
            projectrecord pr
            on pr.empno=e.empno
                inner join
            projects po
            on po.pid= pr.pid
        where pr.pid=#{pid}
    </select>
</mapper>
//mapper表
package com.msb.mapper;
import com.msb.pojo.Dept;
import com.msb.pojo.Emp;
import com.msb.pojo.Projects;
import java.util.List;
public interface EmpMapper {
    /**
     * 实现根据项目编号查看所有参与项目的人员信息
     * @param pid 传入项目号
     * @return 返回一个project的对象
     */
    Projects findPiddle(int pid);
}
package com.msb.pojo;
//一对一关系引入
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Projectrecord implements Serializable {
    private int empno;
    private int pid;
    //pr和e是一对一的关系
    private Emp emp;
}
package com.msb.pojo;
//一对多关系实体类设计
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Projects implements Serializable {
    private int pid;
    private String pname;
    private int money;
    //po和pr是一对多的关系
    List<Projectrecord> projectrecordList;
}
package com.msb.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.sql.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private  Integer sal;
    private Integer comm;
    private  Integer deptno;
    private Dept dept;
}
jdbc_driver=com.mysql.cj.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/testtable?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc_username=root
jdbc_password=root
log4j.rootLogger=debug,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=d:/msb.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--引入外部配置文件-->
    <properties resource="jdbc.properties"></properties>
    <!--这里是起的别名,前面是名,后面是路径-->
    <!--<typeAliases>
        <typeAlias alias="dept" type="com.msb.pojo.Dept"/>
    </typeAliases>-->
    <!--包别名,用到时候调用名字小写即可,就会扫描msb下的所以实体类,用的时候实体类名小写-->
    <typeAliases>
        <package name="com.msb"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <!--   简单使用了 JDBC 的提交和回滚设置  -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">

                <property name="driver" value="${jdbc_driver}"/>
                <property name="url" value="${jdbc_url}"/>
                <property name="username" value="${jdbc_username}"/>
                <property name="password" value="${jdbc_password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载mapper映射文件-->
    <mappers>
        <package name="com.msb.mapper"/>
    </mappers>
</configuration>
import com.msb.mapper.EmpMapper;
import com.msb.pojo.Dept;
import com.msb.pojo.Emp;
import com.msb.pojo.Projectrecord;
import com.msb.pojo.Projects;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test1 {
    SqlSession sqlSession = null;
    EmpMapper mapper =null;

   @Before
   public void test1(){
       //首先做一个对象SqlSessionFactoryBuilder建立一个绘话
       SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
       //有一个文本输入的io流进行读取操作
       InputStream stream = null;
       try {
           //这里的路径直接会定位到配置文件classes下面;所以这个文件在次目录下--编译和
           //-图纸;对数据库文件进行读取,获取一个io流,由于配置文件在classes下面,直接写文件名即可
           stream = Resources.getResourceAsStream("sqlMapConfig.xml");
       } catch (IOException e) {
           e.printStackTrace();
       }
       //build需要指向一个文件进行读取出来--工厂
       SqlSessionFactory factory = ssfb.build(stream);
        //需要用sqlSession去调用增删改查--工人去获取数据,打开这个绘话
       sqlSession = factory.openSession();
   }

    /*多对多的查询*/
    @Test
    public void test7(){
        mapper = sqlSession.getMapper(EmpMapper.class);
        Projects piddle = mapper.findPiddle(1);
        System.out.println("Pid");
        System.out.println(piddle.getPid());
        System.out.println("Pname");
        System.out.println(piddle.getPname());
        System.out.println("Money");
        System.out.println(piddle.getMoney());
        System.out.println("ProjectrecordList");
        List<Projectrecord> projectrecordList = piddle.getProjectrecordList();
        projectrecordList.forEach(System.out::println);

    }

    @After
    public void test3(){
       if (sqlSession!=null){
           sqlSession.close();
       }
    }
}

到此这篇关于解析Mybatis对sql表的一对多查询的文章就介绍到这了,更多相关Mybatis一对多查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MybatisPlus实现对象嵌套关联查询一对多List集合查询

    目录 对象嵌套关联查询一对多List集合查询 mybatis嵌套关联查询如下 一对多查询(经典案例) 条件 数据库 代码实现 对象嵌套关联查询一对多List集合查询 mybatis嵌套关联查询如下 由于我的是一对集合查询,所以我有两个类. @Data @TableName("tb_user") public class User {     @TableId(type= IdType.INPUT)     private String id;     @TableField("

  • MyBatis如何实现多表查询(多对一、一对多)

    MyBatis实现多表查询 一.多对一查询 数据库的准备 创建两张表,一张老师表,一张学生表 将老师主键id关联学生外键tid 创建sql的语句 create table teacher( id int primary key, teacher_name varchar(30) not null ) insert into teacher(id,teacher_name) values (1,'毛老师') create table student( id int primary key, stu

  • mybatis如何使用注解实现一对多关联查询

    mybatis 注解实现一对多关联查询 @Select("select id,mockexam_section as section,id as sectionId" + " from t_p_qb_mockexam_section" + " where mockexam_charpter_id = #{charpterId} and is_delete = 0" + " order by mockexam_section_idx as

  • springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来应该会实现此功能. 由于本人开发习惯的原因,实在是太讨厌大量的xml充斥在整个项目中,尤其是表的mapper.xml,虽然有代码生成器可以生成,但是有些复杂的查询还是需要手写配置文件里的动态sql,这点比较反感(至于为什么反感,也是有多方面原因的). 不过可能是大量的java开发人员已经被虐惯了,已

  • 解析Mybatis对sql表的一对多查询问题

    Mybatisd对sql表的一对多查询 select * from projectrecord pr left join projects po on po.pid=pr.pid left join emp e on e.empno = pr.empno where pr.pid=1 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.or

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

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

  • MyBatis图文并茂讲解注解开发一对多查询

    目录 MyBatis的注解实现复杂映射开发 一对多查询 一对多查询的模型 一对多查询的语句 创建StudentMapper接口 使用注解配置Mapper 测试类 一对多配置总结 MyBatis的注解实现复杂映射开发 实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置 一对多查询 一对多查询的模型 一对多查询的需求:查询一个课程,与此同时查询出该该课程对应的学生信息 一对多

  • mybatis同一张表多次连接查询相同列赋值问题小结

    最近遇到的一些问题总结: 1. MySQL数据库同一张表做四次左连接查询数据冗余. a. mysql数据库连接查询 b. mysql表数据去重 2. mybatis查询相同列赋值重复问题. a. 使用mybatis强大的resultMap b. mysql数据查询别名 数据库表为 Create Table CREATE TABLE `STUDENT_SCORE` ( `score_id` int(11) unsigned NOT NULL AUTO_INCREMENT,//主键 `test_id

  • MySQL 多表关联一对多查询实现取最新一条数据的方法示例

    本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法.分享给大家供大家参考,具体如下: MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 由于历史原因,表结构设计不合理:产品告诉我说需要导出客户信息数据,需要导出客户的 所属行业,纳税性质 数据:但是这两个字段却在订单表里面,每次客户下单都会要求客户填写:由此可知,客户数据和订单数据是一对多的关系:那这样的话,问题就来了,我到底以订单中的哪一条数据为准呢?经过协商后一致同

  • mybatis通过中间表实现一对多查询功能

    需求: 通过一个学生的id查询出该学生所学的所有科目. 使用到的表格: 1.student:学生表 2.subject:科目表 3.stu_sub:学生-科目表(这里的成绩字段没用到,不用管) 实体类( get.set方法省略): 1.student public class Student implements Serializable { private int id; private String stuNum; //学号 private String password; private

  • Python sqlparse解析SQL表血缘追踪实现

    目录 引言 一.主线任务 1.数据治理 2.血缘追踪 3.SQL表血缘 二.实现过程 1.目标效果 2.代码实现 1.功能函数识别 2.SQL标准格式 3.解析AST树 4.最终效果: 引言 SQLparse的开源库解析中就说过自己在寻找在python编程内可行的SQL血缘解析,JAVA去解析Hive的源码实践的话我还是打算放到后期来做,先把Python能够实现的先实现完.主要是HiveSQL的底层就是JAVA代码,怎么改写还是绕不开JAVA的.不过上篇系列我有提到过sqlparse,其实这个库

  • 最简单的MyBatis Plus的多表联接、分页查询实现方法

    一.前言 最近在加强 ITAEM 团队的一个 app 项目--学生教师学习交流平台 人员组成:安卓 + 前端 + 后台 后台 DAO 层借鉴了华工其他软件开发团队,使用了新颖强大的 MyBatisPlus 框架,里边有一个类似百度贴吧的发帖子的功能: 而如果设计表,应为 帖子表 t_post - id - title 标题 - content 内容 - xx - user_id 用户外键 用户表 t_user + id + name 帖子发起者名字 + xx 示例图中红色框中的内容为 t_use

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

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

  • 解析Mybatis Porxy动态代理和sql解析替换问题

    JDK常用核心原理 概述 在 Mybatis 中,常用的作用就是讲数据库中的表的字段映射为对象的属性,在进入Mybatis之前,原生的 JDBC 有几个步骤:导入 JDBC 驱动包,通过 DriverManager 注册驱动,创建连接,创建 Statement,增删改查,操作结果集,关闭连接 过程详解 首先进行类的加载,通过 DriverManager 注册驱动 Class.forName("com.mysql.jdbc.Driver"); Connection connection

随机推荐