目录
association 一对一, 一对多 collection,多对多 discrimination
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=大学一年级]]
多对多