MyBatis 一对一,一对多,多对一,多对多详解

目录

1、什么是MyBatis?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

2、MyBatis 入门实例基于xml配置

①、创建MySQL数据库:mybatisDemo和表:person

create database mybatisDemo;``use mybatisDemo;``create table person(pid ``int` `primary key AUTO_INCREMENT, pname varchar(``50``), page ``int``);

img

②、建立一个Java工程,并导入相应的jar包

img

相应的 jar 包下载链接:http://pan.baidu.com/s/1skZM09Z 密码:nkt6

③、在 MyBatisDemo 工程中添加数据库配置文件 mybatis-configuration.xml

<?xml version=``"1.0"` `encoding=``"UTF-8"``?>``<!DOCTYPE configuration PUBLIC ``"-//mybatis.org//DTD Config 3.0//EN"` `"http://mybatis.org/dtd/mybatis-3-config.dtd"``>``<configuration>``<!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境 `` ``一、development:开发模式``  ``二、work:工作模式-->`` ``<environments ``default``=``"development"``>`` ``<!--id属性必须和上面的``default``一样 -->``  ``<environment id=``"development"``>``  ``<!--事务管理器``    ``一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围``    ``二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期``      ``比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,``      ``因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 ``false``,比如:``      ``<transactionManager type=``"MANAGED"``>``        ``<property name=``"closeConnection"` `value=``"false"``/>``      ``</transactionManager>``   ``-->``   ``<transactionManager type=``"JDBC"``/>``   ``<!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源 -->``   ``<dataSource type=``"POOLED"``>``    ``<property name=``"driver"` `value=``"com.mysql.jdbc.Driver"``/>``    ``<property name=``"url"` `value=``"jdbc:mysql://localhost:3306/mybatisdemo"``/>``    ``<property name=``"username"` `value=``"root"``/>``    ``<property name=``"password"` `value=``"root"``/>``   ``</dataSource>``  ``</environment>`` ``</environments>``</configuration>

④、定义表所对应的实体类

img

package` `com.ys.bean;` `public` `class` `Person {``  ``private` `int` `pid;``  ``private` `String pname;``  ``private` `int` `page;``  ` `  ``public` `int` `getPid() {``    ``return` `pid;``  ``}``  ``public` `void` `setPid(``int` `pid) {``    ``this``.pid = pid;``  ``}``  ``public` `String getPname() {``    ``return` `pname;``  ``}``  ``public` `void` `setPname(String pname) {``    ``this``.pname = pname;``  ``}``  ``public` `int` `getPage() {``    ``return` `page;``  ``}``  ``public` `void` `setPage(``int` `page) {``    ``this``.page = page;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"Person [pid="` `+ pid + ``", pname="` `+ pname + ``", page="` `+ page``        ``+ ``"]"``;``  ``}``}

⑤、定义操作 person 表的sql映射文件personMapper.xml

<?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.ys.bean.personMapper"``>`` ``<!-- 根据 pid 查询 person 表中的数据``    ``id:唯一标识符,此文件中的id值不能重复``    ``resultType:返回值类型,一条数据库记录也就对应实体类的一个对象``    ``parameterType:参数类型,也就是查询条件的类型``  ``-->`` ``<select id=``"selectPersonById"``      ``resultType=``"com.ys.bean.Person"` `parameterType=``"int"``>``  ``<!-- 这里和普通的sql 查询语句差不多,对于只有一个查询条件后面的 #{pid}表示占位符,里面不一定要写pid,写啥都可以,但是不要空着;如果有多个查询条件,则要写pojo类里面的属性 -->``  ``select * from person where pid = #{pid}`` ``</select>`` ` ` ``<!-- 查询person 表所有数据 -->`` ``<select id=``"getAllPerson"` `resultType=``"com.ys.bean.Person"``>``  ``select * from person`` ``</select>`` ` ` ``<!-- 根据id更新数据 -->`` ``<update id=``"updatePersonById"` `parameterType=``"com.ys.bean.Person"``>``  ``update person set pname=#{pname},page=#{page} where pid = #{pid}`` ``</update>`` ` ` ``<!-- 向 person 表插入一条数据 -->`` ``<insert id=``"addPerson"` `parameterType=``"com.ys.bean.Person"``>``  ``insert into person(pid,pname,page) values(#{pid},#{pname},#{page})`` ``</insert>`` ` ` ``<!-- 根据 pid 删除数据 -->`` ``<delete id=``"deletePersonById"` `parameterType=``"Long"``>``  ``delete from person where pid=#{pid}`` ``</delete>`` ` `</mapper>

⑥**、向 mybatis-configuration.xml 配置文件中注册 personMapper.xml 文件**

<mappers>``    ``<!-- 注册personMapper.xml文件,``    ``personMapper.xml位于com.ys.bean这个包下,所以resource写成com/ys/bean/personMapper.xml-->``    ``<mapper resource=``"com/ys/bean/personMapper.xml"``/>``</mappers>

如下图所示:

img

⑦、创建测试类

package` `com.ys.test;` `import` `java.io.InputStream;``import` `java.util.List;` `import` `org.apache.ibatis.session.SqlSession;``import` `org.apache.ibatis.session.SqlSessionFactory;``import` `org.apache.ibatis.session.SqlSessionFactoryBuilder;``import` `org.junit.Before;``import` `org.junit.Test;` `import` `com.ys.bean.Person;` `public` `class` `MyBatisTest {``  ``SqlSession session;``  ` `  ``@Before``  ``public` `void` `beforeLoadXML(){``    ``//加载 mybatis 配置文件``    ``InputStream inputStream = MyBatisTest.``class``.``        ``getClassLoader().getResourceAsStream(``"mybatis-configuration.xml"``);``    ``//构建sqlSession的工厂``    ``SqlSessionFactory sqlSessionFactory =``        ``new` `SqlSessionFactoryBuilder().build(inputStream);``    ``//根据 sqlSessionFactory 产生 session``    ``session = sqlSessionFactory.openSession();``  ``}``  ` `  ``//根据 pid 查询 person 表中的数据``  ``@Test``  ``public` `void` `testSelectById(){``    ``//这个字符串有 personMapper.xml 文件中 两个部分构成``    ``//<mapper namespace="com.ys.bean.personMapper"> 的 namespace 的值``    ``//<select id="selectPersonById" > id 值``    ``String statement = ``"com.ys.bean.personMapper"``+``".selectPersonById"``;``    ``Person p = session.selectOne(statement, ``1``);``    ``System.out.println(p);``    ``session.close();``  ``}``  ` `  ``//查询person 表所有数据``  ``@Test``  ``public` `void` `testGetAllPerson(){``    ``String statement = ``"com.ys.bean.personMapper.getAllPerson"``;``    ``List<Person> listPerson = session.selectList(statement);``    ``System.out.println(listPerson);``    ``session.close();``  ``}``  ` `  ``//根据id更新数据``  ``@Test``  ``public` `void` `updateById(){``    ``String statement = ``"com.ys.bean.personMapper.updatePersonById"``;``    ``Person p = ``new` `Person();``    ``p.setPid(``1``);``    ``p.setPname(``"aaa"``);``    ``p.setPage(``11``);``    ``session.update(statement, p);``    ``session.commit();``    ``session.close();``  ``}``  ` `  ``//向 person 表插入一条数据``  ``@Test``  ``public` `void` `addPerson(){``    ``String statement = ``"com.ys.bean.personMapper.addPerson"``;``    ``Person p = ``new` `Person();``    ``//由于我们设置了主键的自增长机制,故这里不需要手动设置 pid 的值``    ``//p.setPid(1);``    ``p.setPname(``"add"``);``    ``p.setPage(``11``);``    ``session.insert(statement, p);``    ``session.commit();``    ``session.close();``  ``}``  ` `  ``//根据 pid 删除person 表中的数据``  ``@Test``  ``public` `void` `deletePersonById(){``    ``String statement = ``"com.ys.bean.personMapper.deletePersonById"``;``    ``session.delete(statement, ``1``);``    ``session.commit();``    ``session.close();``    ` `  ``}``  ` `}

3、MyBatis 入门实例注解配置

①、上面的前面四步都是一样的,但是第五步不一样,我们不需要创建 personMapper.xml 文件,首先在 src 目录下创建 personMapper.java 文件

img

内容如下:

package` `com.ys.annocation;` `import` `org.apache.ibatis.annotations.Delete;``import` `org.apache.ibatis.annotations.Insert;``import` `org.apache.ibatis.annotations.Select;``import` `org.apache.ibatis.annotations.Update;` `import` `com.ys.bean.Person;` `public` `interface` `PersonMapper {``  ` `  ``@Insert``(``"insert into person(pid,pname,page) values(#{pid},#{pname},#{page})"``)``  ``public` `int` `add(Person person);``  ` `  ``@Select``(``"select * from person where pid = #{pid}"``)``  ``public` `Person getPerson(``int` `pid);``  ` `  ``@Update``(``"update person set pname=#{pname},page=#{page} where pid = #{pid}"``)``  ``public` `int` `updatePerson(Person preson);``  ` `  ``@Delete``(``"delete from person where pid=#{pid}"``)``  ``public` `int` `deletePerson(``int` `pid);` `}

②、向 mybatis-configuration.xml 配置文件中注册 personMapper.xml 文件

img

③、编写测试类

@Test``public` `void` `testAnnocation(){``  ``PersonMapper mapper = session.getMapper(PersonMapper.``class``);``  ``Person p = ``new` `Person();``  ``p.setPid(``7``);``  ``p.setPname(``"abc"``);``  ``p.setPage(``11``);``  ``//调用增加方法``  ``mapper.add(p);``  ``//调用查询方法``  ``Person p1 = mapper.getPerson(``3``);``  ``System.out.println(p1);``  ``//调用更新方法``  ``p.setPage(``100``);``  ``mapper.updatePerson(p);``  ``//调用删除方法``  ``mapper.deletePerson(``7``);``  ``session.commit();``  ``session.close();``}

4、MyBatis 入门实例 一对一 基于xml配置

这里我们以老师和班级为例,假设一般班级只能拥有有一个老师,一个老师只能带一个班级。

①、创建实体类

img

Teacher.java

package` `one.to.one;` `public` `class` `Teacher {``  ``private` `int` `tid;``  ``private` `String tname;``  ``private` `Classes classes;``  ` `  ``public` `int` `getTid() {``    ``return` `tid;``  ``}``  ``public` `void` `setTid(``int` `tid) {``    ``this``.tid = tid;``  ``}``  ``public` `String getTname() {``    ``return` `tname;``  ``}``  ``public` `void` `setTname(String tname) {``    ``this``.tname = tname;``  ``}``  ``public` `Classes getClasses() {``    ``return` `classes;``  ``}``  ``public` `void` `setClasses(Classes classes) {``    ``this``.classes = classes;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"Teacher [tid="` `+ tid + ``", tname="` `+ tname + ``", classes="` `+ classes + ``"]"``;``  ``}``  ` `  ` `}

Classes.java

package` `one.to.one;` `public` `class` `Classes {``  ``private` `int` `cid;``  ``private` `String cname;``  ``private` `Teacher teacher;``  ` `  ``public` `int` `getCid() {``    ``return` `cid;``  ``}``  ``public` `void` `setCid(``int` `cid) {``    ``this``.cid = cid;``  ``}``  ``public` `String getCname() {``    ``return` `cname;``  ``}``  ``public` `void` `setCname(String cname) {``    ``this``.cname = cname;``  ``}``  ``public` `Teacher getTeacher() {``    ``return` `teacher;``  ``}``  ``public` `void` `setTeacher(Teacher teacher) {``    ``this``.teacher = teacher;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"Classes [cid="` `+ cid + ``", cname="` `+ cname + ``", teacher="` `+ teacher + ``"]"``;``  ``}``  ` `}

②、在数据库中根据实体类创建相应的数据表

③、定义操作 Classes 表的sql映射文件classesMapper.xml

<?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=``"one.to.one.classesMapper"``>``  ``<!--``     ``方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集``         ``封装联表查询的数据(去除重复的数据)``     ``select * from classes c, teacher t where c.tid=t.tid and c.tid=#{tid}``   ``-->``  ``<select id=``"getClasses"` `resultMap=``"getClassesMap"` `parameterType=``"int"``>``    ``select * from classes c ,teacher t``      ``where c.tid=t.tid and c.tid=#{tid}``  ``</select>``  ``<resultMap type=``"one.to.one.Classes"` `id=``"getClassesMap"``>``    ``<id column=``"cid"` `property=``"cid"``/>``    ``<result column=``"cname"` `property=``"cname"``/>``    ``<association property=``"teacher"` `javaType=``"one.to.one.Teacher"``>``      ``<id column=``"tid"` `property=``"tid"``></id>``      ``<result column=``"tname"` `property=``"tname"``/>``    ``</association>``  ``</resultMap>``  ``<!--``     ``方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集``         ``封装联表查询的数据(去除重复的数据)``     ``select * from teacher t,classes c where t.cid = c.cid and t.cid=#{cid}``   ``-->``  ``<select id=``"getTeacher"` `resultMap=``"getTeacherMap"` `parameterType=``"int"``>``    ``select * from teacher t,classes c``      ``where t.cid = c.cid and t.cid=#{cid}``  ``</select>``  ``<resultMap type=``"one.to.one.Teacher"` `id=``"getTeacherMap"``>``    ``<id column=``"tid"` `property=``"tid"``/>``    ``<result column=``"tname"` `property=``"tname"``/>``    ``<association property=``"classes"` `javaType=``"one.to.one.Classes"``>``      ``<id column=``"cid"` `property=``"cid"``/>``      ``<result column=``"cname"` `property=``"cname"``/>``    ``</association>``  ``</resultMap>``  ` `  ` `  ``<!--``     ``方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型``     ``SELECT * FROM classes WHERE cid=``1``;``     ``SELECT * FROM teacher WHERE tid=``1`  `//1 是上一个查询得到的tid的值``     ``property:别名(属性名)  column:列名 -->``     ``<!-- 把teacher的字段设置进去 -->``  ``<select id=``"getClasses2"` `resultMap=``"getClassesMap2"``>``    ``select * from classes c where c.cid = #{cid}``  ``</select>``  ``<resultMap type=``"one.to.one.Classes"` `id=``"getClassesMap2"``>``    ``<id column=``"cid"` `property=``"cid"``/>``    ``<result column=``"cname"` `property=``"cname"``/>``    ``<collection property=``"teacher"` `column=``"tid"` `select=``"getTeacherCollection"``>``    ``</collection>``  ``</resultMap>``  ``<select id=``"getTeacherCollection"` `resultType=``"one.to.one.Teacher"``>``    ``select tid tid,tname tname from teacher where tid=#{tid}``  ``</select>`` ` `</mapper>

说明:我们这里一对一的关联操作,有两种方式:

1、使用嵌套结果映射来处理重复的联合结果的子集

2、通过执行另外一个SQL映射语句来返回预期的复杂类型

相关属性解释:

img

④、向 mybatis-configuration.xml 配置文件中注册 classesMapper.xml 文件

img

⑤、编写测试类

package` `one.to.one;` `import` `java.io.InputStream;` `import` `org.apache.ibatis.session.SqlSession;``import` `org.apache.ibatis.session.SqlSessionFactory;``import` `org.apache.ibatis.session.SqlSessionFactoryBuilder;``import` `org.junit.Before;``import` `org.junit.Test;` `import` `com.ys.test.MyBatisTest;` `public` `class` `OneToOneTest {``SqlSession session;``  ` `  ``@Before``  ``public` `void` `beforeLoadXML(){``    ``//加载 mybatis 配置文件``    ``InputStream inputStream = MyBatisTest.``class``.``        ``getClassLoader().getResourceAsStream(``"mybatis-configuration.xml"``);``    ``//构建sqlSession的工厂``    ``SqlSessionFactory sqlSessionFactory =``        ``new` `SqlSessionFactoryBuilder().build(inputStream);``    ``//根据 sqlSessionFactory 产生 session``    ``session = sqlSessionFactory.openSession();``  ``}``  ` `  ``//一对一嵌套结果方式:根据教师id查询班级信息``  ``@Test``  ``public` `void` `testGetClasses(){``    ``String statement = ``"one.to.one.classesMapper.getClasses"``;``    ``Classes c = session.selectOne(statement, ``1``);``    ``System.out.println(c);``  ``}``  ` `  ``//一对一嵌套结果方式:根据班级id查询教师信息``  ``@Test``  ``public` `void` `testGetTeacher(){``    ``String statement = ``"one.to.one.classesMapper.getTeacher"``;``    ``Teacher t = session.selectOne(statement, ``1``);``    ``System.out.println(t);``  ``}``  ` `  ``//一对一嵌套查询方式:根据教师id查询班级信息``  ``@Test``  ``public` `void` `testGetClasses2(){``    ``String statement = ``"one.to.one.classesMapper.getClasses2"``;``    ``Classes c = session.selectOne(statement, ``1``);``    ``System.out.println(c);``  ``}``  ` `  ` `}

4、MyBatis 入门实例 一对多,多对一 基于xml配置

这里我们以班级和学生为例,一个班级里面对应多个学生,这是一对多;反过来,多个学生对应一个班级,这是多对一

①、建立学生和班级的实体类

Student.java

package` `one.to.many;` `public` `class` `Student {``  ``private` `int` `sid;``  ``private` `String sname;``  ``private` `Classes classes;``  ``public` `int` `getSid() {``    ``return` `sid;``  ``}``  ``public` `void` `setSid(``int` `sid) {``    ``this``.sid = sid;``  ``}``  ``public` `String getSname() {``    ``return` `sname;``  ``}``  ``public` `void` `setSname(String sname) {``    ``this``.sname = sname;``  ``}``  ``public` `Classes getClasses() {``    ``return` `classes;``  ``}``  ``public` `void` `setClasses(Classes classes) {``    ``this``.classes = classes;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"Student [sid="` `+ sid + ``", sname="` `+ sname + ``", classes="` `+ classes + ``"]"``;``  ``}``  ` `}

Classes.java

package` `one.to.many;` `import` `java.util.Set;` `public` `class` `Classes {``  ``private` `int` `cid;``  ``private` `String cname;``  ``private` `Set<Student> students;``  ` `  ``public` `int` `getCid() {``    ``return` `cid;``  ``}``  ``public` `void` `setCid(``int` `cid) {``    ``this``.cid = cid;``  ``}``  ``public` `String getCname() {``    ``return` `cname;``  ``}``  ``public` `void` `setCname(String cname) {``    ``this``.cname = cname;``  ``}``  ``public` `Set<Student> getStudents() {``    ``return` `students;``  ``}``  ``public` `void` `setStudents(Set<Student> students) {``    ``this``.students = students;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"Classes [cid="` `+ cid + ``", cname="` `+ cname + ``", students="` `+ students + ``"]"``;``  ``}``}

②、在数据库中根据实体类创建相应的数据表

③、多对一:定义操作 Classes 表的sql映射文件classesMapper.xml

<?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=``"one.to.many.classesMapper"``>``  ``<select id=``"getClasses"` `resultMap=``"getClassesMap"``>``    ``select * from classes c,student s where s.cid=c.cid and c.cid=#{cid}``  ``</select>``  ``<resultMap type=``"one.to.many.Classes"` `id=``"getClassesMap"``>``    ``<id column=``"cid"` `property=``"cid"``></id>``    ``<result column=``"cname"` `property=``"cname"``/>``    ``<collection property=``"students"` `ofType=``"one.to.many.Student"``>``      ``<id column=``"sid"` `property=``"sid"``/>``      ``<result column=``"sname"` `property=``"sname"``/>``    ``</collection>``  ``</resultMap>``  ` `</mapper>

④、一对多:定义操作 Student 表的sql映射文件studentMapper.xml

<?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=``"many.to.one.studentMapper"``>``  ``<select id=``"getStudents"` `resultMap=``"getStudentMap"``>``    ``select * from classes c,student s where s.cid=c.cid and s.sid=#{sid}``  ``</select>``  ``<resultMap type=``"one.to.many.Student"` `id=``"getStudentMap"``>``    ``<id column=``"sid"` `property=``"sid"``></id>``    ``<result column=``"sname"` `property=``"sname"``/>``    ``<association property=``"classes"` `javaType=``"one.to.many.Classes"``>``      ``<id column=``"cid"` `property=``"cid"``/>``      ``<result column=``"cname"` `property=``"cname"``/>``    ``</association>``  ``</resultMap>``  ` `</mapper>

⑤、向 mybatis-configuration.xml 配置文件中注册 classesMapper.xml 、studentMapper.xml文件

⑥、编写测试类

package` `one.to.many;` `import` `java.io.InputStream;` `import` `org.apache.ibatis.session.SqlSession;``import` `org.apache.ibatis.session.SqlSessionFactory;``import` `org.apache.ibatis.session.SqlSessionFactoryBuilder;``import` `org.junit.Before;``import` `org.junit.Test;` `import` `com.ys.test.MyBatisTest;` `public` `class` `OneToManyTest {``SqlSession session;``  ` `  ``@Before``  ``public` `void` `beforeLoadXML(){``    ``//加载 mybatis 配置文件``    ``InputStream inputStream = MyBatisTest.``class``.``        ``getClassLoader().getResourceAsStream(``"mybatis-configuration.xml"``);``    ``//构建sqlSession的工厂``    ``SqlSessionFactory sqlSessionFactory =``        ``new` `SqlSessionFactoryBuilder().build(inputStream);``    ``//根据 sqlSessionFactory 产生 session``    ``session = sqlSessionFactory.openSession();``  ``}``  ` `  ``//一对多嵌套结果方式:根据班级id查询班级所有的学生信息``  ``@Test``  ``public` `void` `testGetClasses(){``    ``String statement = ``"one.to.many.classesMapper.getClasses"``;``    ``Classes c = session.selectOne(statement, ``1``);``    ``System.out.println(c);``    ``System.out.println(c.getStudents().size());``  ``}``  ` `  ` `  ``//多对一嵌套结果方式:根据学生id查询班级信息``  ``@Test``  ``public` `void` `testGetStudents(){``    ``String statement = ``"many.to.one.studentMapper.getStudents"``;``    ``Student s = session.selectOne(statement, ``1``);``    ``System.out.println(s);``    ``System.out.println(s.getClasses());``  ``}``  ` `  ` `}

5、MyBatis 入门实例 多对多 基于xml配置

这里我们以 users 表和 groups 表为例,一个 users 可能加入多个 groups,而一个 groups 可能包含多个 users,故构成 多对多 的关联

①、在数据库中建立相应的表

users 表

img

groups 表

img

两者之间的关联表users_groups表

img

②、建立对应的实体类

Users.java

package` `many.to.many;` `import` `java.util.Set;` `public` `class` `Users {``  ``private` `int` `uid;``  ``private` `String uname;``  ``private` `Set<Groups> groups;``  ``public` `int` `getUid() {``    ``return` `uid;``  ``}``  ``public` `void` `setUid(``int` `uid) {``    ``this``.uid = uid;``  ``}``  ``public` `String getUname() {``    ``return` `uname;``  ``}``  ``public` `void` `setUname(String uname) {``    ``this``.uname = uname;``  ``}``  ``public` `Set<Groups> getGroups() {``    ``return` `groups;``  ``}``  ``public` `void` `setGroups(Set<Groups> groups) {``    ``this``.groups = groups;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"User [uid="` `+ uid + ``", uname="` `+ uname + ``", groups="` `+ groups + ``"]"``;``  ``}``  ` `}

Groups.java

package` `many.to.many;` `import` `java.util.Set;` `public` `class` `Groups {``  ``private` `int` `gid;``  ``private` `String gname;``  ``private` `Set<Users> users;``  ``public` `int` `getGid() {``    ``return` `gid;``  ``}``  ``public` `void` `setGid(``int` `gid) {``    ``this``.gid = gid;``  ``}``  ``public` `String getGname() {``    ``return` `gname;``  ``}``  ``public` `void` `setGname(String gname) {``    ``this``.gname = gname;``  ``}``  ``public` `Set<Users> getUsers() {``    ``return` `users;``  ``}``  ``public` `void` `setUsers(Set<Users> users) {``    ``this``.users = users;``  ``}``  ``@Override``  ``public` `String toString() {``    ``return` `"Group [gid="` `+ gid + ``", gname="` `+ gname + ``", users="` `+ users + ``"]"``;``  ``}``  ` `}

Users_Groups.java

package` `many.to.many;` `public` `class` `Users_Groups {``  ``private` `Users user;``  ``private` `Groups group;``  ``public` `Users getUser() {``    ``return` `user;``  ``}``  ``public` `void` `setUser(Users user) {``    ``this``.user = user;``  ``}``  ``public` `Groups getGroup() {``    ``return` `group;``  ``}``  ``public` `void` `setGroup(Groups group) {``    ``this``.group = group;``  ``}` `}

③、多对多:定义操作 sql映射文件userMapper.xml

<?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=``"many.to.many.userMapper"``>``  ``<!-- 给一个用户 id,查看该用户下的所有用户组信息 -->``  ``<select id=``"getUsers"` `resultMap=``"getGroupMap"``>``    ``select g.gid,g.gname from users_groups ug,groups g``      ``where ug.group_id=g.gid and ug.user_id=#{uid}``  ``</select>``  ``<resultMap type=``"many.to.many.Groups"` `id=``"getGroupMap"``>``    ``<id column=``"gid"` `property=``"gid"``/>``    ``<result column=``"gname"` `property=``"gname"``/>``    ``<collection property=``"users"` `ofType=``"many.to.many.Users"``>``      ``<id column=``"uid"` `property=``"uid"``/>``    ``<result column=``"uname"` `property=``"uname"``/>``    ``</collection>``  ``</resultMap>``  ` `</mapper>

⑤、向 mybatis-configuration.xml 配置文件中注册 userMapper.xml文件

⑥、编写测试类

//多对多:根据根据用户 id 查询所有的用户组信息``  ``@Test``  ``public` `void` `testGetGroups(){``    ``String statement = ``"many.to.many.userMapper.getUsers"``;``    ``List<Groups> listGroup = session.selectList(statement,``1``);``    ``for``(Groups g : listGroup){``      ``System.out.println(g.toString());``    ``}``  ``}

资料推荐

最近又赶上跳槽的高峰期(招聘旺季),好多读者都问我要有没有最新面试题,找华为朋友整理一份内部资料《第6版:互联网大厂面试题》!

整个资料包,包括 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL、大数据、Nginx、Git、Docker、GitHub、Servlet、JavaWeb、IDEA、Redis、算法、面试题等几乎覆盖了 Java 基础和阿里巴巴等大厂面试题等、等技术栈!

img

原文地址:https://blog.csdn.net/xk520134/article/details/121520364

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.pom.xml引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper&lt;/artifactId&gt; &lt;version&gt;5
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;!DOCTYPE configuration PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot; &qu
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&amp;插件 &lt;!-- 控制Mave
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&amp;数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 &lt;!-- MyBatis-EHCache整合包 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.cac
MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 &lt;if&gt;、&lt;choose&gt;、&lt;when&gt;、&lt;otherwise&gt;、&lt;foreach&gt;等标签实现。 查询场景 /** * 根据条件查询员工
本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...