Mybatis学习(四)

目录

resultMap标签

使用resultMap方式实现关联单个对象(N+1)

 使用 resultMap 实现关联单个对象(联合查询方式)

使用< resultMap > 查询关联集合对象(N+1)

使用< resultMap > 实现加载集合数据( 联合查询方式)

使用 Auto Mapping  结合别名实现多表查询

Mybatis注解


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/>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值