MyBatis-Plus使用入门

一、准备工作

1.1 数据库MySQL

下载安装过程略。

1.2 数据库可视化工具DBeaver

下载安装过程略。

1.3 表及数据的准备

  • 创建表

    CREATE TABLE `zx_user` (
      `user_id` bigint(20) NOT NULL COMMENT '用户ID',
      `user_name` varchar(30) DEFAULT NULL COMMENT '用户姓名',
      `age` int(11) DEFAULT NULL COMMENT '用户年龄',
      `user_email` varchar(50) DEFAULT NULL COMMENT '用户邮箱',
      PRIMARY KEY (`user_id`),
      UNIQUE KEY `zx_user_un` (`user_id`),
      UNIQUE KEY `zx_user_un2` (`user_email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
  • 插入测试数据

    INSERT INTO zx_user (user_id, user_name, age, user_email) VALUES
    (1, 'Jone', 18, '[email protected]'),
    (2, 'Jack', 20, '[email protected]'),
    (3, 'Tom', 28, '[email protected]'),
    (4, 'Sandy', 21, '[email protected]'),
    (5, 'Billie', 24, '[email protected]');
    

1.4 SpringBoot工程下载

start.spring.io上下载一个SpringBoot工程,要求的依赖有web,导入本地IDEA后,创建子项目mybatis和mybatis-plus,分别演示各自功能的使用。

父工程pom需要增加mysql驱动依赖、连接池依赖和Lombok依赖:


    mysql
    mysql-connector-java
    8.0.25


    com.alibaba
    druid-spring-boot-starter
    1.2.6


    org.projectlombok
    lombok

mybatis子工程的pom还需要增加如下依赖项:


    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    2.2.0

mybatis-plus子工程pom还需要增加如下依赖项:


    com.baomidou
    mybatis-plus-boot-starter
    3.4.3

1.5 数据源配置

mybatis子项目做如下的配置。

application.properties中加上如下的配置。

# 配置数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/zhangxun?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# 配置mapper xml的位置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

# 是否显示执行sql
logging.level.com.xun.mapper=debug

mybatis-plus做如下的配置。

application.properties中加上如下的配置。

# 配置数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/zhangxun?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# 是否显示执行sql
logging.level.com.xun.mapper=debug

二、MyBatis增删查改案例

2.1 新建实体类

在合适的包下面新建实体类。

@Data
public class User {

    private Long userId;
    private String userName;
    private Integer age;
    private String userEmail;

}

2.2 新建Mapper接口

路径为com.xun.mapper,后续在启动类上设置@MapperScan时需要指定该路径。

@Repository
public interface UserMapper {

    public List listUsers();

    public List getUserById(String userId);

    public Integer addUser(User user);

    public Integer deleteUserById(String userId);

    public Integer updateUserNameById(User user);
}

2.3 新建Mapper.xml

在resources/mapper下面新建该文件UserMapper.xml





    
        insert into zx_user (user_id, user_name, age, user_email)
        values (#{userId}, #{userName}, #{age}, #{userEmail});
    

    
        update zx_user set user_name = #{userName} where user_id = #{userId}
    

    
        delete from zx_user where user_id = #{userId}
    

    

    

2.4 新建controller

@RestController
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/listUsers")
    public List listUsers(){
        return userMapper.listUsers();
    }

    @GetMapping("/getUserById/{userId}")
    public List getUserById(@PathVariable String userId){
        return userMapper.getUserById(userId);
    }

    @PostMapping("/addUser")
    public Integer addUser(@RequestBody User user){
        return userMapper.addUser(user);
    }

    @DeleteMapping("/deleteUserById/{userId}")
    public Integer deleteUserById(@PathVariable String userId){
        return userMapper.deleteUserById(userId);
    }

    @PutMapping("/updateUserNameById")
    public Integer updateUserNameById(@RequestBody User user){
        return userMapper.updateUserNameById(user);
    }
}

2.4 配置启动

@MapperScan("com.xun.mapper")
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

最后使用postman模拟测试,全部成功。

三、MyBatis-Plus增删查改案例

3.1 新建实体类

在合适的包下面新建实体类,其中@TableName不是必须的,如果不写或者只写该注解不带值,那么默认查询的表名称就是实体类的名称User,如果表名和实体类名不一致,就需要像如下一样绑定表名和实体类名。

@Data
@TableName("zx_user")
public class User {

    private Long userId;
    private String userName;
    private Integer age;
    private String userEmail;

}

默认情况下mybatis-plus会认为实体类字段名称和数据库表字段的名称是对应的,比如userName对应user_name,userId对应user_id,age对应age;如果实体类的字段名称是userNameStr,那么就会去数据库表中找user_name_str字段,所以,如果不存在对应关系的话,就需要增加注解@TableField,通过value属性指定该实体类字段对应的数据库表字段名称,如下所示:

@TableField("user_name")
private String userNameStr;

3.2 新建Mapper接口

路径为com.xun.mapper,后续在启动类上设置@MapperScan时需要指定该路径。

public interface UserMapper extends BaseMapper {
}

其中,Mapper接口需要继承BaseMapper父类,父类中包含了常用的增删查改方法,我们就不用自己再定义了,甚至都不用再写xml文件了。

3.3 新建Controller

3.3.1 查询

  • selectList

    @GetMapping("/listUsers")
    public List listUsers(){
        // SELECT user_id,user_name,age,user_email FROM zx_user
        return userMapper.selectList(null);
    }
    

    如果想根据某个条件进行查询:

    @GetMapping("/getUserById/{userId}")
    public List getUserById(@PathVariable String userId){
        QueryWrapper queryWrapper = new QueryWrapper<>();
        // "user_id"指定数据库表字段名称,eq代表等于
        queryWrapper.eq("user_id", userId);
        // SELECT user_id,user_name,age,user_email FROM zx_user WHERE (user_id = ?)
        return userMapper.selectList(queryWrapper);
    }
    
  • selectById

    @GetMapping("/getSingleUserById/{userId}")
    public User getSingleUserById(@PathVariable String userId){
        // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_id=?
        return userMapper.selectById(userId);
    }
    

    要想如上根据Id来进行查询能正常执行,我们需要指定实体类中那个字段是Id,不然mubatis-plus就无法工作了,比如:

    @Data
    @TableName("zx_user")
    public class User {
        @TableId
        private Long userId;
        private String userName;
        private Integer age;
        private String userEmail;
    }
    

    @TableId有两个属性,value可以指定数据库表字段的名字,type表示这个Id的规则,具体有如下枚举选项:

    /**
         * 数据库ID自增
         * 

    该类型请确保数据库设置了 ID自增 否则无效

    */ AUTO(0), /** * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) */ NONE(1), /** * 用户输入ID *

    该类型可以通过自己注册自动填充插件进行填充

    */ INPUT(2), /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */ /** * 分配ID (主键类型为number或string), * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法) * * @since 3.3.0 */ ASSIGN_ID(3), /** * 分配UUID (主键类型为 string) * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-","")) */ ASSIGN_UUID(4);

    我们现在还不涉及插入,此处可以先保持默认。

  • selectBatchIds

    基本用法同上面的selectById,只不过是根据多个Id进行查询。

    @GetMapping("/getUserByIds/{userIds}")
    public List getUserByIds(@PathVariable String userIds){
        List userIdList = Arrays.asList(userIds.split(","));
        // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_id IN ( ? , ? , ? )
        return userMapper.selectBatchIds(userIdList);
    }
    
  • selectByMap

    @GetMapping("/getUserByName/{userName}")
    public List getUserByName(@PathVariable String userName) {
        Map paramMap = new HashMap<>();
        // 还可以输入多个其它查询条件
        paramMap.put("user_name", userName);
        // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_name = ?
        return userMapper.selectByMap(paramMap);
    }
    
  • selectCount

    用于计算满足查询条件的记录数量。

    @GetMapping("/countUsers/{userId}")
    public Integer countUsers(@PathVariable String userId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        // SELECT COUNT( * ) FROM zx_user WHERE (user_id = ?)
        return userMapper.selectCount(queryWrapper);
    }
    
  • selectOne

    用于确保只返回一条满足查询条件的记录,倘若查到的记录数大于1,系统就会报错。

    @GetMapping("/getSingleUser/{userId}")
    public User getSingleUser(@PathVariable String userId) {
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        // SELECT user_id,user_name,age,user_email FROM zx_user WHERE (user_id = ?)
        return userMapper.selectOne(queryWrapper);
    }
    

3.3.2 新增

@PostMapping("/addUser")
public Integer addUser(@RequestBody User user){
    // INSERT INTO zx_user ( user_id, user_name, age, user_email ) VALUES ( ?, ?, ?, ? )
    return userMapper.insert(user);
}

新增的时候需要注意的是,主键应该如何生成,此时我们的实体类User上面没有指定主键@TableId的规则,默认就是NONE,表示由用户输入。下面对各种主键规则进行介绍:

  • NONE和INPUT,表示由用户输入;
  • AUTO表示需要自增,前提是数据库表中该主键设置了自增特性;
  • ASSIGN_ID和ASSIGN_UUID表示当插入数据的主键为空时由特定算法给生成一个;

3.3.3 修改

// 更新操作
@PutMapping("/updateUserNameById")
public Integer updateUserNameById(@RequestBody User user){
    // UPDATE zx_user SET user_name=? WHERE user_id=?
    return userMapper.updateById(user);
}

@PutMapping("/update/{userName}")
public Integer update(@RequestBody User user, @PathVariable String userName){
    QueryWrapper queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user_name", userName);
    // user参数表示需要更新的内容,wrapper表示匹配记录的条件
    // 即使user参数中有userId,也不会去更新数据库的主键user_id
    // UPDATE zx_user SET user_name=?, age=? WHERE (user_name = ?)
    return userMapper.update(user, queryWrapper);
}

3.3.4 删除

删除操作的方法和查询非常类似,这里就不做详细讲解,直接给出代码示例。

@DeleteMapping("/deleteUserById/{userId}")
public Integer deleteUserById(@PathVariable String userId){
    // DELETE FROM zx_user WHERE user_id=?
    return userMapper.deleteById(userId);
}

@DeleteMapping("/deleteBatchIds/{userIds}")
public Integer deleteBatchIds(@PathVariable String userIds){
    List userIdList = Arrays.asList(userIds.split(","));
    // DELETE FROM zx_user WHERE user_id IN ( ? , ? )
    return userMapper.deleteBatchIds(userIdList);
}

@DeleteMapping("/deleteByMap/{userName}")
public Integer deleteByMap(@PathVariable String userName){
    Map paramMap = new HashMap<>();
    // 还可以输入多个其它查询条件
    paramMap.put("user_name", userName);
    // DELETE FROM zx_user WHERE user_name = ?
    return userMapper.deleteByMap(paramMap);
}

@DeleteMapping("/delete/{userId}")
public Integer delete(@PathVariable String userId){
    QueryWrapper queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user_id", userId);
    // DELETE FROM zx_user WHERE (user_id = ?)
    return userMapper.delete(queryWrapper);
}

3.4 配置启动

@MapperScan("com.xun.mapper")
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

最后使用postman模拟测试,全部成功。

你可能感兴趣的:(MyBatis-Plus使用入门)