MyBatis-Plus自定义SQL实现Mapper层以及Service层

本文详细介绍如何在SpringBoot和MybatisPlus项目中,通过在Mapper配置文件中添加自定义SQL代码,以及在Mapper接口中定义相应方法,实现对特定业务逻辑的支持。进一步,文章还介绍了如何将这些功能封装到Service层,以实现更清晰的分层架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

  • 使用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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值