博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Mybatis】一对一,一对多,多对多映射
阅读量:2056 次
发布时间:2019-04-28

本文共 7417 字,大约阅读时间需要 24 分钟。

Mybatis和Hibernate的映射关系差不多,都有一对一,一对多,多对多,但其实现方式却不同,mybatis主要还是以sql语句为主,而hibernate以映射文件onetoone进行配置相应的属性。

一对一

我们以学生身份证为例子

创建实体类Card

package cn.qblank.one2one;public class Card {	private Integer id;	private String num;		public Integer getId() {		return id;	}	public void setId(Integer id) {		this.id = id;	}	public String getNum() {		return num;	}	public void setNum(String num) {		this.num = num;	}		@Override	public String toString() {		return "Card [id=" + id + ", num=" + num + "]";	}	}
Student类

package cn.qblank.one2one;public class Student {	private Integer id;	private String name;	private Card card;		public Integer getId() {		return id;	}	public void setId(Integer id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public Card getCard() {		return card;	}	public void setCard(Card card) {		this.card = card;	}		@Override	public String toString() {		return "Student [id=" + id + ", name=" + name + ", card=" + card + "]";	}}
在数据库中创建对应的表

-- 创建学生表CREATE TABLE t_student(	sid INT,	sname VARCHAR(20),	scid INT)-- 创建身份证表CREATE TABLE t_card(	cid INT,	cnum VARCHAR(20))

创建对应的映射文件

StudentMapper.xml

CardMapper.xml

将其配置到主配置文件mybatis.xml文件中

然后在StudentCardDao类中写封装对应的方法

/** * 查询1号学生的信息 * @param id */public Student findById(int id) throws Exception {	SqlSession sqlSession = null;	try {		sqlSession = MybatisUtil.getSqlSession();		return sqlSession.selectOne(Student.class.getName() + ".findById",id);			} catch (Exception e) {		e.printStackTrace();		throw e;	} finally {		MybatisUtil.closeSqlSession();	}}/** * 通过姓名查学生信息 * @param name * @return * @throws Exception */public Student findByName(String name) throws Exception{	SqlSession sqlSession = null;	try {		sqlSession = MybatisUtil.getSqlSession();		return sqlSession.selectOne(Student.class.getName() + ".findByName",name);	} catch (Exception e) {		e.printStackTrace();		throw e;	} finally {		MybatisUtil.closeSqlSession();	}}

一对多

班级学生来做例子

创建实体类Student和Grade

Student类

package cn.qblank.one2many;/** * 学生 * @author Administrator */public class Student {	private Integer id;	private String name;	private Grade grade;		public Integer getId() {		return id;	}	public void setId(Integer id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public Grade getGrade() {		return grade;	}	public void setGrade(Grade grade) {		this.grade = grade;	}	}
Grade类

package cn.qblank.one2many;import java.util.ArrayList;import java.util.List;/** * 班级 * @author Administrator */public class Grade {	private Integer id;	private String name;	private List
stuList = new ArrayList<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List
getStuList() { return stuList; } public void setStuList(List
stuList) { this.stuList = stuList; }}
创建对应表

-- 班级CREATE TABLE t_grades(	gid INT(5) PRIMARY KEY,	gname VARCHAR(10)	);-- 学生CREATE TABLE t_stu(	sid INT(5) PRIMARY KEY,	sname VARCHAR(10),		sgid INT(5),	CONSTRAINT sgid_fk FOREIGN KEY(sgid) REFERENCES t_grades(gid));
创建对应映射文件StudentMapper.xml和GrapeMapper.xml

StudentMapper.xml

GradeMapper.xml

在主文件mybatis.xml中加载两文件

然后封装对应的方法到StuGraDao类中

/** * 查询156班有哪些人 * @param name 班级名 * @return * @throws Exception */public List
findAllByName(String name) throws Exception{ SqlSession sqlSession = null; try { sqlSession = MybatisUtil.getSqlSession(); return sqlSession.selectList(Student.class.getName() + ".findAllByName",name); } catch (Exception e) { e.printStackTrace(); throw e; } finally { MybatisUtil.closeSqlSession(); }}/** * 查询evan_qb是哪个班的 * @param name 学生姓名 * @return * @throws Exception */public Grade findByName(String name) throws Exception{ SqlSession sqlSession = null; try { sqlSession = MybatisUtil.getSqlSession(); return sqlSession.selectOne(Grade.class.getName() + ".findByName",name); } catch (Exception e) { e.printStackTrace(); throw e; } finally { MybatisUtil.closeSqlSession(); }}

多对多

学生课程为例

创建实体类Student和Course

Student类

package cn.qblank.many2many;import java.util.ArrayList;import java.util.List;public class Student {	private Integer id;	private String name;	private List
courseList = new ArrayList<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List
getCourseList() { return courseList; } public void setCourseList(List
courseList) { this.courseList = courseList; }}
Course类

package cn.qblank.many2many;import java.util.ArrayList;import java.util.List;public class Course {	private Integer id;	private String name;	private List
stuList = new ArrayList<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List
getStuList() { return stuList; } public void setStuList(List
stuList) { this.stuList = stuList; }}
创建对应的数据库表

-- 学生表CREATE TABLE t_stus(	sid INT PRIMARY KEY,	sname VARCHAR(20));-- 课程表CREATE TABLE t_courses(	cid INT PRIMARY KEY,	cname VARCHAR(20));-- 中间表CREATE TABLE middle(	msid INT,	mcid INT);
然后创建对应的映射文件StudentMapper.xml和CourseMapper.xml

StudentMapper.xml文件

CourseMapper.xml

在主文件mybatis.xml中加载文件

在CourseStuDao类中封装相应的方法

/** * 查询某人选学了哪些课程 * @param name 表示学生的姓名 */public List
findAllByName(String name) throws Exception{ SqlSession sqlSession = null; try{ sqlSession = MybatisUtil.getSqlSession(); return sqlSession.selectList(Course.class.getName() + ".findAllByName",name); }catch(Exception e){ e.printStackTrace(); throw e; }finally{ MybatisUtil.closeSqlSession(); }}/** * 查询某课程有哪些学生选修 * @param name 表示学生的课程 */public List
findAllByCourseName(String name) throws Exception{ SqlSession sqlSession = null; try{ sqlSession = MybatisUtil.getSqlSession(); return sqlSession.selectList(Student.class.getName() + ".findAllByCourseName",name); }catch(Exception e){ e.printStackTrace(); throw e; }finally{ MybatisUtil.closeSqlSession(); }}

就完成了mybatis的一对一,一对多,多对多的配置,通过配置我们可以发现,主要还是对sql语句的应用,所以学习mybatis还需对数据库的语句有一定的熟悉

你可能感兴趣的文章
Kubectl exec 背后到底发生了什么?
查看>>
程序员涨薪宝典
查看>>
什么?终止一个容器竟然用了 10 秒钟,这不能忍!
查看>>
Openshift 4.4 静态 IP 离线安装系列(一):准备离线资源
查看>>
万字长文,说透了 Openshift4 的安装过程!
查看>>
Envoy 中文指南系列:Envoy 介绍
查看>>
[译] BeyondProd:云原生安全的一种新方法(Google, 2019)
查看>>
什么?VMware Fusion 也能 docker run 了?
查看>>
教你玩转微服务的装逼指南!
查看>>
Envoy 中文指南系列:Sidecar 模式
查看>>
面试官邪魅一笑:你猜一个 TCP 重置报文的序列号是多少?
查看>>
Envoy 中文指南系列: 安装
查看>>
最华丽的 Kubernetes 桌面客户端:Lens
查看>>
太赞了,这个神器竟然能分分钟将多个 kubeconfig 合并成一个!
查看>>
如何解决容器中 nginx worker process 自动设置的问题
查看>>
ethtool 原理介绍和解决网卡丢包排查思路
查看>>
HPE 推出容器平台 Ezmeral,向 VMware 与 Red Hat 下战书
查看>>
使用 Prometheus-Operator 监控 Calico
查看>>
如果你不习惯新版的 Github 的 UI 界面,可以试试这款插件
查看>>
容器化囧途——没上容器时好好的?
查看>>