Mybatis-Plus 真好用(乡村爱情加持) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX    Blogger

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

  •  
  •   hansonwang99 2019-04-12 07:32:52 +08:00 5580 次点击
    这是一个创建于 2379 天前的主题,其中的信息可能已经有所发展或是发生改变。

    乡村爱情


    写在前面

    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 配置

    项目配置

    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; } 
    • Mapper 类
    public interface UserMapper extends BaseMapper<User> { } 

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

    • Service 类

    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 ); } } 
    • Controller 类
    @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 就会出现

    Mybatis Plus 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 那条 刘大脑袋的记录

    image.png

    • 查询记录(普通查询,下文讲分页查询)

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


    最关心的分页问题

    • 首先装配分页插件
    @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } 
    • Mapper 类
    public interface UserMapper extends BaseMapper<User> { // 普通查询 User getUserByName( String userName ); // 分页查询 IPage<List<User>> getUsersPage( Page page, @Param("query") User user ); } 
    • Service 类
    @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 ); } } 
    • Controller 类
    @GetMapping( value = "/page") public Object getUserPage( Page page, User user ) { return userService.getUserPage( page, user ); } 

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

    分页查询结果

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


    写在最后

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



    7 条回复    2019-05-22 13:21:13 +08:00
    jiezhi
        1
    jiezhi  
       2019-04-12 07:52:40 +08:00 via iPhone
    很详细,虽然不是后端开发,还是要收藏支持一下
    zeromake
        2
    zeromake  
       2019-04-12 08:11:27 +08:00 via Android   7
    等一个 aipjson 的兄弟
    abcbuzhiming
        3
    abcbuzhiming  
       2019-04-12 09:39:11 +08:00
    mybatis-plus 是我目前见过的,最符合 active-record 和链式调用的模型,除了不支持 join,这一点是个遗憾,隔壁的 JOOQ 能支持简单的 join。
    至于 Apijson 啊,我用过这个东西,我只能说,它对整个 web 链条嵌入过深了,它如果专注数据层,受欢迎程度要大的多,某种程度上这东西满足了前端操控后端的梦想,但是对整个 web 请求链条的过度干预注定了这东西在后端流行不起来的。
    sagaxu
        4
    sagaxu  
       2019-04-12 09:41:56 +08:00 via Android   1
    jdbcTemplate 真香
    cyhulk
        5
    cyhulk  
       2019-04-12 11:01:43 +08:00
    我不管,我就喜欢写 xml
    unique
        6
    unique  
       2019-04-12 11:20:17 +08:00 via iPhone
    非常棒的框架,后排支持
    colinzhang
        7
    colinzhang  
       2019-05-22 13:21:13 +08:00
    @zeromake 哈哈哈哈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5421 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:28 PVG 16:28 LAX 01:28 JFK 04:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86