MyBatis 多表操作的实现

网友投稿 268 2022-11-23


MyBatis 多表操作的实现

1.1 一对一查询

1.1.1 概述

关系数据库中第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。

1.1.2 创建实体类

public class Student {

private Integer id;

private String name;

private Boolean age;

private String sex;

private StudentStatus studentStatus;

// set and get

}

public class StudentStatus {

private Integer id;

private String num;

private String major;

// set and get

}

1.1.3 创建 DAO 接口

public class StudentStatus {

private Integer id;

private String num;

private String major;

// set and get

}

1.1.4 结果映射

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码。resultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。之前已经使用过简单映射语句了,但并没有显式指定 resultMap。只是简单的使用 resultType 将所有的列映射到对象的属性上,需要注意的是列名与属性名一致才能映射,解决列名不匹配还是需要使用 resultMap。

MhUCIAx

select user_id, user_name, hashed_password from some_table where id = #{id}

1.1.5 配置 mapper

select * from student s, student_status st where s.st_id = st.st_id

上面这种配置会将自动将列名一致的映射到 type 指定的实体类中,该实体类中属性类型为对象的则需要单独拿出来映射。还可以使用 association 进行复杂的映射,我们发现未配置的属性无法进行映射。产生这个问题的原因是 resultMap 的自动映射未打开,使用 autoMapping 设置这个属性为 true/false,MyBatis 将会为本结果映射开启/关闭自动映射。

select * from student s, student_status st where s.st_id = st.st_id

select * from student s, student_status st where s.st_id = st.st_id

1.1.6 核心配置

1.1.7 测试

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/9/3

* @description 测试类

*/

public class MybatisDemo {

@Test

public void TestA() throws IOException {

// 加载核心配置文件

InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");

// 获得 sqlSession 工厂对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

// 获得 sqlSession 对象

SqlSession sqlSession = sqlSessionFactory.openSession();

List list = sqlSession.selectList("com.software.mybatis.dao.StudentDao.findAll");

System.out.println(list);

}

}

1.2 一对多查询

1.2.1 概述

一对多关系是关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。

1.2.2 创建实体类

public class Student {

private Integer sId;

private String sName;

private Long sAge;

private String sSex;

private Integer cId;

// set and get

}

public class Class {

private Integer cId;

private String cName;

private String cAddr;

private List students;

// set and get

}

1.1.3 创建 DAO 接口

/**

* Created withttp://h IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/9/3

* @description DAO 接口

*/

public interface ClassDao {

public List findAll();

}

1.1.4 配置 mapper

select * from student s, class c where s.c_id = c.c_id

1.1.5 测试

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/9/3

* @description 测试类

*/

public class MybatisDemo {

@Test

public void TestA() throws IOException {

// 加载核心配置文件

InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");

// 获得 sqlSession 工厂对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream)MhUCIAx;

// 获得 sqlSession 对象

SqlSession sqlSession = sqlSessionFactory.openSession();

List list = sqlSession.selectList("com.software.mybatis.dao.ClassDao.findAll");

for (Class aClass : list) {

System.out.println(aClass);

}

}

}

1.3 多对多查询

1.3.1 概述

多对多关系是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。该关系一般会借助第三方表实现。

1.3.2 创建实体类

public class Course {

private Integer cId;

private String cName;

private List students;

// set and get

}

public class Student {

private Integer sId;

private String sName;

private Long sAge;

private String sSex;

private List courses;

// set and get

}

1.3.3 创建 DAO 接口

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/9/3

* @description course DAO 接口

*/

public interface CourseDao {

public List findAll();

}

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/9/3

* @description student DAO 接口

*/

public interface StudentDao {

public List findAll();

}

1.3.4 配置 mapper

☞ student-mapper.xml

select * from course c, student s, s_c sc where c.c_id = sc.c_id and s.s_id = sc.s_id

☞ course-mapper.xml

select * from course c, student s, s_c sc where c.c_id = sc.c_id and s.s_id = sc.s_id

1.3.5 测试

/**

* Created with IntelliJ IDEA.

*

* @author Demo_Null

* @date 2020/9/3

* @description 测试类

*/

public class MybatisDemo {

@Test

public void TestA() throws IOException {

// 加载核心配置文件

InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");

// 获得 sqlSession 工厂对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

// 获得 sqlSession 对象

SqlSession sqlSession = sqlSessionFactory.openSession();

List courseList = sqlSession.selectList("com.software.mybatis.dao.CourseDao.findAll");

List studentList = sqlSession.selectList("com.software.mybatis.dao.StudentDao.findAll");

System.out.println("### 课程 ###");

for (Course course : courseList) {

System.out.println(course);

}

System.out.println("### 学生 ###");

for (Student student : studentList) {

System.out.println(student);

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IDEA Ultimate2020.2版本配置Tomcat详细教程
下一篇:IntelliJ IDEA中Scala、sbt、maven配置教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~