Mybatis苞米豆(baomidou)使用说明书

一、背景

1.1 MyBatis-Plus 是由一个叫苞米豆的一个组织来开发的,组织负责人叫青苗,目前组织中大概有31人。MyBatis-Plus( https://mybatis.plus/)简称 MP是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 可以不需要写SQL语句就能快速完成单表的操作,MyBatis-Plus的愿景就是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

1.2 代码地址:

GitHub(GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development

码云(baomidou: 苞米豆,为提高生产率而生!

本文主要以贴代码为主,实战为王。

二、配置

1、pom文件配置

 <properties>
    <java.version>1.8</java.version>
    <mybatisplus.version>3.3.1</mybatisplus.version>
 </properties>
<!--mybatis-plus-->
 <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatisplus.version}</version>
 </dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
 <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>${mybatisplus.version}</version>
 </dependency>

2、yml文件配置

#mybatis配置
mybatis-plus:
  # 映射文件的位置
  mapper-locations: classpath:mapper/*.xml
  global-config:
    #数据库相关配置
    db-config:
      #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: AUTO
      #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
      field-strategy: NOT_NULL
      #驼峰下划线转换
      column-underline: true
      logic-delete-value: -1
      logic-not-delete-value: 0
    banner: false
  #原生配置
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    jdbc-type-for-null: 'null'
  # 配置包别名
  type-aliases-package:  com.snowriver.it.springdemo.entity

3、SQL准备

CREATE TABLE `t_snow_operate_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `batch_no` varchar(32) DEFAULT NULL COMMENT '批次号',
  `operator` varchar(255) NOT NULL DEFAULT '' COMMENT '操作人',
  `operate_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  `operate_type` tinyint(4) NOT NULL DEFAULT '-1' COMMENT '操作类型 1-导入 2-修改',
  `operate_detail` varchar(255) NOT NULL DEFAULT '' COMMENT '操作明细(导入-附件名称  修改-报单id)',
  `attachment_url` varchar(255) NOT NULL DEFAULT '' COMMENT '附件地址(操作类型为修改 该字段为空)',
  `upload_status` tinyint(4) NOT NULL DEFAULT '-1' COMMENT '上传状态 0-上传失败 1-上传成功 2-处理中',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2245 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='操作日志记录表';

三、具体代码(增删改查)

controller类:

@Slf4j
@RestController
@RequestMapping("/operate")
public class OperateLogController {
 
    @Resource
    private ISnowOperateLogService operateLogService;
 
    @PostMapping("/insert")
    public Result insert(@RequestBody OperateRecordReq request) {
        SnowOperateLog operateLog = new SnowOperateLog();
        operateLog.setOperator(request.getOperator());
        operateLog.setOperateTime(request.getOperateTimeStart());
        operateLog.setOperateType(Integer.valueOf(request.getOperateType()));
        operateLogService.save(operateLog);
        return Result.success();
    }
 
    @PostMapping("/insert-batch")
    public Result insertBatch(@RequestBody OperateRecordReq request) {
        LocalDateTime dateTime = LocalDateTime.now();
        List<SnowOperateLog> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            SnowOperateLog operateLog = new SnowOperateLog();
            operateLog.setBatchNo(String.valueOf(System.currentTimeMillis()));
            operateLog.setOperator("liudehua" + i);
            operateLog.setOperateType(1);
            operateLog.setOperateTime(dateTime);
            list.add(operateLog);
        }
        operateLogService.saveBatch(list);
        return Result.success();
    }
 
    @GetMapping("/delete")
    public Result<List<SnowOperateLog>> deleteById(@RequestParam(value = "id") String id) {
        operateLogService.deleteById(id);
        return Result.success();
    }
 
    @PostMapping("/update-by-name")
    public Result updateByOperator(@RequestBody OperateRecordReq request) {
        operateLogService.updateByOperator(request.getOperator());
        return Result.success();
    }
 
    @PostMapping("/queryList")
    public Result<PageDto<SnowOperateLog>> queryList(@RequestBody OperateRecordReq request) {
        return operateLogService.queryList(request);
    }
 
    @PostMapping("/query-by-name")
    public Result<List<SnowOperateLog>> selectAllByOperator(@RequestBody OperateRecordReq request) {
        List<SnowOperateLog> snowOperateLogs = operateLogService.selectAllByOperator(request.getOperator());
        return Result.success(snowOperateLogs);
    }
}

服务类:

public interface ISnowOperateLogService extends IService<SnowOperateLog> {
 
    Result<PageDto<SnowOperateLog>> queryList(OperateRecordReq request);
 
    List<SnowOperateLog> selectAllByOperator(String operator);
 
    void updateByOperator(String operator);
 
    void deleteById(String id);
}

实现类:

@Slf4j
@Service
public class SnowOperateLogServiceImpl extends ServiceImpl<SnowOperateLogMapper, SnowOperateLog> implements
        ISnowOperateLogService {
 
    @Resource
    private SnowOperateLogMapper operateLogMapper;
 
    // 注意:不配置MybatisPlusConfig分页不生效  TokenKind
    @Override
    public Result<PageDto<SnowOperateLog>> queryList(OperateRecordReq request) {
        LambdaQueryWrapper<SnowOperateLog> wrapper = Wrappers.lambdaQuery(SnowOperateLog.class);
        IPage<SnowOperateLog> page = new Page<>(request.getPageNum(),request.getPageSize());
        wrapper
                .eq(SnowOperateLog::getOperator,request.getOperator())
                .eq(SnowOperateLog::getOperateType,request.getOperateType())
                .ge(SnowOperateLog::getOperateTime,request.getOperateTimeStart())
                .le(SnowOperateLog::getOperateTime,request.getOperateTimeEnd())
                .orderByDesc(SnowOperateLog::getId);
        IPage<SnowOperateLog> logIPage = operateLogMapper.selectPage(page,wrapper);
        PageDto<SnowOperateLog> result = new PageDto<>(logIPage.getTotal(), logIPage.getPages()
                , logIPage.getCurrent(), logIPage.getSize()
                , logIPage.getRecords());
        return Result.success(result);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public List<SnowOperateLog> selectAllByOperator(String operator) {
//        // 自定义方法和SQL实现功能
//        List<SnowOperateLog> snowOperateLogs = operateLogMapper.selectAllByOperator(operator);
        LambdaQueryWrapper<SnowOperateLog> queryWrapper = Wrappers.lambdaQuery(SnowOperateLog.class)
                .eq(SnowOperateLog::getOperator, operator);
        List<SnowOperateLog> snowOperateLogs = operateLogMapper.selectList(queryWrapper);
        // 批量打印日志
        snowOperateLogs.forEach(System.out::println);
        return snowOperateLogs;
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateByOperator(String operator) {
        LambdaUpdateWrapper<SnowOperateLog> wrapper = Wrappers.lambdaUpdate(SnowOperateLog.class)
                .eq(SnowOperateLog::getOperator, "张三")
                .set(SnowOperateLog::getOperator, "张三疯======");
        super.update(wrapper);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(String id) {
        LambdaQueryWrapper<SnowOperateLog> wrapper = Wrappers.lambdaQuery(SnowOperateLog.class)
                .eq(SnowOperateLog::getId, id);
        super.remove(wrapper);
    }
}

mapper类

@Mapper
public interface SnowOperateLogMapper extends BaseMapper<SnowOperateLog> {
 
    List<SnowOperateLog> selectAllByOperator(@Param("operator") String operator);
 
}

mapper.xml

<?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.snowriver.it.springdemo.mapper.SnowOperateLogMapper">
 
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.snowriver.it.springdemo.entity.SnowOperateLog">
        <id column="id" property="id" />
        <result column="batch_no" property="batchNo" />
        <result column="operator" property="operator" />
        <result column="operate_time" property="operateTime" />
        <result column="operate_type" property="operateType" />
        <result column="operate_detail" property="operateDetail" />
        <result column="attachment_url" property="attachmentUrl" />
        <result column="upload_status" property="uploadStatus" />
    </resultMap>
 
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, batch_no, operator, operate_time, operate_type, operate_detail, attachment_url, upload_status
    </sql>
 
    <select id="selectAllByOperator" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from t_snow_operate_log
        where operator = #{operator, jdbcType=VARCHAR}
    </select>
 
</mapper>

配置类:MybatisPlusConfig

备注:如果没有该类,分页查询不生效

@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

实体类

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_snow_operate_log")
public class SnowOperateLog implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
 
    /**
     * 批次号
     */
    private String batchNo;
 
    /**
     * 操作人
     */
    private String operator;
 
    /**
     * 操作时间
     */
    private LocalDateTime operateTime;
 
    /**
     * 操作类型 1-导入 2-修改
     */
    private Integer operateType;
 
    /**
     * 操作明细(导入-附件名称  修改-报单id)
     */
    private String operateDetail;
 
    /**
     * 附件地址(操作类型为修改 该字段为空)
     */
    private String attachmentUrl;
 
    /**
     * 上传状态 0-上传失败 1-上传成功 2-处理中
     */
    private Integer uploadStatus;
 
 
}

问:SnowOperateLogServiceImpl继承ServiceImpl就可以获得service层的方法,为什么还需要实现ISnowOperateLogService接口?

答:实现 ISnowOperateLogService 接口能够更方便地对业务进行扩展,一些复杂场景下的数据处理,MyBatisPlus 提供的 Service 方法可能无法处理,此时我们就需要自己编写代码,这时候只需在 ISnowOperateLogService 中定义自己的方法,并在 SnowOperateLogServiceImpl 中实现即可。具体见这行代码(SnowOperateLogServiceImpl类):

List<SnowOperateLog> snowOperateLogs = operateLogMapper.selectAllByOperator(operator);

四、Wrapper中的QueryWrapper常用ge,gt,lt,le等具体含义
这个自己看源码就行,具体的类在是com.baomidou.mybatisplus.core.conditions.interfaces.interface

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus是一个Java持久层框架,它在MyBatis的基础上提供了更加便捷和强大的功能。LambdaQueryWrapper是MyBatis-Plus中的一个查询条件构造器,它可以通过Lambda表达式来编写查询条件,使得代码更加简洁和易读。 使用LambdaQueryWrapper可以按照以下步骤进行: 1. 导入相关的依赖:在项目的pom.xml文件中添加MyBatis-Plus的依赖。 2. 创建LambdaQueryWrapper对象:通过LambdaQueryWrapper的构造方法创建一个查询条件构造器对象。 3. 编写查询条件:使用LambdaQueryWrapper对象的方法来编写查询条件。可以使用Lambda表达式来指定查询字段、条件和关联关系等。 4. 执行查询操作:调用MyBatis-Plus提供的相应方法执行查询操作,如selectList、selectOne等。 下面是一个简单的示例代码,演示如何使用LambdaQueryWrapper进行查询: ```java import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; importimport com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getUserListByAge(int age) { LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(User::getAge, age); return userMapper.selectList(queryWrapper); } } ``` 在上面的代码中,我们首先导入了LambdaQueryWrapper和Wrappers类。然后,在getUserListByAge方法中,我们创建了一个LambdaQueryWrapper对象queryWrapper,并使用eq方法指定了查询条件,即查询年龄等于指定值的用户记录。最后,调用userMapper的selectList方法执行查询操作,并返回查询结果。 这只是LambdaQueryWrapper的一个简单示例,你可以根据实际需求使用其他方法和条件来编写更复杂的查询条件。同时,MyBatis-Plus还提供了很多其他的功能和特性,你可以查阅官方文档来了解更多详情。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值