MyBatis查询数据库(3)(一)https://developer.aliyun.com/article/1393184
2、多表查询🍉
如果是增、删、改返回搜影响的行数,那么在 UserMapper.xml 中是可以不设置返回的类型的,如:
<insert id="add"> insert into userinfo(username,password) values(#{username},#{password}) </insert> <delete id="delById"> delete from userinfo where id=#{id} </delete> <update id="upUserName"> update userinfo set username=#{username} where id=#{id} </update>
然而即使是最简单查询用户的名称也要设置返回的类型,否则会出现如下错误:
查询不设置返回类型的错误示例演示:
controller 代码:
@RequestMapping("/getname") public String getNameById(Integer id) { return userService.getNameById(id); }
UserMapper.xml 实现代码:
<select id="getNameById"> select username from userinfo where id=#{id} </select>
访问接口执行结果如下:
显示运行了⼀个查询但没有找到结果映射,也就是说对于 id 属性:用于标识实现接口中的那个方法;结果映射属性:结果映射有两种实现标签:Ⅰ、返回类型:resultType 🍓绝大数查询场景可以使⽤ resultType 进行返回,如下代码所示:它的优点是使用方便,直接定义到某个实体类即可。Ⅱ、返回字典映射:resultMap 🍓resultMap使用场景:字段名称和程序中的属性名不同的情况,可使用 resultMap 配置映射;⼀对⼀和⼀对多关系可以使用 resultMap 映射并查询数据。当程序中的属性值与数据库中的字段名不一样时🍒我们去单元测试,进行用户的查询:打印出来就发现,name没有被赋值,为null,这就是因为字段名与属性值不一样的结果。这个时候就可以使用 resultMap 了,resultMap 的使用如下:UserMapper.xml:这样查询的结果就有值了,如下图所示:或者使用as关键字(数据库重命名)🍒如果你一定需要使用resultType,也是可以实现的:Ⅲ、多表查询🍓在多表查询时,如果使用 resultType 标签,在⼀个类中包含了另⼀个对象是查询不出来被包含的对象的,比如以下实体类:程序的执行结果如下图所示:此时我们就需要使用特殊的手段来实现联表查询了。通过VO对象🍒ArticleInfoVO对象ArticleMapper.xml进行多表程序:单元测试:单元测试成功,查询到了用户id为5的 文章表的文章信息 和 用户表中的用户名:大部分时候多表联查解决方案:联表查询语句(left join/inner)+xxxVO(新建的实体类)就可以解决