目录
前言
1、返回类型:resultType
2、返回字典映射:resultMap
2.1、字段名和属性名不同怎么处理
解决方案一:使用resultMap
解决方案二:使用as起别名
3、多表查询
总结:
前言
在之前的文章中,我们可以得知,MyBatis实现查询操作时,xml中不仅有id,还需要返回类型resultType,接下来呢,我们就来聊聊这个返回类型
没有接触过MyBatis的伙伴,大概浏览一下这篇文章,再继续看吧:http://t.csdn.cn/oobDQ
1、返回类型:resultType
例如:
<select id="getById" resultType="com.example.demo.entity.Userinfo">
select * from userinfo where id = #{id}
</select>
它的优点就是使用方便,直接定义到某个实体类即可
2、返回字典映射:resultMap
使用场景:
- 字段名和程序中的属性名不同时,可使用resultMap配置映射
- 一对一和一对多关系可以使用resultMap映射并查询数据
2.1、字段名和属性名不同怎么处理
举例:
字段名如下:
程序中的属性如下:
接口实现:
Userinfo getUserById(@Param("id") Integer id);
xml实现:
<select id="getUserById" resultType="com.example.demo.entity.Userinfo">
select * from userinfo where id = ${id}
</select>
测试:
name复制失败, 原因就是因为username与name不匹配,对应不上
解决方案一:使用resultMap
xml中修改如下:
<resultMap id="baseMap" type="com.example.demo.entity.Userinfo">
<id column="id" property="id"></id>
<result column="username" property="name"></result>
<result column="password" property="password"></result>
<result column="photo" property="photo"></result>
<result column="createtime" property="createtime"></result>
<result column="updatetime" property="updatetime"></result>
<result column="state" property="state"></result>
</resultMap>
<select id="getUserById" resultMap="baseMap">
select * from userinfo where id = ${id}
</select>
测试:
有小伙伴会问,就一个属性名对应不上,写一条不就好了,为什么这么麻烦修改这么所有的,原因在于,在单表查询时,这里没有问题,但是当多表查询时,没写的属性名是搜索不到的~
解决方案二:使用as起别名
xml查询如下:
<select id="getUserById" resultType="com.example.demo.entity.Userinfo">
select id,username as name,password,photo,createtime,updatetime,state from userinfo where id = ${id}
</select>
这个方案更推荐使用,因为一般公司会要求不能使用*来查询的~
3、多表查询
举例:一对一的表查询
Userinfo类:
@Data
public class Userinfo {
private int id;
private String username;
private String password;
private String photo;
private LocalDateTime createtime;
private LocalDateTime updatetime;
private int state;
}
Articleinfo类:
@Data
public class Articleinfo {
private int id;
private String title;
private String content;
private String createtime;
private String updatetime;
private int uid;
private int rcount;
private int state;
}
当我们需要将这两张表联查时,我们可以使用View Object视图对象来解决,也就是说,有一个视图,里面包含Articleinfo类的所有属性,并也包含Userinfo类中我们所需要的属性,例如上面的两张表,我们查询某一篇文章时,同时也需要Userinfo的username属性,具体实现如下:
View Object类:
接口实现:
xml实现:
测试:
@SpringBootTest
class ArticleMapperTest {
@Autowired
private ArticleMapper articleMapper;
@Test
void getById() {
ArticleinfoVO articleinfoVO = articleMapper.getById(1);
System.out.println(articleinfoVO);
}
}
查询结果:
结果出现问题,我们需要得到的视图对象,打印时属性不全,怎么回事?
查看最终执行代码class文件【因为我们使用了lombok,lombok帮我们省了很多代码,而在class文件中,会将lombok注解,翻译为相应的代码】:
我们发现,@Data注解帮我们实现的toString()方法,只含有自己独有的属性,而没有父类的属性,因此,我们需要重写该方法:
测试:
总结:
多表联查,最终的实现:联表查询语句(left join / inner join)+ xxxVO解决
好啦,本期结束咯,下期见~