精华内容
下载资源
问答
  • Mybatis关联查询之一对多和多对一XML配置详解

    万次阅读 多人点赞 2017-12-21 10:53:05
    平时在开发过程中dao、bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的多对一和一对多的情况。 首先是有两张表(学生表Student和老师Teacher表),为了更易懂,这里只设置了...

    平时在开发过程中dao、bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的多对一和一对多的情况。

    • 首先是有两张表(学生表Student和老师Teacher表,注:这里只是为了演示一对多和多对一的情况,请不要杠),为了更易懂,这里只设置了最简单的几个必要字段。表结构如下图

    Student表:

    Teacher表:

    • 创建实体bean
    Teacher.java:
    import java.util.List;
    
    public class Teacher {
    
    	private Integer id;
    	private String name;
    	private String className;
    	private List<Student> students;
    
    	// get、set方法省略
    
    }
    

    Sfudent.java

    public class Student {
    
    	private Integer id;
    	private String name;
    	private Integer teacherId;
    	private String className;
    	private Teacher teacher;
    	
        // get、set方法省略
    } 
    
    • 下面重点来了:配置Mapper.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.tz.mybatis.dao.studentDao">  
    	
    	<!-- ///一对多的第一种写法/// -->
    	<resultMap type="Teacher" id="teacherMap">
    	    <id column="id" property="id"/>
    	    <result column="name" property="name"/>
                <collection property="students" ofType="Student" column="id">
                    <!-- 这里的column对应的是下面查询的别名,而不是表字段名 -->
    		    <id column="sid" property="id"/>
                    <!-- property对应JavaBean中的属性名 -->
    		    <result column="sname" property="name"/>
    		    <result column="className" property="className"/>
    		    </collection>
    	</resultMap>
    	
    	
    	<!-- 查询所有的老师级各自的所有学生 -->
    	<select id="getTeachers" parameterType="Teacher" resultMap="teacherMap">
    		SELECT
    			t.id,
    			t.NAME,
    			t.class_Name,
    			s.id AS sid,
    			s. NAME AS sname,
    			s.class_name as className
    		FROM
    			teacher t
    		LEFT JOIN student s ON t.id = s.teacher_id
    	</select>
    </mapper>
    • 测试类:
     
    package com.tz.test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    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.Before;
    import org.junit.Test;
    import com.tz.mybatis.bean.Student;
    import com.tz.mybatis.bean.Teacher;
    
    public class TeacherTest {
    
    	private SqlSessionFactory sqlSessionFactory;
    	
    	@Before
    	public void init() throws IOException {
    		String resource = "mybatis-config.xml";
    		InputStream inputStream = Resources.getResourceAsStream(resource);
    		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    	}
    	
    	@Test
    	public void getTeachers() {
    		SqlSession session = sqlSessionFactory.openSession();
    		List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getTeachers");
    		System.out.println(list);
    	}
    	
    }
    

    下面给出第二种写法:

    <!-- //一对多的第二种写法/ -->
    	<resultMap type="Teacher" id="teacherMaps">
    		<id column="id" property="id"/>
    		<result column="name" property="name"/>
    		<result column="class_name" property="className"/>
    		<collection property="students" ofType="Student" select="getStudents" column="id">
    		</collection>
    	</resultMap>
    	
    	
    	<!-- 查询所有的老师级各自的所有学生 -->
    	<select id="getAllTeacher" parameterType="Teacher" resultMap="teacherMaps">
    		SELECT
    			t.id,
    			t.NAME,
    			t.class_name
    		FROM
    			teacher t
    	</select>
    	
    	<select id="getStudents" parameterType="int" resultType="Student">
    		select 
    			s.id,
    			s. NAME,
    			s.class_name as className
    		from student s
    		where teacher_id = #{id}
    	</select>
    测试类:
    @Test
    	public void getTeachers2() {
    		SqlSession session = sqlSessionFactory.openSession();
    		List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getAllTeacher");
    		System.out.println(list);
    	}

    查询学生信息(多对一):

    首先还是配置文件:

    <resultMap type="Student" id="studentMap">
    		<id column="id" property="id"/>
    		<result column="name" property="name"/>
    		<result column="class_name" property="className"/>
    		<result column="teacher_id" property="teacherId"/>
    		<association property="teacher" select="getTeacher" column="teacher_id" javaType="Teacher">
    		<!-- 这里要注意的是column对应的是student中的外键,而且需是表字段名 -->
    		</association>
    	</resultMap>
    	
    	
    	<select id="getStudent" resultMap="studentMap">
    		SELECT
    			s.id,
    			s.name,
    			s.class_name,
    			s.teacher_id
    		FROM
    			student s
    	</select>
    	
    	<select id="getTeacher" resultType="Teacher" parameterType="int">
    		SELECT
    			t.id,
    			t.name,
    			t.class_name as className 
    		FROM teacher t 
    		where id = #{teacher_id}
    	</select>

    测试类:
    @Test
    	public void getStudents() {
    		SqlSession session = sqlSessionFactory.openSession();
    		List<Student> list = session.selectList("com.tz.mybatis.dao.studentDao.getStudent");
    		System.out.println(list);
    	}

    最后:当然如果不想配置这么麻烦的信息,可以直接写一个关联查询的SQL语句,返回结果直接由Map接受即可。不过这样就不太符合面向对象的理念了。

     

    展开全文
  • SQL子查询、关联查询

    万次阅读 2018-08-25 00:13:45
    SQL子查询、关联查询

    SQL子查询、关联查询:

    这里写图片描述


























    注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!


    持续更新中…

    如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:
    你遇到的问题是小编创作灵感的来源!


    展开全文
  • 如果是左关联查询就是以左表为主,sql语句 SELECT * FROM `user` LEFT JOIN info ON `user`.bid=`info`.id 查询结果 如果是以右表为主,则用右关联查询 sql语句 SELECT * FROM `user` RIGHT JOIN info ON `user...

    如图 user表结构 

    如图 info表结构

    如果是左关联查询就是以左表为主,sql语句

    SELECT * FROM `user` LEFT JOIN info ON `user`.bid=`info`.id
    查询结果

    如果是以右表为主,则用右关联查询 sql语句

    SELECT * FROM `user` RIGHT JOIN info ON `user`.bid=`info`.id
    查询结果:

     

     

    展开全文
  • mysql查询语句 和 多表关联查询 以及 子查询

    万次阅读 多人点赞 2017-03-28 14:12:15
    mysql(三):mysql查询语句 和 多表关联查询 以及 子查询 1.查询一张表:  select * from 表名; 2.查询指定字段:select 字段1,字段2,字段3….from 表名; 3.where条件查询:select 字段1,字段2,字段3 ...

    mysql(三):mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表:     select * from 表名;

    2.查询指定字段:select 字段1,字段2,字段3….from 表名;

    3.where条件查询:select 字段1,字段2,字段3 frome 表名 where 条件表达式;
    例:select * from t_studect where id=1;
           select * from t_student where age>22;

    4.带in关键字查询:select 字段1,字段2 frome 表名 where 字段 [not]in(元素1,元素2);
    例:select * from t_student where age in (21,23);
           select * from t_student where age not in (21,23);

    5.带between and的范围查询:select 字段1,字段2 frome 表名 where 字段 [not]between 取值1 and 取值2;
    例:select * frome t_student where age between 21 and 29;
           select * frome t_student where age not between 21 and 29;

    6.带like的模糊查询:select 字段1,字段2… frome 表名 where 字段 [not] like ‘字符串’;
        “%”代表任意字符;
        “_”代表单个字符;
    例:select * frome t_student where stuName like ‘张三”;
           select * frome t_student where stuName like ‘张三%”;
           select * frome t_student where stuName like ‘%张三%”;//含有张三的任意字符
           select * frome t_student where stuName like ‘张三_”

    7.空值查询:select 字段1,字段2…frome 表名 where 字段  is[not] null;

    8.带and多条件查询:
    select 字段1,字段2…frome 表名 where 条件表达式1 and 条件表达式2 [and 条件表达式n]
    例:select * frome t_student where gradeName=’一年级’ and age=23;

    9.带or的多条件查询
    select 字段1,字段2…frome 表名 where 条件表达式1 or 条件表达式2 [or 条件表达式n]
    例:select * frome t_student where gradeName=’一年级’ or age=23;//或者,条件只要满足一个

    10.distinct去重复查询:select distinct 字段名 from 表名;

    11.对查询结果排序order by:select 字段1,字段2…from 表名 order by 属性名 [asc|desc]
    例:select * frome t_student order by age desc;//降序,从大到小
           select * frome t_student order by age asc;//升序,asc默认可以不写

    12.分组查询group by
    group by 属性名 [having 条件表达式][with rollup]
    1.单独使用(毫无意义,不能单独使用);

    2.与group_concat()函数一起使用;
    例:select gradeName,group_concat(stuName) from t_student group by gradeName;


    3.与聚合函数一起使用;
    例:select gradeName,count(stuName) from t_student group by gradeName;


    4.与having一起使用(显示输出的结果);
    例:select gradeName,count(stuName) from t_student group by gradeName having count(stuName)>3;

    5.与with rollup 一起使用(最后加入一个总和行);
    例:select gradeName,group_concat(stuName) from t_student group by gradeName with rollup;

      
    13.limit 分页查询:select 字段1,字段2,…from 表名 limit 初始位置,记录数;
    例子:select * from t_student limit 0,5;



                 多表连接查询

    表一:t_book



    表二:t_bookType


    表三:t_priceLevel



    select * from t_book,t_bookType;


    1.内连接查询(两张或以上的表连接起来查询需要的数据)
    根据表一的bookTypeId查询出所有bookTypeName
    select * from t_book,t_bookType where t_book.bookTypeId=t_bookType.id;


    查询某几个字段:
    select bookNme,author from t_book,t_bookType where t_book.bookTypeId=t_bookType.id;



    2.外连接查询(两张或以上的表连接起来查询某张表的信息)

    3.左连接查询
    select * from t_book left join t_bookType on t_book.bookTypeId=t_bookType.id;
    如下图:表一(左边表)t_book的数据全部查出 表二没有的字段用null代替



    4.右连接查询
    select * from t_book right join t_bookType on t_book.bookTypeId=t_bookType.id;
    查出表二(右边表)的所有信息,表一没有的用null代替



    5.多条件连接查询
    select * from t_book,t_bookType where t_book.bookTypeId=t_bookType.id and t_book.price>70;




    子查询
    1.带in关键字的子查询(一个查询语句的条件可能落在另一个select语句的查询结果中)
    select * from t_book where bookType in(select id from t_bookType);
    select * from t_book where bookType not in(select id from t_bookType);

    2.带比较运算符的子查询(子查询可以使用比较运算符)
    select * from t_book where price>=(select price from t_priceLevel where priceLevel=1);

    3.带exists关键字的子查询(加入子查询查询到记录,则进行外层查询,否则,不执行外层查询)
    select * from t_book where exists(select * from t_booktype);
    select * from t_book where not exists(select * from t_booktype);

    4.带any关键字的子查询(any关键字表示满足其中任一条件)
    select * from t_book where price>= any(select price from t_priceLevel);

    5.带all关键字的子查询(all关键字表示满足所有条件)
    select * from t_book where price>= all(select price from t_priceLevel);


    合并查询

    1.union
    使用union关键字是,数据库系统会将所有的查询结果合并到一起,然后去掉相同的记录;
    select id from t_book union select id from t_bookType;

    2.union all
    使用union all,不会去除掉重复的记录;
    select id from t_book union all select id from t_bookType;

    展开全文
  • oracle关联查询

    千次阅读 2018-10-12 09:15:43
    /*  SQL语句的历史版本  SQL89  比较多  SQL92  SQL99  多表关联查询  笛卡尔积  等值关联查询  非等值关联查询  左外连接  右外连接  全外连接  自连接 */ -----...
  • oracle 关联查询 查询自身表

    千次阅读 2017-02-14 16:34:26
    oracle 关联查询 查询自身表
  • Spring Data JPA Specification多表关联查询

    万次阅读 2020-10-23 17:17:59
    需求:有一个流量计的设备,流量计有一个所属罐区id,想要通过所属罐区查到所关联的这个罐区的编码以及名称。 1.流量计实体类: 主要是给流量计实体添加了以下属性,通过tank_area_id关联: package ...
  • MySQL左关联、右关联、内关联查询

    万次阅读 2018-12-28 12:34:58
    要说MySQL的关联查询,首先先说一下笛卡尔积, 有两个集合 A = {1, 2},B = {1, 3},这两个集合的笛卡尔积 A * B就有四种情况, A * B = {(1,1), (1,3), (2,1),(2,3)} 笛卡尔积 1 2 1 3 2 1 2 3 ...
  • 需求,根据vrTaskUuid查询用户任务和步骤信息,需要根据vrTaskUuid关联查询vr_user_oper_info(任务信息)和vr_user_oper_step_info(步骤信息) SQL语句-关联查询 Mapper配置 <?xml version="1.0" encoding=...
  • 使用MyBatis-Plus生成模板,进行表关联查询。 使用表 文章表+作者表 文章表中有一个author_id 连接 作者表中的id 文章表 作者表 实体类 想要使用表关联查询,需要在文章类中添加一个作者对象,两个实体...
  • 关联查询本人使用的是thinkphp3.2.3版本 由于性能问题,新版取消了自动关联查询机制,而统一使用relation方法进行关联操作,relation方法不但可以启用关联还可以控制局部关联操作,实现了关联操作一切尽在掌握之中...
  • Mybatis笔记4 关联查询 日志 延迟查询

    万次阅读 2020-04-21 18:47:57
    关联查询 一对一查询 通过resultMap的 association 标签实现 student表 card表 student类 mapping.xml <select id="queryAllStudentAndCard" resultMap="AllStudentAndCardMap"> select s.*, c.* from ...
  • mysql关联查询:左关联、右关联、内关联、全关联
  • mysql关联查询和查询优化

    千次阅读 2019-07-29 18:55:32
    mysql关联查询 参考:https://blog.csdn.net/lu0422/article/details/78892497 mysql查询慢的原因 记录慢查询日志 分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和经历,可以使用pt-query-...
  • mysql 语句关联查询问题 mysql 语句关联查询问题mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题
  • SpringBoot JPA 表关联查询

    万次阅读 2016-11-03 16:42:28
    今天给大家介绍一下如何利用JPA实现表关联查询。 今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的。 想学习分布式、微服务、JVM、多线程、架构、java、python的童鞋,千万不要扫码,否则...
  • 通过主外键实现表关联查询~
  • MongoDb 关联查询

    千次阅读 2018-06-10 21:53:43
    刚接触MongoDB,有个需求是进行两张表的关联查询的。需求:把订单表(PrepurchaseOrder)和用户表(User)通过邮箱(emaiL)进行关联,查找订单用户对应的钱包地址。订单表结构如下:{ "email" : "...
  • Yii 2 关联查询

    千次阅读 2019-07-05 14:55:32
    yii内置关联查询, 使用简单.功能强大. 可以快速帮助我们查询到有关联数据. 2.学习/操作 1.简答理解 [[ActiveRecord::hasOne()]]:返回对应关系的单条记录 [[ActiveRecord::hasMany()]]:返回对应关系...
  • 子查询和关联查询的区别 子查询就是查询中又嵌套的查询,表连接都可以用子查询,但不是所有子查询都能用表连接替换,子查询比较灵活,方便,形式多样,适合...
  • mysql联合查询和关联查询

    千次阅读 2017-11-14 23:22:19
    最近面试中,Java的都会考察数据库,写SQL语句,大多数就问关联查询,索引看看下面三个关联查询的 SQL 语句有何区别?SELECT * FROM score, student WHERE score.id = student.id ... SELECT * FROM score JOIN ...
  • 关联查询和子查询性能比较

    千次阅读 2019-06-24 13:08:42
    在项目开发的过程中,对于一些实体类,它的大部分字段都可以在一张表中查询到,但另一些属性来来自于其它表,需要用到关联查询或者子查询。下面来探讨一下这两种查询的区别。 例如评论表,它的点赞数来自另一张表 ...
  • 因为疫情有一段时间没有敲代码了,最近刚上手,就出现了问题,事后我总结了一下,是我的粗心大意,等我发现问题原因的...2.现在我要显示全部信息了,左关联查询原本就是以左边的表为主,右边的表要是有没有匹配上的...
  • 在查询时尽量不要在sql内使用子查询, 将子查询改为关联查询 速度更快。 SELECT * FROM `dept_a` where id in (SELECT MAX(id) from dept_a GROUP BY source); SELECT A.* from dept_a A INNER JOIN ( SELECT MAX...
  • mybatis-plus 关联查询

    千次阅读 2019-12-11 23:45:07
    一、mybatis-plus的关联查询 前面讲到mybatis-plus生成代码,实体类继承基类 这次,聊下关于mybatis-plus 关联查询的问题。在自动生成的controller,entity,service,mapper,xml只能满足单表查询。如果要进行多...
  • 五种关联查询

    2019-04-10 13:28:33
    五种关联查询: 1. 交叉连接(CROSS JOIN) 2. 内连接(INNER JOIN) 3. 外连接(LEFT JOIN/RIGHT JOIN) 4. 联合查询(UNION 与 UNION ALL) 5. 全连接(FULL JOIN) 交叉连接(没有任何关联条件,查询所有表) select * form ...
  • MongoDB的多表关联查询

    万次阅读 2017-11-10 18:31:59
    Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通过student的classId关联进行查询学生名称,班级的数据: SELECT student.name,student.age,class.name ...
  • Mysql关联查询

    2014-03-17 17:11:01
    现有两张表news表和category ...这时候就需要用到关联查询了 news表: category表: 关联查询分为:内联 和 外联 (左联 右联) 内联:  格式 select 字段 from 表1 inner join 表2 on 关联条件  实例
  • 文章目录多表设计-关联查询为什么需要多表设计?数据库设计范式第一范式(1NF)第二范式(2NF)第三范式(3NF)数据库实例外键数据库实例注意关联查询概述分类内连接(inner join)外连接交叉连接 多表设计-关联查询 为什么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,745
精华内容 15,098
关键字:

关联查询