V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX  ›  Blogger

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

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

    乡村爱情


    写在前面

    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   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.