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 + "]";
}
}
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
/**
* 查询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;
}
}
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
/**
* 查询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;
}
}
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文件
/**
* 查询某人选学了哪些课程
* @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还需对数据库的语句有一定的熟悉