Mybatis-Plus 真好用(乡村爱情加持)

2019-04-12 07:32:52 +08:00
 hansonwang99


写在前面

MyBatis 的增强方案确实有不少,甚至有种感觉是现在如果只用 “裸 MyBatis ”,不来点增强插件都不好意思了。这不,在上一篇文章《 Spring Boot 项目利用 MyBatis Generator 进行数据层代码自动生成》 中尝试了一下 MyBatis Generator。这次来点更加先进的 Mybatis-Plus,SQL 语句都不用写了,分页也是自动完成,嗯,真香!


数据库准备

CREATE TABLE tbl_user
(
	user_id BIGINT(20) NOT NULL COMMENT '主键 ID',
	user_name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	user_age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	PRIMARY KEY (user_id)
) charset = utf8;

MyBatis-Plus 加持

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.1.0</version>
</dependency>

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</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>
	<version>8.0.12</version>
</dependency>

主要是 Mybatis Plus、Lombok (不知道 Lombok 干嘛的?[可以看这里]( https://www.codesheep.cn/2018/04/09/SpringBoot 优雅编码之:Lombok 加持 /))、Druid 连接池 等依赖。

项目配置

mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml

新增 MyBatis Plus 配置类

@Configuration
@MapperScan("cn.codesheep.springbtmybatisplus.mapper")
public class MyBatisConfig {
}

看到没,几乎零配置啊,下面就可以写业务逻辑了


业务编写

@Data
@TableName("tbl_user")
public class User {
    @TableId(value = "user_id")
    private Long userId;
    private String userName;
    private Integer userAge;
}
public interface UserMapper extends BaseMapper<User> {
}

这里啥接口方法也不用写,就可以实现增删改查了!

Service 接口:

public interface UserService extends IService<User> {
    int insertUser( User user );
    int updateUser( User user );
    int deleteUser( User user );
    User findUserByName( String userName );
    IPage getUserPage( Page page, User user );
}

Service 实现:

@Service
@AllArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    // 增
    @Override
    public int insertUser(User user) {
        return baseMapper.insert( user );
    }

    // 改
    @Override
    public int updateUser(User user) {
        return baseMapper.updateById( user );
    }

    // 删
    @Override
    public int deleteUser(User user) {
        return baseMapper.deleteById( user.getUserId() );
    }

    // 查
    @Override
    public User findUserByName( String userName ) {
        return baseMapper.getUserByName( userName );
    }
}
@RestController
@RequestMapping("/user")
public class UserContorller {

    @Autowired
    private UserService userService;

    // 增
    @PostMapping( value = "/insert")
    public Object insert( @RequestBody User user ) {
        return userService.insertUser( user );
    }

    // 改
    @PostMapping( value = "/update")
    public Object update( @RequestBody User user ) {
        return userService.updateUser( user );
    }

    // 删
    @PostMapping( value = "/delete")
    public Object delete( @RequestBody User user ) {
        return userService.deleteUser( user );
    }

    // 查
    @GetMapping( value = "/getUserByName")
    public Object getUserByName( @RequestParam String userName ) {
        return userService.findUserByName( userName );
    }
}

通过以上几个简单的步骤,我们就实现了 tbl_user表的增删改查,传统 MyBatis 的 XML 文件一个都不需要写!


实际实验 [《乡爱》加持]

很牛批的 logo 就会出现

接下来通过 Postman 来发送增删改查的请求

通过 Postman 随便插入几条记录 POST localhost:8089/user/insert

{"userId":3,"userName":"刘能","userAge":"58"}
{"userId":4,"userName":"赵四","userAge":"58"}
{"userId":5,"userName":"谢广坤","userAge":"58"}
{"userId":6,"userName":"刘大脑袋","userAge":"58"}

修改记录时需要带用户 ID,比如我们修改 赵四 那条记录的名字为 赵四( Zhao Four )

修改记录时同样需要带用户 ID,比如删除 ID=6 那条 刘大脑袋的记录

比如,按照名字来查询:GET localhost:8089/user/getUserByName?userName=刘能


最关心的分页问题

@Bean
public PaginationInterceptor paginationInterceptor() {
	return new PaginationInterceptor();
}
public interface UserMapper extends BaseMapper<User> {

    // 普通查询
    User getUserByName( String userName );

    // 分页查询
    IPage<List<User>> getUsersPage( Page page, @Param("query") User user );
}
@Service
@AllArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    // 查:普通查
    @Override
    public User findUserByName( String userName ) {
        return baseMapper.getUserByName( userName );
    }

    // 分页查
    @Override
    public IPage getUserPage(Page page, User user) {
        return baseMapper.getUsersPage( page, user );
    }
}
@GetMapping( value = "/page")
public Object getUserPage( Page page, User user ) {
	return userService.getUserPage( page, user );
}

实际实验一下,我们分页查询 年龄 = 58 的多条记录:

可以看到结果数据中,除了给到当前页数据,还把总记录条数,总页数等一并返回了,很是优雅呢 !


写在最后

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



5141 次点击
所在节点    Blogger
7 条回复
jiezhi
2019-04-12 07:52:40 +08:00
很详细,虽然不是后端开发,还是要收藏支持一下
zeromake
2019-04-12 08:11:27 +08:00
等一个 aipjson 的兄弟
abcbuzhiming
2019-04-12 09:39:11 +08:00
mybatis-plus 是我目前见过的,最符合 active-record 和链式调用的模型,除了不支持 join,这一点是个遗憾,隔壁的 JOOQ 能支持简单的 join。
至于 Apijson 啊,我用过这个东西,我只能说,它对整个 web 链条嵌入过深了,它如果专注数据层,受欢迎程度要大的多,某种程度上这东西满足了前端操控后端的梦想,但是对整个 web 请求链条的过度干预注定了这东西在后端流行不起来的。
sagaxu
2019-04-12 09:41:56 +08:00
jdbcTemplate 真香
cyhulk
2019-04-12 11:01:43 +08:00
我不管,我就喜欢写 xml
unique
2019-04-12 11:20:17 +08:00
非常棒的框架,后排支持
colinzhang
2019-05-22 13:21:13 +08:00
@zeromake 哈哈哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/554305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX