首先  数据库量表之间字段关系(没有主外键)

studentmajor表的id字段对应student表里major字段

两个实体类

package com.model;

import java.util.Date;

public class Student {
private Integer sno;
private String sname;
private String ssex;
private Integer sclass;
private StudentMajor studentmajor; public Student() {
super();
}
public Student(Integer sno, String sname, String ssex, Integer sclass, StudentMajor studentmajor) {
super();
this.sno = sno;
this.sname = sname;
this.ssex = ssex;
this.sclass = sclass;
this.studentmajor = studentmajor;
}
public StudentMajor getStudentmajor() {
return studentmajor;
}
public void setStudentmajor(StudentMajor studentmajor) {
this.studentmajor = studentmajor;
}
public Integer getSno() {
return sno;
}
public void setSno(Integer sno) {
this.sno = sno;
} public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
} @Override
public String toString() {
return "Student [sno=" + sno + ", sname=" + sname + ", ssex=" + ssex + ", sclass=" + sclass + ", studentmajor="
+ studentmajor + "]";
}
public Integer getSclass() {
return sclass;
}
public void setSclass(Integer sclass) {
this.sclass = sclass;
} }
package com.model;

import java.util.List;

public class StudentMajor {
private Integer id;
private String mcode;
private String mname;
private List<Student> students;
public StudentMajor() {
super();
}
public StudentMajor(Integer id, String mcode, String mname, List<Student> students) {
super();
this.id = id;
this.mcode = mcode;
this.mname = mname;
this.students = students;
}
@Override
public String toString() {
return "StudentMajor [id=" + id + ", mcode=" + mcode + ", mname=" + mname + ", students=" + students + "]";
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getMcode() {
return mcode;
}
public void setMcode(String mcode) {
this.mcode = mcode;
}
public String getMname() {
return mname;
}
public void setMname(String mname) {
this.mname = mname;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
} }

定义两个接口

package com.dao;
import java.util.List;
import java.util.Map; import com.model.Student; public interface StudentMapper {
/**
* 全表查询
*/
public List<Student> selectall();
  /**
* 根据专业查人员,给一对多用
*/
public List<Student> selectz(Integer major);
}
package com.dao;
import java.util.List;
import com.model.StudentMajor; public interface StudentMajorMapper {
/**
* 全表查询
* @return
*/
public List<StudentMajor> selectAll();
/**
* 根据主键查数据,给多对一用
* @param id
* @return
*/
public StudentMajor select(Integer id);
}

定义两个实体类的映射方法

<?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.dao.StudentMapper"> <!-- 多对一查询 -->
<resultMap type="Student" id="slist">
<!-- 跟一对一一样用association标签,实体类定义的成员,要跟数据库字段名对应上 -->
<association property="studentmajor" column="major"
select="com.dao.StudentMajorMapper.select"/> <!-- 用接口里定义的方法,根据student表中的major字段查出对应数据 -->
</resultMap>
<!-- 查全部 -->
<select id="selectall" resultMap="slist" >
select * from student
</select>
<!-- 根据专业查人员 -->
<select id="selectz" parameterType="Integer" resultType="student">
select * from student s where s.major=#{major}
</select>
</mapper>
<?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.dao.StudentMajorMapper"> <!-- 一对多查询关联 -->
<resultMap type="StudentMajor" id="slist">
<!-- 实体类属性对应数据库的主键字段,不然主键会查不到 -->
<id property="id" column="id"/>
<!-- 用collection标签 ,也是实体类属性要对应数据库字段-->
<collection property="students" column="id"
select="com.dao.StudentMapper.selectz">
</collection>
</resultMap> <!-- 全表查询 -->
<select id="selectAll" resultMap="slist">
select * from studentmajor
</select> <!-- 根据主键查 -->
<select id="select" parameterType="Integer" resultType="StudentMajor">
select * from studentmajor where id=#{id}
</select> </mapper>

JUnit测试

package com.util;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.dao.StudentMajorMapper;
import com.dao.StudentMapper;
import com.model.Student;
import com.model.StudentMajor; public class JJJtest {
private SqlSession ss;
private StudentMapper sm;
private StudentMajorMapper smm; @Before
public void setUp() throws Exception {
ss=SqlSessionUtil.getSqlSession();
sm=ss.getMapper(StudentMapper.class);
smm=ss.getMapper(StudentMajorMapper.class); }
@After
public void tearDown() throws Exception {
ss.commit();
ss.close();
}
//一对多查询
public void test() {
List<StudentMajor> list=smm.selectAll();
for(StudentMajor a:list){
System.out.println(a);
}
}
//根据专业查人员,给一对多用
public void selectz(){
List<Student> l=sm.selectz(3);
for(Student a:l){
System.out.println(a);
}
} //多对一查询
@Test
public void selectall() {
List<Student> st=sm.selectall();
for(Student tt:st){
System.out.println(tt);
}
}
//根据主键查询,给多对一用
public void select(){
StudentMajor a=smm.select(1);
System.out.println(a);
} }

一对多查询结果

多对一查询结果

mybatis 一对多和多对一关联查询的更多相关文章

  1. mybatis实现多表一对一,一对多,多对多关联查询

    原文:https://blog.csdn.net/m0_37787069/article/details/79247321 1.一对一关键字:association作用:针对pojo对象属性的映射  ...

  2. MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询

    对于一对一,一对多的关联查询,Mybatis-Plus官方示例(mybatis-plus-sample-resultmap)在处理时,需要编写查询方法及配置resultMap,并且写SQL. 为了简化 ...

  3. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  4. mybatis 14: 多对一关联查询

    业务背景 根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息) 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer i ...

  5. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

  6. Mybatis学习系列(五)关联查询

    前面几节的示例基本都是一些单表查询,实际项目中,经常用到关联表的查询,比如一对一,一对多等情况.在Java实体对象中,一对一和一对多可是使用包装对象解决,属性使用List或者Set来实现,在mybat ...

  7. mybatis 一对多,多对一配置

    一. 简介: 本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客 二. 例子: 1. 代码结构图: 2. 建表语句: CREATE DATABASE test; US ...

  8. Mybatis 一对多延迟加载,并且子查询中与主表字段不对应 (19)

    Mybatis  一对多延迟加载,并且子查询中与主表字段不对应应用说明. 实现一对多关联(懒加载),一个教研组对应多个教师,既:教师的教研编号与教研组的教研编号关联,并且教师关联教研组外键与教研组编号 ...

  9. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

随机推荐

  1. redis持久化的几种方式

    1.前言 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集 ...

  2. C#设计模式总结(转)

    一.引言 经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构.所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式.这 ...

  3. R读取excel文件乱码 read.xlsx() 解决方法

    1. 参考[R语言]R读取含中文excel文件,read.xlsx乱码问题  该文章总结得很好,可以直接跳到最后看博主的总结. 2. 如果依旧是乱码那么用read.xlsx2()去读取excel文件, ...

  4. HDU5734 Acperience(数学推导)

    Problem Description Deep neural networks (DNN) have shown significant improvements in several applic ...

  5. Uva 122 树的层次遍历 Trees on the level lrj白书 p149

    是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...

  6. Hibernate三大类查询总结

    Hibernate目前总共分为三大类查询:cretiria,hql,本地sql [以下篇章搜集于网络,感谢作者] 第一:关于cretiria的查询 具有一个直观的.可扩展的条件查询API是Hibern ...

  7. vue基础一

    一.vue的编写步骤 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. HTML5入门(一)—— 基本标签&表格

    一.HTML简介 超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML Head部分      <1>Head的作用 用于描述网页的一些关键信息.比如网页的 ...

  9. 一步一步学MySQL-一致性非锁定读和锁定读

    一致性非锁定读(consistent nonlocking read) 一致性非锁定读是值InnoDB存储引擎通过多版本控制(multi versioning)的方式来读取当前执行时间数据库中的数据. ...

  10. 一个普通的 Zepto 源码分析(一) - ie 与 form 模块

    一个普通的 Zepto 源码分析(一) - ie 与 form 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核 ...