SpringBoot整合MyBatis-Plus实现增删改查,yml配置
mybatis-plus
- mp介绍
- 1.配置mybatis-plus
之前因为需求的关系,用到了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();
}
}
还没有评论,来说两句吧...