MybatisPlus是什么,为什么这么多人用TA(下)

简介: MybatisPlus是什么,为什么这么多人用TA

在这个示例中,我们使用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进行查询操作的示例:

// 查询数据
List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().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进行多租户查询操作的示例:

// 定义Mapper接口
public interface UserMapper extends BaseMapper<User> {}
// 动态切换数据源
DynamicDataSourceContextHolder.setDataSourceType("tenant_1");
List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAge, 18));
DynamicDataSourceContextHolder.clearDataSourceType();


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


3. 多租户SQL代码


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

# 创建租户表
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&characterEncoding=utf8
spring.datasource.tenant1.username = root
spring.datasource.tenant1.password = 123456
spring.datasource.tenant2.url = jdbc:mysql://localhost:3306/tenant2?useUnicode=true&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进行乐观锁更新操作的示例:

// 查询数据
User user = userMapper.selectById(1L);
// 更新数据
user.setName("Tom");
int rows = userMapper.update(user, new UpdateWrapper<User>().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代码:

# 创建用户表
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字段。


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

// 定义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<User> {}
// 配置枚举映射
@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文件方式。例如:

// 定义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提供的这些便捷功能,我们可以更方便地进行开发和维护,并提高应用程序的灵活性和可扩展性。

相关文章
|
SQL Java 数据库连接
|
7天前
|
SQL Java 数据库连接
mybatisplus QueryWrapper or写法
# MyBatis-Plus QueryWrapper的OR写法详解 MyBatis-Plus是一款基于MyBatis的增强工具,提供了丰富的简化操作,使开发者能更高效地进行数据库操作。`QueryWrapper`是MyBatis-Plus中用于构建查询条件的一个核心类,支持多种条件组合,包括AND和OR条件。本文将详细介绍如何使用 `QueryWrapper`实现OR条件的查询。 ## QueryWrapper简介 `QueryWrapper`用于构建动态SQL查询条件,它封装了各种条件构造方法,使得查询条件的构建更加简洁和直观。`QueryWrapper`中提供了丰富的方法来支持多
14 0
|
6月前
|
SQL
解决一个mybatisplus left join里有ur报错问题
解决一个mybatisplus left join里有ur报错问题
65 0
|
5月前
|
Java Spring
mybatisplus的typeAliasesPackage 配置
【6月更文挑战第20天】mybatisplus的typeAliasesPackage 配置
616 3
TienChin 引入 MyBatisPlus
在父工程当中添加版本号,统一管理:
50 0
|
算法 数据库
MyBatisPlus之id生成策略
MyBatisPlus之id生成策略
421 0
|
SQL XML Java
MybatisPlus是什么,为什么这么多人用TA(上)
MybatisPlus是什么,为什么这么多人用TA
|
数据库
MybatisPlus dynamic
MybatisPlus dynamic
MybatisPlus常用条件查询器Wrapper的使用
MybatisPlus常用条件查询器Wrapper的使用
125 0