MyBatisPlus全攻略:轻松掌握高级数据库操作

2024-07-02 08:16:45 浏览数 (3)

基础操作

MybatisPlus提供了一系列基础操作的封装,例如插入、更新、删除、查询等。这些操作都是通过Mapper接口和实现类来完成的,开发者只需要继承BaseMapper接口即可。

1. 基础操作概念

MybatisPlus的基础操作封装了常见的增删改查操作,使得开发者可以更容易地使用MybatisPlus进行数据库操作。这些基础操作是通过Mapper接口和实现类来完成的,开发者只需要继承BaseMapper接口即可。以下是MybatisPlus支持的基础操作:

  • 插入:insert、insertBatch、insertOrUpdate 等方法。- 更新:updateById、update、updateBatchById 等方法。- 删除:deleteById、deleteByMap、delete 等方法。- 查询:selectById、selectBatchIds、selectByMap、selectOne、selectList、selectPage等方法。
2. 基础操作示例

下面是一个使用MybatisPlus进行基础操作的示例:

代码语言:javascript复制
// 定义实体类
@Data
public class User {<!-- -->
    private Long id;
    private String name;
    private Integer age;
}

// 定义Mapper接口
public interface UserMapper extends BaseMapper&lt;User&gt; {<!-- -->}

// 插入数据
User user = new User();
user.setName("Tom");
user.setAge(18);
userMapper.insert(user);

// 更新数据
user.setName("Jerry");
userMapper.updateById(user);

// 删除数据
userMapper.deleteById(1L);

// 查询数据
User result = userMapper.selectById(2L);
List&lt;User&gt; users = userMapper.selectList(null);
Page&lt;User&gt; page = userMapper.selectPage(new Page&lt;&gt;(1, 10), null);

在这个示例中,我们定义了一个名为User的实体类,并继承了Serializable接口。然后,我们定义了一个名为UserMapper的Mapper接口,并继承了BaseMapper。在插入、更新、删除、查询数据时,我们分别调用了UserMapper中的insert、updateById、deleteById、selectById等方法,完成了基础操作。

以上就是MybatisPlus基础操作的概念和代码示例。通过使用MybatisPlus提供的基础操作,我们可以更快速、更方便地进行数据库操作,提高开发效率。

分页查询

MybatisPlus支持分页查询,并且提供了丰富的分页查询API,例如Page类、IPage接口、PaginationInterceptor插件等。

1. 分页查询概念

分页查询是一种常见的数据库查询方式,它将大量数据拆分成若干个小块进行查询,从而提高查询效率和用户体验。MybatisPlus提供了丰富的分页查询API,例如Page类、IPage接口、PaginationInterceptor插件等,使得开发者可以更方便地进行分页查询操作。

2. 分页查询示例

下面是一个使用MybatisPlus进行分页查询的示例:

代码语言:javascript复制
// 定义Mapper接口
public interface UserMapper extends BaseMapper&lt;User&gt; {<!-- -->}

// 分页查询数据
Page&lt;User&gt; page = new Page&lt;&gt;(1, 10);
QueryWrapper&lt;User&gt; wrapper = new QueryWrapper&lt;&gt;();
wrapper.eq("age", 18);
userMapper.selectPage(page, wrapper);

在这个示例中,我们定义了一个名为UserMapper的Mapper接口,并继承了BaseMapper。在分页查询数据时,我们首先创建了一个名为page的Page对象,指定当前页数为1,每页显示10条记录。然后,我们使用QueryWrapper构造器创建一个查询条件,查询年龄为18的用户信息。最后,我们调用userMapper的selectPage方法进行分页查询,并将查询结果赋值给page对象。

3. 分页查询SQL代码

MybatisPlus会自动根据传入的分页参数生成对应的SQL语句,以下是MybatisPlus生成的分页查询SQL示例:

代码语言:javascript复制
SELECT id,name,age FROM user WHERE age = ? LIMIT ?,?
-- 参数1:查询条件 age=18
-- 参数2:偏移量,即从第几条记录开始查询,例如当前页数为1,每页显示10条数据,则偏移量为0。
-- 参数3:每页显示的记录数,例如当前页数为1,每页显示10条数据,则每页显示的记录数为10。

以上就是MybatisPlus支持分页查询的概念、代码示例和生成的SQL语句。通过使用MybatisPlus提供的分页查询API,我们可以更方便地进行分页查询操作,并且可以提高查询效率和用户体验。

条件构造器

MybatisPlus提供了一种灵活、方便的条件构造器,可以根据动态条件生成SQL语句。常用的构造器有QueryWrapper和UpdateWrapper。

1. 条件构造器概念

条件构造器是MybatisPlus提供的一种灵活、方便的查询方式,可以根据动态条件生成SQL语句。常用的条件构造器有QueryWrapper和UpdateWrapper。QueryWrapper主要用于查询操作,UpdateWrapper主要用于更新操作。

2. 条件构造器示例

下面是一个使用MybatisPlus进行条件查询的示例:

代码语言:javascript复制
// 定义Mapper接口
public interface UserMapper extends BaseMapper&lt;User&gt; {<!-- -->}

// 构造查询条件
QueryWrapper&lt;User&gt; wrapper = new QueryWrapper&lt;&gt;();
wrapper.eq("age", 18);
if (StringUtils.isNotBlank(name)) {<!-- -->
    wrapper.like("name", name);
}
List&lt;User&gt; users = userMapper.selectList(wrapper);

在这个示例中,我们定义了一个名为UserMapper的Mapper接口,并继承了BaseMapper。在构造查询条件时,我们使用QueryWrapper构造器创建一个查询条件,查询年龄为18且姓名包含指定字符串的用户信息。其中,eq方法表示等于,like方法表示模糊匹配。如果传入姓名参数,则添加姓名匹配条件。最后,我们调用userMapper的selectList方法执行查询操作,并将查询结果赋值给users对象。

3. 条件构造器SQL代码

MybatisPlus会自动生成对应的SQL语句,以下是MybatisPlus生成的条件查询SQL示例:

代码语言:javascript复制
SELECT id,name,age FROM user WHERE age = ? AND name LIKE ?
-- 参数1:查询条件 age=18
-- 参数2:查询条件 name like '%xxx%'

以上就是MybatisPlus条件构造器的概念、代码示例和生成的SQL语句。通过使用MybatisPlus提供的条件构造器,我们可以更灵活地进行查询操作,并且可以根据动态条件生成对应的SQL语句,提高查询效率和可维护性。

自动填充

MybatisPlus支持自动填充数据库表中的某些字段,例如创建时间、更新时间等。可以通过实现MetaObjectHandler接口实现自动填充功能。

1. 自动填充概念

自动填充是MybatisPlus提供的一种方便、快捷的功能,它可以自动填充数据库表中的某些字段,例如创建时间、更新时间等。通过实现MetaObjectHandler接口并重写对应的方法,即可实现自动填充功能。

2. 自动填充示例

下面是一个使用MybatisPlus进行自动填充的示例:

代码语言:javascript复制
// 定义实体类
@Data
public class User {<!-- -->
    private Long id;
    private String name;
    private Integer age;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

// 实现MetaObjectHandler接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {<!-- -->
    @Override
    public void insertFill(MetaObject metaObject) {<!-- -->
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {<!-- -->
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

// 插入数据
User user = new User();
user.setName("Tom");
user.setAge(18);
userMapper.insert(user);

// 更新数据
user.setName("Jerry");
userMapper.updateById(user);

在这个示例中,我们定义了一个名为User的实体类,并在其中定义了创建时间和更新时间两个属性,并在其注解@TableField中指定了对应的填充策略。然后,我们实现了一个名为MyMetaObjectHandler的类,并继承了MetaObjectHandler接口,重写了insertFill、updateFill方法,分别表示插入和更新时填充对应的字段。最后,在插入和更新数据时,MybatisPlus会自动调用MyMetaObjectHandler的对应方法进行自动填充。

3. 自动填充SQL代码

自动填充是在Java层面进行处理的,不需要生成对应的SQL语句。

以上就是MybatisPlus自动填充的概念、代码示例和说明。通过使用MybatisPlus提供的自动填充功能,我们可以更方便地进行数据库操作,并且可以避免手动填充某些字段的繁琐工作。

代码生成器

MybatisPlus提供了一个强大的代码生成器,可以根据数据库表结构自动生成JavaBean、Mapper接口、XML文件等代码,极大地提高了开发效率。

1. 代码生成器概念

MybatisPlus提供了一个强大的代码生成器,可以根据数据库表结构自动生成JavaBean、Mapper接口、XML文件等代码,极大地提高了开发效率。通过使用代码生成器,我们可以快速生成基础的CURD代码,并且可以避免手写重复的代码。

2. 代码生成器示例

下面是一个使用MybatisPlus代码生成器的示例:

代码语言:javascript复制
// 配置代码生成器
AutoGenerator generator = new AutoGenerator();
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir("src/main/java");
globalConfig.setAuthor("Little B");
generator.setGlobalConfig(globalConfig);

DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&amp;characterEncoding=utf8");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("123456");
generator.setDataSource(dataSourceConfig);

PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.example.mybatisplusdemo");
packageConfig.setEntity("entity");
packageConfig.setMapper("mapper");
generator.setPackageInfo(packageConfig);

StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
strategyConfig.setEntityLombokModel(true);
strategyConfig.setRestControllerStyle(true);
strategyConfig.setInclude("user");
generator.setStrategy(strategyConfig);

TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setEntity("/templates/entity.java");
templateConfig.setMapper("/templates/mapper.java");
templateConfig.setXml("/templates/mapper.xml");
generator.setTemplate(templateConfig);

generator.execute();

在这个示例中,我们使用MybatisPlus提供的AutoGenerator类来配置代码生成器。首先,我们配置了全局配置信息(GlobalConfig),包括输出路径、作者等;然后,配置了数据源信息(DataSourceConfig),包括数据库类型、连接地址、用户名和密码等;接下来,配置了包信息(PackageConfig),包括父包路径、实体类包名、Mapper接口包名等;再次,配置了策略信息(StrategyConfig),包括表命名规则、列命名规则、是否使用Lombok等;最后,配置了模板信息(TemplateConfig),包括模板文件路径。完成配置后,我们调用generator的execute方法即可生成对应的代码。

3. 代码生成器SQL代码

代码生成器是在Java层面进行处理的,不需要生成对应的SQL语句。

以上就是MybatisPlus代码生成器的概念、代码示例和说明。通过使用MybatisPlus提供的代码生成器,我们可以快速生成基础的CURD代码,并且可以避免手写重复的代码,提高开发效率。

性能优化

MybatisPlus针对Mybatis的性能问题进行了优化,例如使用PreparedStatement代替Statement、使用缓存等。同时,MybatisPlus还提供了丰富的性能监控和调优工具。

1. 性能优化概念

MybatisPlus针对Mybatis的性能问题进行了优化,例如使用PreparedStatement代替Statement、使用缓存等。这些优化措施可以提高MybatisPlus的执行效率和性能表现。同时,MybatisPlus还提供了丰富的性能监控和调优工具,可以帮助开发人员更好地分析和优化代码性能。

2. 性能优化示例

下面是一个使用MybatisPlus进行查询操作的示例:

代码语言:javascript复制
// 查询数据
List&lt;User&gt; users = userMapper.selectList(new LambdaQueryWrapper&lt;User&gt;().eq(User::getAge, 18).like(StringUtils.isNotBlank(name), User::getName, name));

在这个示例中,我们使用了MybatisPlus提供的LambdaQueryWrapper构造器构建查询条件,并执行selectList方法进行查询操作。其中,eq方法表示相等条件,like方法表示模糊匹配条件,StringUtils.isNotBlank(name)表示判断字符串name是否为空。MybatisPlus会智能处理这些条件,并生成对应的SQL语句。

3. 性能优化SQL代码

MybatisPlus使用了一系列优化措施来提高性能,例如使用PreparedStatement代替Statement、使用缓存等。以下是一些SQL优化技巧:

  • 使用PreparedStatement代替Statement:PreparedStatement是预编译的SQL语句,可以减少SQL语句解析和编译时间,提高执行效率。- 使用批量提交:将多条SQL语句一起提交可以减少与数据库的交互次数,提高执行效率。- 使用缓存:MybatisPlus默认开启了二级缓存,可以将查询结果缓存到内存中,减少访问数据库的次数,提高查询效率。- 避免使用not in:not in语句会导致全表扫描,性能较差。可以使用其他方式替代,如使用left join。 以上就是MybatisPlus的性能优化概念、代码示例和SQL优化技巧。通过遵循这些优化建议,我们可以更好地优化MybatisPlus应用程序的性能表现。

多租户

MybatisPlus支持多租户模式,可以根据不同的租户动态切换数据源。

1. 多租户概念

多租户是指在一个应用程序中,为不同的租户提供独立的数据空间,可以根据不同的租户动态切换数据源。MybatisPlus支持多租户模式,可以为每个租户配置独立的数据源,并在运行时动态切换数据源。

2. 多租户示例

下面是一个使用MybatisPlus进行多租户查询操作的示例:

代码语言:javascript复制
// 定义Mapper接口
public interface UserMapper extends BaseMapper&lt;User&gt; {<!-- -->}

// 动态切换数据源
DynamicDataSourceContextHolder.setDataSourceType("tenant_1");
List&lt;User&gt; users = userMapper.selectList(new LambdaQueryWrapper&lt;User&gt;().eq(User::getAge, 18));
DynamicDataSourceContextHolder.clearDataSourceType();

在这个示例中,我们首先定义了一个名为UserMapper的Mapper接口,继承了BaseMapper,表示对User表进行操作。然后,我们调用DynamicDataSourceContextHolder类的setDataSourceType方法切换数据源,再执行查询操作。最后,清除数据源信息。

3. 多租户SQL代码

多租户需要配置多个数据源,并在运行时根据租户信息动态切换数据源。以下是一些相关的SQL代码:

代码语言:javascript复制
# 创建租户表
CREATE TABLE tenant (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32) NOT NULL,
    db_url VARCHAR(128) NOT NULL,
    db_username VARCHAR(32) NOT NULL,
    db_password VARCHAR(32) NOT NULL
);

# 创建租户1的用户表
CREATE TABLE user_tenant_1 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32) NOT NULL,
    age INT NOT NULL
);

# 创建租户2的用户表
CREATE TABLE user_tenant_2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32) NOT NULL,
    age INT NOT NULL
);

# 配置多数据源信息
spring.datasource.tenant1.url = jdbc:mysql://localhost:3306/tenant1?useUnicode=true&amp;characterEncoding=utf8
spring.datasource.tenant1.username = root
spring.datasource.tenant1.password = 123456

spring.datasource.tenant2.url = jdbc:mysql://localhost:3306/tenant2?useUnicode=true&amp;characterEncoding=utf8
spring.datasource.tenant2.username = root
spring.datasource.tenant2.password = 123456

# 配置MybatisPlus多租户插件
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: is_deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
      sql-injector: com.baomidou.mybatisplus.extension.injector.LogicSqlInjector
      tenant-handler: com.example.mybatisplusdemo.handler.MyTenantHandler
  configuration:
    map-underscore-to-camel-case: true
    use-generated-keys: true
    default-auto-mapping-type: full
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    plugins:
      - com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor
      - com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor
      - com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParserPlugin

以上就是MybatisPlus多租户的概念、代码示例和SQL代码。通过使用MybatisPlus提供的多租户功能,我们可以为不同的租户提供独立的数据空间,并根据不同的租户动态切换数据源,提高应用程序的灵活性和应用场景的适配性。

乐观锁

MybatisPlus提供了乐观锁功能,可以避免并发更新时的数据冲突问题。

1. 乐观锁概念

乐观锁是指在并发更新时,通过版本号等方式进行并发控制,避免不必要的数据冲突问题。MybatisPlus提供了乐观锁功能,可以自动对实体类中的某个字段进行版本号控制,并在更新时自动检测版本号是否一致,如果不一致则抛出OptimisticLockException异常,提示用户重新获取最新数据。

2. 乐观锁示例

下面是一个使用MybatisPlus进行乐观锁更新操作的示例:

代码语言:javascript复制
// 查询数据
User user = userMapper.selectById(1L);

// 更新数据
user.setName("Tom");
int rows = userMapper.update(user, new UpdateWrapper&lt;User&gt;().eq(User::getId, user.getId()).eq(User::getVersion, user.getVersion()));
if (rows == 0) {
    throw new OptimisticLockException("更新失败:数据已被其他用户修改,请刷新后重试!");
}

在这个示例中,我们首先查询出id为1的User对象,并进行更新操作。在更新时,我们使用UpdateWrapper构建更新条件,并同时比较version字段是否一致,如果版本号不一致则说明数据已经被其他用户修改,此时抛出OptimisticLockException异常,提示用户重新获取最新数据。

3. 乐观锁SQL代码

乐观锁需要给实体类增加一个版本号字段,并在更新时自动进行版本号校验。以下是一些相关的SQL代码:

代码语言:javascript复制
# 创建用户表
CREATE TABLE user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32) NOT NULL,
    age INT NOT NULL,
    version INT DEFAULT 0 NOT NULL
);

# 插入数据
INSERT INTO user (name, age) VALUES ('Tom', 18);

# 修改数据
UPDATE user SET name = 'Jerry', version = version   1 WHERE id = 1 and version = 0;

以上就是MybatisPlus乐观锁的概念、代码示例和SQL代码。通过使用MybatisPlus提供的乐观锁功能,我们可以在并发更新时避免数据冲突问题,并提高应用程序的并发性能和数据一致性。

其他功能

除了以上功能外,MybatisPlus还提供了很多其他便捷的功能,例如枚举映射、注解式Mapper等。

1. 枚举映射

MybatisPlus提供了枚举映射功能,可以将Java中的枚举类型映射到数据库中的某个字段,并实现自动转换。例如,将Java中的Gender枚举类型映射到user表的gender字段。

下面是一个使用枚举映射功能的示例:

代码语言:javascript复制
// 定义Gender枚举类型
public enum Gender {<!-- -->
    MALE(1),
    FEMALE(2);

    private Integer code;

    Gender(Integer code) {<!-- -->
        this.code = code;
    }

    public Integer getCode() {<!-- -->
        return code;
    }
}

// 定义User实体类
@Data
public class User {<!-- -->
    private Long id;
    private String name;
    private Integer age;
    private Gender gender;
}

// 定义UserMapper接口
public interface UserMapper extends BaseMapper&lt;User&gt; {<!-- -->}

// 配置枚举映射
@Configuration
public class MybatisPlusConfig {<!-- -->

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {<!-- -->
        return new ConfigurationCustomizer() {<!-- -->
            @Override
            public void customize(Configuration configuration) {<!-- -->
                configuration.getTypeHandlerRegistry().register(Gender.class, EnumTypeHandler.class);
            }
        };
    }
}

在这个示例中,我们首先定义了一个名为Gender的枚举类型,用于表示用户的性别。然后,定义了User实体类,并将gender字段与Gender枚举类型映射。最后,配置了MybatisPlusConfig,注册了EnumTypeHandler枚举类型处理器。

2. 注解式Mapper

MybatisPlus提供了注解式Mapper功能,可以通过注解方式定义Mapper接口,而不是传统的XML文件方式。例如:

代码语言:javascript复制
// 定义UserMapper接口
@Mapper
public interface UserMapper {<!-- -->

    @Select("select * from user where id = #{id}")
    User selectById(@Param("id") Long id);

    @Insert("insert into user (name, age) values (#{name}, #{age})")
    int insert(User user);

    @Update("update user set name = #{name} where id = #{id}")
    int updateNameById(@Param("id") Long id, @Param("name") String name);

    @Delete("delete from user where id = #{id}")
    int deleteById(@Param("id") Long id);
}

在这个示例中,我们使用@Mapper注解定义了一个名为UserMapper的Mapper接口,并通过注解方式定义了一些基本的CURD方法。

以上就是MybatisPlus的其他便捷功能的概念、代码示例和SQL代码。通过使用MybatisPlus提供的这些便捷功能,我们可以更方便地进行开发和维护,并提高应用程序的灵活性和可扩展性。

0 人点赞