级联 association 一对一, 一对多 collection,多对多 discrimination

本文详细介绍了MyBatis框架中的一对一、一对多和多对多关联映射的实现方式,包括不同级别的级联操作和具体的SQL语句示例,探讨了如何在实体类中使用association和collection标签进行关联映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

association 一对一, 一对多  collection,多对多 discrimination

assiociation(一对一)

实现方式一:

实现方式二(association方式一):

实现方式三(association方式二):

实现方式四(association方式三):

一对多collection

多对多


association 一对一, 一对多  collection,多对多 discrimination

assiociation(一对一)

级联操作的数据库表数据

/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.1.49-community : Database - db_mybatis
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `db_mybatis`;

/*Table structure for table `t_address` */

DROP TABLE IF EXISTS `t_address`;

CREATE TABLE `t_address` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sheng` varchar(20) DEFAULT NULL,
  `shi` varchar(20) DEFAULT NULL,
  `qu` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `t_address` */

insert  into `t_address`(`id`,`sheng`,`shi`,`qu`) values 
(1,'江苏省','苏州市','姑苏区'),
(2,'江苏省','南京市','鼓楼区');

/*Table structure for table `t_student` */

DROP TABLE IF EXISTS `t_student`;

CREATE TABLE `t_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `addressId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

/*Data for the table `t_student` */

insert  into `t_student`(`id`,`name`,`age`,`addressId`) values 
(1,'张一',10,1),
(2,'张二',11,2),
(3,'张三',11,2),
(4,'张四',11,2),
(5,'张五',11,2),
(6,'张六',11,2),
(7,'张七',11,2)

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

 

实现方式一:

<resultMap type="Student" id="StudentResult">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="age" column="age"/>
	
	<result property="address.id" column="addressId"/>
	<result property="address.sheng" column="sheng"/>
	<result property="address.shi" column="shi"/>
	<result property="address.qu" column="qu"/>
</resultMap>

说明

property="address.id" column="addressId"/>

为什么是address 因为student 类中的属性是address

<select id="findStudentWithAddress" resultMap="StudentResult" parameterType="Integer">
        select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=#{id}
</select>
@Test
	public void testFindStudentWithAddress() {
		logger.info("查询学生(带地址)");
		Student student=studentMapper.findStudentWithAddress(2);
		System.out.println(student);
	}

sqlSession 不用close 的原因是

@After
	public void tearDown() throws Exception {
		sqlSession.close();
	}

可以看日志为

  2018-06-28 15:37:45,792 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带地址)
  2018-06-28 15:37:46,237 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==>  Preparing: select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=? 
  2018-06-28 15:37:46,287 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==> Parameters: 2(Integer)
  2018-06-28 15:37:46,323 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-28 15:37:46,323 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 2(Integer)
  2018-06-28 15:37:46,324 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-28 15:37:46,324 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - <==      Total: 1
  Student [id=2, name=李四, age=11, address=Address [id=2, sheng=江苏省, shi=南京市, qu=鼓楼区]]

总结:这种方式采用的是对象方式的级联操作不太好,因为每一次查询都要把所有的属性列在那里,并且修改的时候要全部修改,所以很不方便,尽量是模块话

实现方式二(association方式一):

<resultMap type="Address" id="AddressResult">
		<result property="id" column="id"/>
		<result property="sheng" column="sheng"/>
		<result property="shi" column="shi"/>
		<result property="qu" column="qu"/>
	</resultMap>
	
	<resultMap type="Student" id="StudentResult">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
		<association property="address" resultMap="AddressResult"/>
	</resultMap>

日志为:

2018-06-28 15:53:09,925 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带地址)
  2018-06-28 15:53:10,065 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==>  Preparing: select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=? 
  2018-06-28 15:53:10,095 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==> Parameters: 2(Integer)
  2018-06-28 15:53:10,113 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - <==      Total: 1
  Student [id=2, name=李四, age=11, address=Address [id=2, sheng=江苏省, shi=南京市, qu=鼓楼区]]

 

实现方式三(association方式二):

<resultMap type="Student" id="StudentResult">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
		<association property="address" javaType="Address">
			<result property="id" column="id"/>
			<result property="sheng" column="sheng"/>
			<result property="shi" column="shi"/>
			<result property="qu" column="qu"/>
		</association>
	</resultMap>

日志为:

2018-06-28 15:53:09,925 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带地址)
  2018-06-28 15:53:10,065 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==>  Preparing: select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=? 
  2018-06-28 15:53:10,095 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==> Parameters: 2(Integer)
  2018-06-28 15:53:10,113 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - <==      Total: 1
  Student [id=2, name=李四, age=11, address=Address [id=2, sheng=江苏省, shi=南京市, qu=鼓楼

实现方式四(association方式三):

只需要有这个一个方法就可以了,因为在student的表中有一个Address 的外键

<resultMap type="Student" id="StudentResult">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
		<association property="address" column="addressId" select="com.java1234.mappers.AddressMapper.findById"></association>
	</resultMap>
<association property="address" 

 

为什么是address 因为student 类中的属性是address

 

column ="id"

 

<select id="findStudentWithAddress" resultMap="StudentResult" parameterType="Integer">
		select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=#{id}
</select>
2018-06-28 16:15:36,130 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带地址)
  2018-06-28 16:15:36,263 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==>  Preparing: select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=? 
  2018-06-28 16:15:36,292 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - ==> Parameters: 1(Integer)
  2018-06-28 16:15:36,310 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-28 16:15:36,310 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-28 16:15:36,311 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-28 16:15:36,311 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithAddress] - <==      Total: 1
  Student [id=1, name=张三, age=10, address=Address [id=1, sheng=江苏省, shi=苏州市, qu=姑苏区]]

 

如果把下面的

<select id="findById" parameterType="Integer" resultType="Student">
		select * from t_student where id=#{id}
	</select>
	

改为

<select id="findById" parameterType="Integer" resultMap="StudentResult">
		select * from t_student where id=#{id}
</select>

studentResult为

 

<resultMap type="Student" id="StudentResult">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
		<association property="address" column="addressId" select="com.java1234.mappers.AddressMapper.findById"></association>
	</resultMap>

 

column="addressId" 一定要的用的外键

日志为

2018-06-28 16:17:10,904 [main] INFO  [com.java1234.service.StudentTest] - 通过ID查找学生
  2018-06-28 16:17:11,030 [main] DEBUG [com.java1234.mappers.StudentMapper.findById] - ==>  Preparing: select * from t_student where id=? 
  2018-06-28 16:17:11,064 [main] DEBUG [com.java1234.mappers.StudentMapper.findById] - ==> Parameters: 1(Integer)
  2018-06-28 16:17:11,081 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-28 16:17:11,082 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-28 16:17:11,082 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-28 16:17:11,082 [main] DEBUG [com.java1234.mappers.StudentMapper.findById] - <==      Total: 1
  Student [id=1, name=张三, age=10, address=Address [id=1, sheng=江苏省, shi=苏州市, qu=姑苏区]]

最后的这种方式是最方便的,通常开发一直在用。

 

一对多collection

首先修改数据库

/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.1.49-community : Database - db_mybatis
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `db_mybatis`;

/*Table structure for table `t_address` */

DROP TABLE IF EXISTS `t_address`;

CREATE TABLE `t_address` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sheng` varchar(20) DEFAULT NULL,
  `shi` varchar(20) DEFAULT NULL,
  `qu` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `t_address` */

insert  into `t_address`(`id`,`sheng`,`shi`,`qu`) values (1,'江苏省','苏州市','姑苏区'),(2,'江苏省','南京市','鼓楼区');

/*Table structure for table `t_grade` */

DROP TABLE IF EXISTS `t_grade`;

CREATE TABLE `t_grade` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gradeName` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `t_grade` */

insert  into `t_grade`(`id`,`gradeName`) values (1,'大学一年级'),(2,'大学二年级');

/*Table structure for table `t_student` */

DROP TABLE IF EXISTS `t_student`;

CREATE TABLE `t_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `addressId` int(11) DEFAULT NULL,
  `gradeId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_t_student` (`gradeId`),
  KEY `FK_t_student2` (`addressId`),
  CONSTRAINT `FK_t_student2` FOREIGN KEY (`addressId`) REFERENCES `t_address` (`id`),
  CONSTRAINT `FK_t_student` FOREIGN KEY (`gradeId`) REFERENCES `t_grade` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

/*Data for the table `t_student` */

insert  into `t_student`(`id`,`name`,`age`,`addressId`,`gradeId`) values (1,'张三',10,1,1),(2,'李四',11,2,2),(3,'王五',12,2,2);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;


 

首先介绍表中的内容

 

首先从测试的角度去看

@Test
public void testFindGradeWithStudents() {
	logger.info("查询年级(带学生)");
	Grade grade=gradeMapper.findById(1);
	System.out.println(grade);
}
gradeMapper.findById(1);

<mapper namespace="com.java1234.mappers.GradeMapper">

	<resultMap type="Grade" id="GradeResult">
		<result property="id" column="id"/>
		<result property="gradeName" column="gradeName"/>
		<collection property="students" column="id" select="com.java1234.mappers.StudentMapper.findByGradeId"></collection>
	</resultMap>
	
	<select id="findById" parameterType="Integer" resultMap="GradeResult">
		select * from t_grade where id=#{id}
	</select>

</mapper> 
<collection property="students" column="id" select="com.java1234.mappers.StudentMapper.findByGradeId"></collection>
1 property="students" property 一定是实体类中的属性

 

 

2 column="id" select="com.java1234.mappers.StudentMapper.findByGradeId">

<resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="address" column="addressId" select="com.java1234.mappers.AddressMapper.findById"></association>
        <association property="grade" column="gradeId" select="com.java1234.mappers.GradeMapper.findById"></association>
    </resultMap>
column="addressId" column="gradeId" 一定是student 表的外键(一对一就是外键)

 

<select id="findByGradeId" resultMap="StudentResult" parameterType="Integer">
        select * from t_student where gradeId=#{gradeId}
    </select>

 

3 <collection property="students" column="id" select="com.java1234.mappers.StudentMapper.findByGradeId"></collection>
column="id" 一定是grade 表当中的主键,一对多一定是主键

 

@Test
	public void testFindGradeWithStudents() {
		logger.info("查询年级(带学生)");
		Grade grade=gradeMapper.findById(1);
		System.out.println(grade);
	}

日志情况

  2018-06-29 13:44:43,514 [main] INFO  [com.java1234.service.StudentTest] - 查询年级(带学生)
  2018-06-29 13:44:43,916 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ==>  Preparing: select * from t_grade where id=? 
  2018-06-29 13:44:44,041 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ==> Parameters: 1(Integer)
  2018-06-29 13:44:44,102 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ====>  Preparing: select * from t_student where gradeId=? 
  2018-06-29 13:44:44,102 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ====> Parameters: 1(Integer)
  2018-06-29 13:44:44,124 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ======>  Preparing: select * from t_address where id=? 
  2018-06-29 13:44:44,126 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ======> Parameters: 1(Integer)
  2018-06-29 13:44:44,127 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <======      Total: 1
  2018-06-29 13:44:44,128 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - <====      Total: 1
  2018-06-29 13:44:44,128 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - <==      Total: 1
  Preparing: select * from t_grade where id=? 
  2018-06-29 13:44:44,041 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ==> Parameters: 1(Integer)
  2018-06-29 13:44:44,102 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ====>  Preparing: select * from t_student where gradeId=? 
  2018-06-29 13:44:44,102 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ====> Parameters: 1(Integer)
  2018-06-29 13:44:44,124 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ======>  Preparing: select * from t_address where id=? 
  2018-06-29 13:44:44,126 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ======> Parameters: 1(Integer)
  2018-06-29 13:44:44,127 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <======      Total: 1
  2018-06-29 13:44:44,128 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - <====      Total: 1
  2018-06-29 13:44:44,128 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - <==      Total: 1
  
@Test
    public void testFindStudentWithGrade(){
        logger.info("查询学生(带年级)");
        Student student=studentMapper.findStudentWithGrade(1);
        System.out.println(student);
    }

<resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <association property="address" column="addressId" select="com.java1234.mappers.AddressMapper.findById"></association>
        <association property="grade" column="gradeId" select="com.java1234.mappers.GradeMapper.findById"></association>
    </resultMap>

保证外键齐全就可以了,随便关联,外键就是addressId ,gradeId

<select id="findStudentWithGrade" resultMap="StudentResult" parameterType="Integer">
        SELECT * FROM t_student t1 INNER JOIN t_address t2 ON t1.addressId = t2.id INNER JOIN t_grade t3 on t3.id = t1.gradeId WHERE t1.id=#{id}
    </select>

日志

2018-06-29 14:01:01,036 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带年级)
  2018-06-29 14:01:01,159 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==>  Preparing: SELECT * FROM t_student t1 INNER JOIN t_address t2 ON t1.addressId = t2.id INNER JOIN t_grade t3 on t3.id = t1.gradeId WHERE t1.id=? 
  2018-06-29 14:01:01,192 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==> Parameters: 1(Integer)
  2018-06-29 14:01:01,209 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-29 14:01:01,210 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:01:01,210 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-29 14:01:01,211 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====>  Preparing: select * from t_grade where id=? 
  2018-06-29 14:01:01,211 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:01:01,212 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======>  Preparing: select * from t_student where gradeId=? 
  2018-06-29 14:01:01,212 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======> Parameters: 1(Integer)
  2018-06-29 14:01:01,214 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - <======      Total: 1
  2018-06-29 14:01:01,214 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - <====      Total: 1
  

堆内存溢出的原因一定是对象的大小撑爆了

原因是我们在打印grade 的tostring 方法中打印学生,学生的tostring 方法又打印grade 陷入了死循环,只能是留一个

 

当留下的是student 中的tostring 方法,把grade 中的tostring 方法注释掉了。

 

2018-06-29 14:22:56,599 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带年级)
  2018-06-29 14:22:56,721 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==>  Preparing: SELECT * FROM t_student t1 INNER JOIN t_address t2 ON t1.addressId = t2.id INNER JOIN t_grade t3 on t3.id = t1.gradeId WHERE t1.id=? 
  2018-06-29 14:22:56,751 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==> Parameters: 1(Integer)
  2018-06-29 14:22:56,768 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-29 14:22:56,769 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:22:56,769 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-29 14:22:56,770 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====>  Preparing: select * from t_grade where id=? 
  2018-06-29 14:22:56,770 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:22:56,771 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======>  Preparing: select * from t_student where gradeId=? 
  2018-06-29 14:22:56,771 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======> Parameters: 1(Integer)
  2018-06-29 14:22:56,772 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - <======      Total: 1
  2018-06-29 14:22:56,773 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - <====      Total: 1
  2018-06-29 14:22:56,773 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - <==      Total: 1
  2018-06-29 14:22:56,773 [main] INFO  [com.java1234.service.StudentTest] - Student [id=1, name=张三, age=10, address=Address [id=1, sheng=江苏省, shi=苏州市, qu=姑苏区], grade=com.java1234.model.Grade@7611dbed]
  Student [id=1, name=张三, age=10, address=Address [id=1, sheng=江苏省, shi=苏州市, qu=姑苏区], grade=com.java1234.model.Grade@7611dbed]
grade=com.java1234.model.Grade@7611dbed 显示的就不是完整的

反过来注释的是student 中的tostring 方法

2018-06-29 14:24:52,429 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带年级)
  2018-06-29 14:24:52,552 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==>  Preparing: SELECT * FROM t_student t1 INNER JOIN t_address t2 ON t1.addressId = t2.id INNER JOIN t_grade t3 on t3.id = t1.gradeId WHERE t1.id=? 
  2018-06-29 14:24:52,583 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==> Parameters: 1(Integer)
  2018-06-29 14:24:52,598 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-29 14:24:52,599 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:24:52,600 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-29 14:24:52,600 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====>  Preparing: select * from t_grade where id=? 
  2018-06-29 14:24:52,600 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:24:52,601 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======>  Preparing: select * from t_student where gradeId=? 
  2018-06-29 14:24:52,601 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======> Parameters: 1(Integer)
  2018-06-29 14:24:52,603 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - <======      Total: 1
  2018-06-29 14:24:52,603 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - <====      Total: 1
  2018-06-29 14:24:52,603 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - <==      Total: 1
  2018-06-29 14:24:52,603 [main] INFO  [com.java1234.service.StudentTest] - com.java1234.model.Student@5f52f873
  com.java1234.model.Student@5f52f873
  com.java1234.model.Student@5f52f873 student 就显示不出来了

 

要想全部打印的话,在grade当中就不要打印学生了

 

@Override
	public String toString() {
		return "Grade [id=" + id + ", gradeName=" + gradeName + "]";
	}
   	
@Test
	public void testFindStudentWithGrade(){
		logger.info("查询学生(带年级)");
		Student student=studentMapper.findStudentWithGrade(1);
		logger.info(student);
		System.out.println(student);
	}
2018-06-29 14:29:13,795 [main] INFO  [com.java1234.service.StudentTest] - 查询学生(带年级)
  2018-06-29 14:29:13,913 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==>  Preparing: SELECT * FROM t_student t1 INNER JOIN t_address t2 ON t1.addressId = t2.id INNER JOIN t_grade t3 on t3.id = t1.gradeId WHERE t1.id=? 
  2018-06-29 14:29:13,945 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - ==> Parameters: 1(Integer)
  2018-06-29 14:29:13,962 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====>  Preparing: select * from t_address where id=? 
  2018-06-29 14:29:13,962 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:29:13,963 [main] DEBUG [com.java1234.mappers.AddressMapper.findById] - <====      Total: 1
  2018-06-29 14:29:13,963 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====>  Preparing: select * from t_grade where id=? 
  2018-06-29 14:29:13,964 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - ====> Parameters: 1(Integer)
  2018-06-29 14:29:13,964 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======>  Preparing: select * from t_student where gradeId=? 
  2018-06-29 14:29:13,964 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - ======> Parameters: 1(Integer)
  2018-06-29 14:29:13,966 [main] DEBUG [com.java1234.mappers.StudentMapper.findByGradeId] - <======      Total: 1
  2018-06-29 14:29:13,966 [main] DEBUG [com.java1234.mappers.GradeMapper.findById] - <====      Total: 1
  2018-06-29 14:29:13,966 [main] DEBUG [com.java1234.mappers.StudentMapper.findStudentWithGrade] - <==      Total: 1
  2018-06-29 14:29:13,966 [main] INFO  [com.java1234.service.StudentTest] - Student [id=1, name=张三, age=10, address=Address [id=1, sheng=江苏省, shi=苏州市, qu=姑苏区], grade=Grade [id=1, gradeName=大学一年级]]
  Student [id=1, name=张三, age=10, address=Address [id=1, sheng=江苏省, shi=苏州市, qu=姑苏区], grade=Grade [id=1, gradeName=大学一年级]]

多对多

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值