hansonwang99
V2EX  ›  Blogger

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

  •  
  •   hansonwang99 · Apr 12, 2019 · 6047 views
    This topic created in 2607 days ago, the information mentioned may be changed or developed.

    乡村爱情


    写在前面

    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 replies    2019-05-22 13:21:13 +08:00
    jiezhi
        1
    jiezhi  
       Apr 12, 2019 via iPhone
    很详细,虽然不是后端开发,还是要收藏支持一下
    zeromake
        2
    zeromake  
       Apr 12, 2019 via Android   ❤️ 7
    等一个 aipjson 的兄弟
    abcbuzhiming
        3
    abcbuzhiming  
       Apr 12, 2019
    mybatis-plus 是我目前见过的,最符合 active-record 和链式调用的模型,除了不支持 join,这一点是个遗憾,隔壁的 JOOQ 能支持简单的 join。
    至于 Apijson 啊,我用过这个东西,我只能说,它对整个 web 链条嵌入过深了,它如果专注数据层,受欢迎程度要大的多,某种程度上这东西满足了前端操控后端的梦想,但是对整个 web 请求链条的过度干预注定了这东西在后端流行不起来的。
    sagaxu
        4
    sagaxu  
       Apr 12, 2019 via Android   ❤️ 1
    jdbcTemplate 真香
    cyhulk
        5
    cyhulk  
       Apr 12, 2019
    我不管,我就喜欢写 xml
    unique
        6
    unique  
       Apr 12, 2019 via iPhone
    非常棒的框架,后排支持
    colinzhang
        7
    colinzhang  
       May 22, 2019
    @zeromake 哈哈哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   964 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 20:35 · PVG 04:35 · LAX 13:35 · JFK 16:35
    ♥ Do have faith in what you're doing.