SpringBoot整合MyBatis-Plus实现增删改查,yml配置


之前因为需求的关系,用到了elasticsearch,但是操作es的时候用的是jpa,感觉这一类全自动的orm还挺好用,简单的单表操作可以直接调用其方法就可以完成也可以使用自定义sql就像是mybatis的注解注入那种。但是jpa在处理复杂的查询真心不给力,所以现在换一个全自动的orm,叫做mybatis-plus简称mp。

mp介绍

mp是一个mybatis增强工具,只做增强不做改变。也就是说mp只会提供一些好用的单表操作功能,你可以使用mp的功能也可以继续用mybatis写sql,mp旨在成为mybatis最好的搭档。

1.配置mybatis-plus

正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。
首先看看我的项目结构:
在这里插入图片描述
application.yml配置文件

server:
  port: 8090

spring:
  #------------------------MySql-----------------------------
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    
mybatis-plus:
  mapper-locations: classpath:mapper/*/*Mapper.xml
  type-aliases-package: com.wyu.itblog.article.model
  global-config:
    refresh-mapper: true
    

maven依赖

<dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.9</version>
</dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
      </dependency>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>3.0.1</version>
      </dependency>

数据库表设计

CREATE TABLE `article` (
  `article_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(128) DEFAULT NULL COMMENT '文章标题',
  `content` longtext COMMENT '正文内容',
  PRIMARY KEY (`article_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='文章表';

Article.java实体类,注意的是这里需要标识主键

@Data
@TableName("article")
public class Article implements Serializable {

    private static final long serialVersionUID = 1L;

    //标识主键策略
    @TableId
    private Long articleId;

    private String title;

    private String content;
}

ArticleDao接口,继承BaseMapper接口即可,另外也可以在这里自定义mybatis接口,所以说mp的扩展性其实比jpa强

@Mapper
public interface ArticleDao extends BaseMapper<Article> {
}

我们可以点进去看看BaseMapper里面到底封装了什么方法,有什么可以是给我们调用的

public interface BaseMapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> wrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}

根据BaseMapper封装的方法,我们在service层中使用一下


@Service
public class ArticleService {

    @Autowired
    private ArticleDao articleDao;

    /**
     * 1.新增 , insert方法
     * @param article
     * @return
     */
    public boolean save(Article article){
        return articleDao.insert(article) > 0;
    }

    /**
     * 2.通过QueryWrapper查询数量
     */
    public Integer selectArticleCount(){
        return articleDao.selectCount(new QueryWrapper<Article>().eq("title","测试"));
    }

    /**
     * 3.通过selectMaps查询list<Map<String, Object>>
     */
    public List<Map<String, Object>> selectArticleMaps(){
        QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", "测试");
        List<Map<String, Object>> list = articleDao.selectMaps(queryWrapper);
        return list;
    }

    /**
     * 4.通过QueryWrapper查询list<Object>
     */
    public List<Object> selectObjs()
    {
        List<Object> list = articleDao.selectObjs(new QueryWrapper<Article>().eq("title", "测试"));
        return list;
    }

    /**
     * 5.分页查询,笔者个人还是比较喜欢使用pagehelper来分页,毕竟比较简单
     */
    public IPage<Article> selectPage()
    {
        QueryWrapper queryWrapper = new QueryWrapper<Article>().eq("title", "测试");
        int count = articleDao.selectCount(queryWrapper);
        IPage<Article> page = new Page(1,2,count);
        IPage<Article> list = articleDao.selectPage(page, queryWrapper);

        System.out.println("返回数据:"+ list.getRecords());

        System.out.println("总条数:"+list.getTotal() + "当前页码:"+list.getCurrent()+ "总页码:"+list.getPages() + "每页显示条数:"+list.getSize());

        System.out.println("返回的数据:"+page.getRecords());

        return list;
    }

    /**
     * 6,删除,根据articleId来删除
     */
    public boolean delete(Long articleId)
    {
        return articleDao.deleteById(articleId) > 0;
    }

    /**
     * 7,删除,根据QueryWrapper删除
     */
    public boolean deleteByQueryWrapper()
    {
        return articleDao.delete(new QueryWrapper<Article>().eq("title", "测试")) > 0;
    }

    /**
     * 8, 批量删除,把多个id存放到list中,再批量删除,其实很少会用到
     */
    public boolean deleteBatchIds(List<Long> articleIdList)
    {
        return articleDao.deleteBatchIds(articleIdList) > 0;
    }

    /**
     * 9,修改  封装方法中做了非空校验,如果该字段为null,则不进行更新
     */
    public boolean updateById(Article article) {
        return articleDao.updateById(article) > 0;
    }
}

最后在controller中调用,其实也就是传入参数直接使用既可,我们可以通过postman来测试,找一个简单的测试一下就好了

@RestController
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @RequestMapping("/selectArticleCount")
    public Integer selectArticleCount(){
        return articleService.selectArticleCount();
    }

    @RequestMapping("/selectPage")
    public String selectPage(){
        return articleService.selectPage().toString();
    }
}

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高并发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值