手把手教你在Spring Boot中整合MyBatisPlus实现CRUD操作

222 阅读3分钟

整合mp

1.依赖

    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency>

2.配置

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/ssm?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8
    username: root
    password: xxxxxx
    hikari:
      connection-timeout: 60000
      validation-timeout: 3000
      idle-timeout: 60000
      login-timeout: 5
      max-lifetime: 60000
      maximum-pool-size: 30
      minimum-idle: 10
      read-only: false

配置创建时间和更新时间自动插入

@Slf4j
@Component
public class CommonMetaObjectHandler implements MetaObjectHandler {
    //原理是后置处理
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

分页插件

@Configuration
public class MyBatisPlusConfig {
    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setOptimizeJoin(true);
        paginationInnerInterceptor.setMaxLimit(500L);
        paginationInnerInterceptor.setOverflow(false);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

3.注解

@SpringBootApplication
@MapperScan("com.zl.springbootssm.mapper")//整合mybatis
public class SpringbootSsmApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootSsmApplication.class, args);
    }

}

1.普通的增删改查

数据库实体

CREATE TABLE `ssm`.`order`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `number` int(11) NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

mapper接口

//自己写sql语句的话可以不用继承basemapper
public interface OrderMapper extends BaseMapper<Order> {
    //保存
    int save(Order order);
    //查询
    Order get(Integer id);

实现类

//namespace对应接口,id对应接口中的方法,parameterType对应参数类型,
//resultType对应sql语句返回结果类型。
//因为ORM映射关系是实体,所以resultType返回结果只能是实体等,不可能是集合之类的。
//使用#{}充当占位符。
<mapper namespace="com.zl.springbootssm.mapper.OrderMapper">
    //保存
    <insert id="save" parameterType="com.zl.springbootssm.pojo.Order">
        INSERT INTO kss_order (id, orders, number)
        VALUES (#{id}, #{orders}, #{number});
    </insert>
    //查询
<select id="get" resultType="com.zl.springbootssm.pojo.Order">
    select *
    from `kss_order`
    where id = #{id};
</select>

业务层

public interface IOrderService  {
    int saveService(Order order);
    Order get(int id);
    List<Map<String, Object>> getTwoPojo();
    List<OrderVo> findOrderservice(OrderVo orderVo);
}
@Service
@Slf4j
public class OrderService  implements IOrderService {
    @Autowired
    @Resource
    private OrderMapper orderMapper;

    @Override
    public int saveService(Order order) {
        int save = orderMapper.save(order);
        return save;
    }

    @Override
    public Order get(int id) {
        Order order = orderMapper.get(id);
        Order order1 = OrderThreadLocal.get();
        log.info(order.getOrders());
        return order;
    }

    @Override
    public List<Map<String, Object>> getTwoPojo() {
        List<Map<String, Object>> orders = orderMapper.findOrders();
        return orders;
    }
    //模糊查询
    public List<OrderVo> findOrderservice(OrderVo orderVo){
        List<OrderVo> orderList = orderMapper.findOrderList(orderVo);
        log.info("===>"+orderList.toString());
        return orderList;
    }


}

2.模糊查询(带参数)

mapper接口

//自己写sql语句的话可以不用继承basemapper
public interface OrderMapper  {
    //模糊查询
    使用@Param给参数起别名映射
    当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。
   当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
   不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
   
    List<OrderVo> findOrderList(@Param("orderVo") OrderVo orderVo);

实现类

//返回值是sql结果能够映射的实体
<select id="findOrderList" resultType="com.zl.springbootssm.pojo.OrderVo">
    <bind name="key" value="'%'+orderVo.keyword+'%'"/>
    select * from kss_order
    where orders like #{key}
</select>

3.带条件的增删改查

待更

4.动态sql语句

待更

5.分页

待更

7.如何理解Iservice和BaseMapper

当我们写增删改查时常用的一种方式如下

定义接口
public interface IUserService extends IService<User> {

    boolean save(User user);
    User login(UserVo userVo);
}

实现类
@Service
@Slf4j
public class UserServiceImp extends ServiceImpl<UserMapper, User> implements IUserService {
    //不用自己写sql语句实现,使用basemapper自己实现
    @Override
    public boolean save(User user) {
        return this.baseMapper.insert(user)>0?true:false;
    }

    @Override
    public User login(UserVo userVo) {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUserName, userVo.getUserName());
        User user = this.getOne(lambdaQueryWrapper);
        return user;
    }
}

其中接口为什么要继承IService,实现类中为什么要继承ServiceImp<UserMapper,User>? 以及basemapper与Iservice的关系是什么?

  • 其中basemapper是数据库层面具体的增删改查,而IService是业务层面的增删改查接口。
  • 当自己不想写sql语句时可以使用IService中已经封装好的接口去调basemapper中具体的增删改查。
  • 其中ServiceImpl实现了IService中的抽象方法所以UserServiceImp不用去实现IService只需要实现IUserService自己接口中的抽象方法。
  • 而UserServiceImp和ServiceImpl是父子关系,ServiceImpl起到职责分担的作用普通的增删改查已将帮子类实现了