Mybatis一对多

0.前期准备

数据库配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE TABLE tb_clazz
(
id INT AUTO_INCREMENT
PRIMARY KEY,
CODE VARCHAR(18) NULL,
name VARCHAR(18) NULL,
CONSTRAINT TB_CLAZZ_id_uindex
UNIQUE (id)
)
CREATE TABLE tb_student
(
id INT AUTO_INCREMENT
PRIMARY KEY,
NAME VARCHAR(18) NULL,
sex CHAR(3) NULL,
age INT NULL,
clazz_id INT NULL,
CONSTRAINT TB_STUDENT_id_uindex
UNIQUE (id),
CONSTRAINT TB_STUDENT_tb_clazz_id_fk
FOREIGN KEY (clazz_id) REFERENCES tb_clazz (id)
)

CREATE INDEX TB_STUDENT_tb_clazz_id_fk
ON tb_student (clazz_id);

一个clazz对应多个student。

log4j.properties需要进行配置:

1
2
3
4
5
6
7
log4j.rootLogger=ERROR, stdout

#log4j.logger.org.fkit.mapper.UserMapper=DEBUG
log4j.logger.org.fkit.mapper=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在mybatis-config.xml中配置一下mapper和懒加载:

1
2
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>

配置pojo类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Student.java
package org.fkit.domain;

public class Student {
private Integer id;
private String name;
private String sex;
private Integer age;
private Clazz clazz;
//getter,setter

//Clazz.java
package org.fkit.domain;

import java.util.List;

public class Clazz {
private Integer id;
private String code;
private String name;
private List<Student> students;
//getter,setter

1.配置StudentMapper和ClazzMapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//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="org.fkit.mapper.StudentMapper">
<select id="selectStudentById" parameterType="int" resultMap="studentResultMap">
SELECT * from tb_clazz c,tb_student s
where c.id = s.clazz_id and s.id = #{id}
</select>

<select id="selectStudentByClazzId" parameterType="int" resultMap="studentResultMap">
select * from tb_student where clazz_id = #{id}
</select>
<resultMap id="studentResultMap" type="org.fkit.domain.Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<association property="clazz" javaType="org.fkit.domain.Clazz">
<id property="id" column="id"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
</association>
</resultMap>

</mapper>
1
2
3
4
5
6
7
8
9
10
//StudentMapper.java
package org.fkit.mapper;

import org.fkit.domain.Student;

public interface StudentMapper {
Student selectStudentById(Integer id);

Student selectStudentByClazzId(Integer id);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//ClazzMapper.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="org.fkit.mapper.ClazzMapper">
<select id="selectClazzById" parameterType="int" resultMap="clazzResultMap">
SELECT * FROM tb_clazz where id = #{id}
</select>

<resultMap id="clazzResultMap" type="org.fkit.domain.Clazz">
<id property="id" column="id"/>
<result property="code" column="code"/>
<result property="name" column="name"/>
<collection property="students" javaType="ArrayList"
column="id" ofType="org.fkit.domain.Student"
select="org.fkit.mapper.StudentMapper.selectStudentByClazzId"
fetchType="lazy">
<id property="studentId" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
</collection>
</resultMap>
</mapper>
1
2
3
4
5
6
7
8
//ClazzMapper.java
package org.fkit.mapper;

import org.fkit.domain.Clazz;

public interface ClazzMapper {
Clazz selectClazzById(Integer id);
}

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//OneToMany.java
package org.fkit.test;

import org.apache.ibatis.session.SqlSession;

import org.fkit.domain.Clazz;
import org.fkit.factory.FKSqlSessionFactory;
import org.fkit.mapper.ClazzMapper;


public class OneToMany {
public static void main(String args[])throws Exception {
SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();

OneToMany oneToMany = new OneToMany();
oneToMany.testSelectClazzById(sqlSession);
sqlSession.commit();

sqlSession.close();

}

public void testSelectClazzById(SqlSession sqlSession) {
ClazzMapper clazzMapper = sqlSession.getMapper(ClazzMapper.class);
Clazz clazz = clazzMapper.selectClazzById(1);
System.out.println(clazz.getId() + " " + clazz.getCode());
System.out.println(clazz.getStudents());
}
}
//output:
DEBUG [main] - ==> Preparing: SELECT * FROM tb_clazz where id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
1 j1601
DEBUG [main] - ==> Preparing: select * from tb_student where clazz_id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 2
[Student{id=1, name='jack', sex='男', age=22, clazz=Clazz{id=1, code='null', name='jack', students=null}}, Student{id=2, name='rose', sex='女', age=18, clazz=Clazz{id=2, code='null', name='rose', students=null}}]

可以看出,懒加载会只加载需要使用的(PS:如果做接口,json传数据,则冷加载相当于失效,但是可以在pojo类上加上@JsonIgnoreProperties(“fieldname”))。

-------------本文结束 感谢您的阅读-------------