目录
使用< resultMap > 实现加载集合数据( 联合查询方式)
resultMap标签
<resultMap>标签写在mapper.xml中,由程序员控制SQL查询结果与实体类的映射关系,Mybatis默认使用Auto Mapping特性,当使用<resultMap>标签时<select>标签不写resultType 属性,需要写resultMap属性引用<resultMap>标签的id。
eg:
查询的结果为对象:
public class Teacher {
private int id;
private String name;
}
配置mapper.xml:
<resultMap type="teacher" id="mymap"> <!-- type为映射的实体类 -->
<!-- 主键使用 id 标签配置映射关系 -->
<id column="id" property="id1" />
<!-- 其他列使用 result 标签配置映射关系 -->
<result column="name" property="name1"/>
</resultMap>
<select id="selAll" resultMap="mymap">
select * from teacher
</select>
使用resultMap方式实现关联单个对象
(N+1查询方式:先查询出某个表的全部信息,根据这个表的信息查询另一个表的信息 )
eg:
1. 在Student实现类中包含了一个Teacher对象
public class Student {
private int id;
private String name;
private int age;
private int tid;
private Teacher teacher;
}
2. 在TeacherMapper.xml中配置一个查询:
<select id="selById" resultType="teacher" parameterType="int">
select * from teacher where id=#{0}
</select>
3. 在StudentMapper.xml中配置
<resultMap type="student" id="stuMap">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="tid" column="tid"/>
<!-- 如果关联一个对象 -->
<association property="teacher"
select="com.bjsxt.mapper.TeacherMapper.selById"
column="tid"></association>
</resultMap>
<select id="selAll" resultMap="stuMap">
select * from student
</select>
其中: <association> 是在装配一个对象时使用,<association>标签中的 property是表示类中的属性名,column表示把当前表的哪个列的值作为参数传递给另一个查询,select的值表示通过哪一个查询来得到这个对象的信息。<result>标签中的property和column(如果列名和属性名相同则可以不配置)
使用 resultMap 实现关联单个对象(联合查询方式)
<resultMap type="Student" id="stuMap1">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
<association property="teacher" javaType="Teacher" >
<id column="tid" property="id"/>
<result column="tname" property="name"/>
</association>
</resultMap>
<select id="selAll1" resultMap="stuMap1">
select s.id sid,s.name sname,age age,t.id
tid,t.name tname FROM student s left outer join teacher
t on s.tid=t.id
</select>
其中的javaType 表示装配完成后返回一个什么类型的对象,取值是一个类名,或类的对象。
使用< resultMap > 查询关联集合对象
(N+1)方式
在Teacher实体类中添加List<Student>
public class Teacher {
private int id;
private String name;
private List<Student> list;
}
在StudentMapper.xml中添加通过id查询的sql
<select id="selByTid" parameterType="int"
resultType="student">
select * from student where tid=#{0}
</select>
在TeacherMapper.xml中添加查询全部
<resultMap type="teacher" id="mymap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list"
select="com.bjsxt.mapper.StudentMapper.selByTid"
column="id">
</collection>
</resultMap>
<select id="selAll" resultMap="mymap">
select * from teacher
</select>
其中<collection>是当属性时集合类型时使用的标签,返回的实体类与类的属性对应。
使用< resultMap > 实现加载集合数据( 联合查询方式)
在teacherMapper.xml中添加
<resultMap type="teacher" id="mymap1">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
<collection property="list" ofType="student" >
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
</collection>
</resultMap>
<select id="selAll1" resultMap="mymap1">
select t.id tid,t.name tname,s.id sid,s.name
sname,age,tid from teacher t LEFT JOIN student s on
t.id=s.tid;
</select>
Mybatis可以通过主键来判断对象是否被加载过,因此可以自动避免Teacher对象重复。
使用 Auto Mapping 结合别名实现多表查询
只能使用多表联合查询方式,查询出的列名和属性名相同。
<select id="selAll" resultType="student">
select t.id `teacher.id`,t.name
`teacher.name`,s.id id,s.name name,age,tid
from student s LEFT JOIN teacher t on t.id=s.tid
</select>
Mybatis注解
为了简化配置XXXMapper.xml文件,在使用非动态SQL时可以用注解,xml文件可以与注解共存。
在<mappers>中配置<package name = " "> 或<mapper class = "接口路径">
1.新增:
@Insert("insert into teacher
values(default,#{name})")
int insTeacher(Teacher teacher);
2.删除:
@Delete("delete from teacher where id=#{0}")
int delById(int id);
3.修改:
@Update("update teacher set name=#{name} where
id=#{id}")
int updTeacher(Teacher teacher);
4.查询:
@Select("select * from teacher")
List<Teacher> selAll();
使用注解实现<resultMap>
eg:(N+1 方式)
在StudentMapper接口中添加注解以及方法:
@Select("select * from student where tid=#{0}")
List<Student> selByTid(int tid);
在TeacherMapper接口中添加注解以及方法:
@Results(value={
@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(property="list",column="id",many=@Many(sele
ct="com.bjsxt.mapper.StudentMapper.selByTid"))
})
@Select("select * from teacher")
List<Teacher> selTeacher();
其中:
@Results() 相当于<resultMap>
@Result() 相当于<id/>或<result/>
@Result(id=true) 相当与<id/>
@Many() 相当于<collection/>
@One() 相当于<association/>