我们以查询为例:
先是在controller层:
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password){
//查询用户
User u = userService.findByUserName(username);
if(u == null){
userService.register(username,password);
return Result.success();
}else{
return Result.error("用户名已被占用");
}
}
调用service层:
@Override
public User findByUserName(String username) {
User u =userMapper.findByUserName(username);
return u;
}
调用Mapper层:
@Select("select * from user where username=#{username}")
User findByUserName(String username);
这里会有一些疑惑:为什么mapper层没有返回语句,我怎么将查询到的数据返回给service层,再由service层的return u 返回给controller层。在我们的刻板印象中会觉得mapper层应该这样写:
@Select("select * from user where username=#{username}")
User u = findByUserName(String username);
return u
其实MyBatis 在背后帮你自动生成了包含 return 语句的方法实现。
// 你写的是接口(只有方法声明)
public interface UserMapper {
@Select("select * from user where username=#{username}")
User findByUserName(String username); // 没有方法体
}// MyBatis 在运行时为你生成实现类:
public class UserMapperImpl implements UserMapper {
@Override
public User findByUserName(String username) {
// MyBatis 自动生成的方法体,包含 return 语句
try {
// 执行 SQL 查询
// 映射结果到 User 对象
User result = ...; // 查询结果,result也是临时自动注册的
return result; // 这里有 return! 将result返回给service层,service层再向上传递
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Mapper查询数据库返回数据解析
853

被折叠的 条评论
为什么被折叠?



