步骤:

1.创建maven项目

2.编写工具类

3.编写实体类

4.编写mapper接口

5.配置xml

6.测试

多对一:多个学生关联一个老师

工具类:

//sqlSessionFactory -->sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory; static {
try {//获取sqlSession对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
} public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}

其中

String resource = "mybatis-config.xml";
mybatis-config.xml中需要注册mapper和连接数据库等操作

实体类:

public class Student {
private int id;
private String name;
private Teacher teacher;
}
//省略get/set方法
public class Teacher {
private int id;
private String name;
}
//省略get/set方法

mapper:

public interface TeacherMapper {
Teacher getTeacher(@Param("tid") Integer id);
  Teacher getTeacher2(@Param("tid") Integer id);
}

xml:

方式一(嵌套查询)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.StudentMapper">
<select id="getStudent" resultMap="StudentTeacher">
select * from mybatis.student
</select>
<resultMap id="StudentTeacher" type="Student">
<id property="id" column="id"></id>
<id property="name" column="name"></id>
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"></association>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{id}
</select>
</mapper>

  

 <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"></association>
  中的select要与下面的select标签中的id一致,相当于在里面在嵌套一个查询语句

方式二(子查询)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.StudentMapper">
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname,t.id teid
     from mybatis.student s,mybatis.teacher t where s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
<association property="teacher" javaType="Teacher">
<result property="id" column="teid"></result>
<result property="name" column="tname"></result>
</association>
</resultMap>
</mapper>

对以上标签解释:

   namespace是命名空间 对应的是一个Dao/Mapper接口(注意要写的是全限定类名!!)

  select标签中的id名要与相关mapper中的方法名保持一致!!

  resultMap是对复杂类型的结果集映射(resultMap中的id要与select中的resultMap中的名称一致!!)

  type属性也可以直接写全限定类名,若想简洁一点必须在xml文件中配置别名!!!

  resultMap中的id字段是对主键进行映射,而result是对普通字段进行映射

  result标签中的property对应的是实体类中的属性名,colum对应的是数据库中的字段名

  javaType 用来指定实体类的属性  ofType 是指泛型中的约束类型(一对多会用到)

一对多:一个老师教多名学生

实体类中的属性有所改变

public class Teacher {
private int id;
private String name;
//一个老师拥有多个学生
private List<Student> students;
}
public class Student {
private int id;
private String name;
private int tid;
}

这里返回的是一个集合List 而上面的多对一返回的是一个对象Teacher

<select id="getTeacher" resultMap="StudentTeacher">
SELECT s.id sid,s.name sname,t.name tname,t.id tid
FROM teacher t,student s where t.id = s.tid and t.id=#{tid}
</select>
<resultMap id="StudentTeacher" type="Teacher">
<result property="id" column="tid"></result>
<result property="name" column="tname"></result>
<collection property="students" ofType="Student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
<result property="tid" column="tid"></result>
</collection>
</resultMap>

ofType 是指泛型中的约束类型 老师实体中有的属性是

List<Student> students
其中List是实体类的属性 Student就是泛型约束类型 总结:

对于复杂的属性 我们需要单独处理  对象:association  集合:collection    多对一中是使用association(因为在学生实体类中Teacher是一个对象)  而一对多中是使用到collection(因为查询到的是一个集合类型) 嵌套查询sql语句会简单一点,但是映射时会复杂一些,而子查询是sql语句复杂一些,映射会相对简单和容易理解

mybatis多对一与一对多的更多相关文章

  1. Mybatis 多对一和一对多 学习总结04

    1.Mybatis 组件的声明周期 ​ 声明周期是组件的重要问题,Mybatis也常用语多线程环境,错误使用会造成多线程并发问题,为正确编写Mybatis应用程序,我们要掌握Mybatis组件的声明周 ...

  2. MyBatis多对一,一对多,多对多,一对多关联查询

    一.Person实体类 1 public class Person { 2 private Integer personId; 3 private String name; 4 private Int ...

  3. java web(六):mybatis之一对一、一对多、多对多映射

    前言: 百度百科: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  4. 后端框架的学习----mybatis框架(9、多对一处理和一对多处理)

    9.多对一处理和一对多处理 #多对一 <!--按照结果集嵌套查询--> <select id="getAllStudent1" resultMap="S ...

  5. Java基础-SSM之mybatis多对多关联

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

  6. mybatis多对一关联

    mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...

  7. Hibernate关联映射(单项多对一和一对多、双向一对多)

    最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...

  8. 一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...

  9. MyBatis多对多查询

    -------------------siwuxie095                                 MyBatis 多对多查询         以订单和商品为例,即 一个订单可 ...

随机推荐

  1. BATJ高级Java面试题分享:JVM+Redis+Kafka +数据库+设计模式

    话不多说,直接上面试题,来看一下你还欠缺多少? Mysql 与 Oracle 相比, Mysql 有什么优势? 简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别? ...

  2. [Inno Setup] 字符串列表,当要处理一长串文件时很有用

    https://wiki.freepascal.org/TStringList-TStrings_Tutorial TStringList-TStrings Tutorial │ Deutsch (d ...

  3. poj_1323 Game Prediction 贪心

    Game Prediction Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11814   Accepted: 5701 ...

  4. zoj_2511 Design T-Shirt 贪心

    Design T-Shirt Time Limit: 2 Seconds      Memory Limit: 32768 KB Soon after he decided to design a T ...

  5. bdc抢夺域控

    1.运行CMD2.在 ntdsutil :提示符下输入 ntdsutil3.在 ntdsutil :提示符下输入 roles4.在 fsmo maintenance:提示符下输入 connection ...

  6. Apache Storm 官方文档 —— Storm 与 Kestrel

    本文说明了如何使用 Storm 从 Kestrel 集群中消费数据. 前言 Storm 本教程中使用了 storm-kestrel 项目和 storm-starter 项目中的例子.建议读者将这几个项 ...

  7. 暑期档追剧指南曝光 HUAWEI nova 2系列再放实用三大招

    火辣辣的夏季来啦,每年这时火热的不只天气,还有暑期黄金档影视剧的激烈争夺战.今年有<择天记>收视率珠玉在前,<欢乐颂2>更是引发全民追剧热潮,"小花"赵丽颖 ...

  8. CSS开发技巧(一):button样式设置

    button样式需要注意的有几点: 1.建议有一个最小宽度,以免在文字很少时使得按钮过于窄,宽高不协调: 2.建议有一个padding,以免内部文本显得过于拥挤: 2.hover时需要有颜色变化,以告 ...

  9. CSS3轻松实现彩色旋转六面体动画

    一.效果预览: 二.基本思路: 1.首先这个一个自动触发的动画,因此应使用animation设计,包括自动组装和组装完成后自动旋转的过程: 2.当鼠标放上去的时候六个面及上面的字体均变色,应在六个面设 ...

  10. JAVA第一次blog总结

    JAVA第一次blog总结 0.前言 大一下学期我们开展了OPP这门课程,这也是我们第一次接触到JAVA.与上学期我们在学校里学C语言不同的是,这学期由于疫情原因我们是以网课的方式在学习.在学习中我发 ...