SpringBoot 整合 MybatisPlus 3.0

 
CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能

需求:
存在一张 message 表,且已有对应的实体类 Message,实现message 表的 CRUD 操作我们需要做什么呢?
基于 Mybatis:
需要编写 MessageMapper 接口,并在 MessageMapper.xml 映射文件中手动编写 CRUD 方法对应的sql语句。
基于 MP:
只需要创建 MessageMapper 接口, 并继承 BaseMapper 接口。
我们已经有了Message、message了,并且MessageDao也继承了BaseMapper了,接下来就使用crud方法。

前言:

mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。

一、mybatis-plus简介:

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

二、spring整合mybatis-plus:

正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可。接下来看具体操作:
1、pom.xml:
核心依赖如下:

<!-- druid数据库连接池启动器 -->
<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>
    <version>5.1.46</version>
</dependency>
<!-- mybatis-plus启动器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.0.1</version>
</dependency>
注意:这些是核心依赖,本项目还用到了mysql驱动、c3p0、日志(slf4j-api,slf4j-log4j2)、lombok。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突;lombok是一个工具,添加了这个依赖,开发工具再安装Lombok插件,就可以使用它了,最常用的用法就是在实体类中使用它的@Data注解,这样实体类就不用写set、get、toString等方法了。关于Lombok的更多用法,请自行百度。
2、application.properties配置:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false

3、 编写实体类:

/**
 * @create 2019.08.14
 **/
@AllArgsConstructor
@NoArgsConstructor
@Accessors
@Data
@TableName(value = "message")
public class Message implements Serializable {
  //value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value
    @TableId(value = "id",type = IdType.AUTO)//指定自增策略 
    private Integer id;
    private Integer mid;
    private String content;
    @TableField(value = "column_200")
    private String column1;
    @TableField(value = "column_500")
    private String column2;
    @TableField(value = "column_5000")
    private String column3;
}

解说:(1)@TableName是mybatis plus对表的注解,每个实体必须要加,不然会导致表不存在异常。

        (2)@TableId对主键的注解 @TableId中有一个属性叫type是枚举类型,该属性主要作用是主键以什么形式存在,例如IdType.AUTO自增或UUID。

        (3)@TableField像及了mybatis中的resultMap,在mybatis中为什么要使用resultMap,因为当实体中的属性名与数据库中的表不一致时需要手动映射,resultMap的作用在于手动映射,既然说了resultMap就不能不说resultType,resultType当实体属性与表字段一致时自动映射。 在mybatis plus使用@TableField的场景与mybatis中使用resultMap的是一致的。@TableField中还有一个属性不能不提,就是exist,这个属性属于boolean类型,默认为true,意思是是否在数据表中存在,true存在,false不存在,这个的应用场景是当某个实体中需要包含其他实体时,可使用该属性,否则自动生成的查会报错,使用自动生成的查有关方法,默认是查所有数据表所有字段,当然可使用setSqlSelect()方法指定需要查的字段,可以在一定程度上避免该错误的出现,不然导致的错误最有可能就是找不到该字段异常(column not exist),使用exist属性可直接避免,当然也可以在该属性中加入static或transient修饰,与exist的作用本质上是一样的。

4.、编写mapper接口继承BaseMapper接口的数据操作方法:

/**
 * @create 2019.08.14
 **/
@Mapper
public interface MessageMapper extends BaseMapper<Message> {}

解说:BaseMapper<T>中包含的就是一系列增删改查,maven项目中可Ctrl+鼠标点击进去查看源码,源码所有注释都有,非常浅显易懂,如果你需要加入自定义sql直接写就行,跟mybatis一样,在该类中新增方法,只需在对应的xml中配置即可

5、编写Service

/**
 * @create 2019.08.14
 **/
public interface MessageService {
    List<Message> getAllMessage();
    List<Message> getMessageByMid(Integer mid);
    Integer fetchOne(Integer id,Integer mid);
    Integer updateMessageByModuleIdAndMessageId(Message message);
    Integer addMessage(Message message);
    Integer deleteMessage(Integer mid,Integer id);
}

Service实现类:

/**
 * @create 2019.08.14
 **/
@Service
public class MessageServiceImpl implements MessageService {
    @Autowired
    private MessageMapper messageMapper;
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public List<Message> getAllMessage() {
        return messageMapper.selectList(new QueryWrapper<Message>());
    }

    @Override
    public List<Message> getMessageByMid(Integer mid) {
        return messageMapper.selectList(new QueryWrapper<Message>().eq("mid",mid));
    }

    @Override
    public Integer fetchOne(Integer id,Integer mid){
        return messageMapper.selectCount(new QueryWrapper<Message>().eq("id",id).eq("mid",mid));
    }

    @Override
    public Integer updateMessageByModuleIdAndMessageId(Message message){
        System.out.println(message);
        logger.debug(message.toString());
        return messageMapper.updateById(message);
    }
    @Override
    public Integer addMessage(Message message){
        System.out.println(message);
        logger.debug(message.toString());
        return messageMapper.insert(message);
    }
    @Override
    public Integer deleteMessage(Integer mid,Integer id){
        logger.debug(mid+"-"+id);
        return messageMapper.delete(new QueryWrapper<Message>().eq("id",id).eq("mid",mid));
    }
}

解说:@Service注解的作用也是同mybatis之前那样也是一样,这个注解的作用扫描Service层,自动注解spring容器

6、编写Controller

/**
 * @create 2019.08.14
 **/
@RestController
public class MainController {
    @Autowired
    private MessageService messageService;

    @GetMapping("/messages")
    public ModelMap getMessages(){
        ModelMap map = new ModelMap();
        return map.addAttribute("messages",messageService.getAllMessage());
    }

    @GetMapping("module1")
    public Object getMessageType1(){
        return messageService.getMessageByMid(1);
    }
    
    @GetMapping("module2")
    public Object getMessageType2(){
        return messageService.getMessageByMid(2);
    }
    
    @PostMapping("/message")
    public ModelMap addMessage(@RequestBody Message message){
        ModelMap map = new ModelMap();
        Integer result = messageService.addMessage(message);
        if (result==1){
            map.addAttribute("result",true);
            map.addAttribute("tip","添加成功!");
        }else{
            map.addAttribute("result",false);
            map.addAttribute("tip","添加失败!");
        }
        return map;
    }
    
    @DeleteMapping("/{mid}/{id}")
    public ModelMap deleteMessage(@PathVariable Integer mid,@PathVariable Integer id){
        System.out.println(mid);
        System.out.println(id);
        ModelMap map = new ModelMap();
        Integer result = messageService.deleteMessage(mid,id);
        if (result==1){
            map.addAttribute("result",true).addAttribute("tip","删除成功!");
        }else{
            map.addAttribute("result",false).addAttribute("tip","删除失败!");
        }
        return map;
    }
    
    @PatchMapping("/message")
    public ModelMap updateMessage(@RequestBody Message message){
        Integer one = messageService.fetchOne(message.getId(), message.getMid());
        ModelMap map = new ModelMap();
        if (one==1){
            Integer result = messageService.updateMessageByModuleIdAndMessageId(message);
            if (result==1){
                map.addAttribute("result",true).addAttribute("tip","更新成功!");
            }else{
                map.addAttribute("result",false).addAttribute("tip","更新失败!");
            }
            System.out.println(message);
        }else{
            map.addAttribute("tip","查询异常!");
        }
        return map;
    }
}

7、显示结果:

 

https://yq.aliyun.com/articles/713779?spm=a2c4e.11163080.searchblog.9.5b4f2ec1UxSaKD
 
posted on 2019-08-14 16:32  花溪月影  阅读(1514)  评论(0编辑  收藏  举报