介绍
- 使用SpringBoot和Mybatis Plus进行后端开发时,想要自定义SQL与Mapper方法,而不仅仅是使用逆向工程自动生成的那些方法。
- 未添加自定义SQL时,所参考的前后端项目来源:
https://juejin.im/post/5ecfca676fb9a04793456fb8#heading-2
只封装到Mapper层
1.添加SQL代码
在Mapper配置文件BlogMapper.xml
中,添加xml形式的SQL片段:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.markerhub.mapper.BlogMapper">
<select id="selectByUserid" resultType="com.markerhub.entity.Blog">
SELECT * FROM m_blog where user_id = #{userid}
</select>
</mapper>
- 其中
<select>
的部分为新添加的。
2.添加Mapper方法
public interface BlogMapper extends BaseMapper<Blog> {
// @Select("SELECT * FROM m_blog where user_id = #{userid}") 注解开发方式
List<Blog> selectByUserid(@Param("userid") String userid);
}
- 注释中的为注解开发方式,可以取代目录中的:1.添加SQL代码
参考链接1:https://blog.csdn.net/weixin_40816738/article/details/93382219
3.测试
在BlogController
中,添加测试的方法:
@RestController
public class BlogController {
@Resource
BlogMapper blogMapper;
@RequiresAuthentication //需要登录权限,普通测试时也可注释掉
@PostMapping("/blog/selectByUserid")
public Result selectByUserid(@RequestBody Blog blog) {
if(blog!=null && blog.getUserId()!=null){
List<Blog> blogs = blogMapper.selectByUserid(blog.getUserId().toString());
return Result.succ(blogs);
}else{
return Result.fail("查询失败");
}
}
}
- 如果使用
@Autowired
而不是@Resource
,则会报错,见参考链接2
参考链接2:https://blog.csdn.net/weixin_44440116/article/details/90052778
进一步封装到Service层
前面是只封装到Mapper层,进而在Controller层中调用Mapper层,共包含上面所述的2个配置步骤,和1个测试步骤,共3个步骤。
如果需要继续封装到Service层,在保持前面1、2步骤不变的情况下,继续进行下列步骤的操作。
4.定义Service接口中的抽象方法
public interface BlogService extends IService<Blog> {
public List<Blog> selectByUserid(String userid);
}
public List<Blog> selectByUserid(String userid);
为新添加的自定义的方法。
5.实现Service接口中的方法
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements BlogService {
@Resource
BlogMapper blogMapper;
public List<Blog> selectByUserid(String userid){
return blogMapper.selectByUserid(userid);
}
}
- 同样的,只能使用
@Resource
,然后实现Service中的抽象方法,也就是调用Mapper方法。 - 前面在没有Service层的时候,是直接在Controller中调用该方法,此处则是封装到Service了。
6.测试
@RestController
public class BlogController {
@Autowired
BlogService blogService;
@RequiresAuthentication
@PostMapping("/blog/selectByUserid2")
public Result selectByUserid(@RequestBody Blog blog) {
if(blog!=null && blog.getUserId()!=null){
List<Blog> blogs = blogService.selectByUserid(blog.getUserId().toString());
return Result.succ(blogs);
}else{
return Result.fail("查询失败");
}
}
}
- 此处调用Service接口时,可以用
@Autowired
也可以用@Resource