前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MybatisPlus是什么,为什么这么多人用TA

MybatisPlus是什么,为什么这么多人用TA

作者头像
一只
发布2024-06-29 08:29:34
700
发布2024-06-29 08:29:34
举报

基础操作

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础操作
    • 1. 基础操作概念
      • 2. 基础操作示例
      • 分页查询
        • 1. 分页查询概念
          • 2. 分页查询示例
            • 3. 分页查询SQL代码
            • 条件构造器
              • 1. 条件构造器概念
                • 2. 条件构造器示例
                  • 3. 条件构造器SQL代码
                  • 自动填充
                    • 1. 自动填充概念
                      • 2. 自动填充示例
                        • 3. 自动填充SQL代码
                        • 代码生成器
                          • 1. 代码生成器概念
                            • 2. 代码生成器示例
                              • 3. 代码生成器SQL代码
                              • 性能优化
                                • 1. 性能优化概念
                                  • 2. 性能优化示例
                                    • 3. 性能优化SQL代码
                                    • 多租户
                                      • 1. 多租户概念
                                        • 2. 多租户示例
                                          • 3. 多租户SQL代码
                                          • 乐观锁
                                            • 1. 乐观锁概念
                                              • 2. 乐观锁示例
                                                • 3. 乐观锁SQL代码
                                                • 其他功能
                                                  • 1. 枚举映射
                                                    • 2. 注解式Mapper
                                                    相关产品与服务
                                                    应用性能监控
                                                    应用性能监控(Application Performance Management,APM)是一款应用性能管理平台,基于实时多语言应用探针全量采集技术,为您提供分布式性能分析和故障自检能力。APM 协助您在复杂的业务系统里快速定位性能问题,降低 MTTR(平均故障恢复时间),实时了解并追踪应用性能,提升用户体验。
                                                    领券
                                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档