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

目录

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=大学一年级]]

多对多

 

 

  • 21
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MyBatis提供了一种简便的方式来实现一对多级联查询。在这种情况下,一个实体类中包含了多个子实体类的集合,这些子实体类与该实体类是一对多的关系。 下面是一对多级联查询的示例: 1. 首先,我们创建以下两个实体类: Order.java ```java public class Order { private int id; private String code; private List<OrderItem> items; // 省略getter和setter方法 } ``` OrderItem.java ```java public class OrderItem { private int id; private int orderId; private String product; private int quantity; // 省略getter和setter方法 } ``` 2. 接下来,我们需要创建一个映射文件来进行一对多级联查询。在这个映射文件中,我们需要使用`<collection>`标签来定义一个集合属性,用来存储子实体类的列表。 OrderMapper.xml ```xml <mapper namespace="com.example.OrderMapper"> <resultMap id="orderMap" type="com.example.Order"> <id property="id" column="id"/> <result property="code" column="code"/> <collection property="items" ofType="com.example.OrderItem"> <id property="id" column="item_id"/> <result property="product" column="product"/> <result property="quantity" column="quantity"/> </collection> </resultMap> <select id="getOrders" resultMap="orderMap"> SELECT o.id, o.code, i.id as item_id, i.product, i.quantity FROM orders o LEFT JOIN order_items i ON o.id = i.order_id ORDER BY o.id </select> </mapper> ``` 在这个映射文件中,我们使用了`<resultMap>`标签来定义一个结果集映射,它包含了一个`<collection>`标签来定义子实体类的集合属性。在查询语句中,我们使用了`LEFT JOIN`来将订单和订单项关联起来,并使用`ORDER BY`子句来按订单ID排序。 3. 最后,我们需要创建一个接口来调用映射文件中的查询方法。 OrderMapper.java ```java public interface OrderMapper { List<Order> getOrders(); } ``` 现在,我们可以使用这个接口来查询订单和订单项的信息,如下所示: ```java SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = factory.openSession(); OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orders = orderMapper.getOrders(); for (Order order : orders) { System.out.println(order.getCode()); for (OrderItem item : order.getItems()) { System.out.println("\t" + item.getProduct() + " x" + item.getQuantity()); } } ``` 这个示例中,我们首先创建了一个`SqlSessionFactory`对象,然后使用它来创建一个`SqlSession`对象。接下来,我们使用`getMapper()`方法来获取一个`OrderMapper`接口的实现类。最后,我们调用查询方法来获取订单和订单项的信息,并遍历结果集来输出这些信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值