MyBatis-Plus 超详细笔记|配置使用|多种查询|常用注解

这篇具有很好参考价值的文章主要介绍了MyBatis-Plus 超详细笔记|配置使用|多种查询|常用注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mybatis-Plus可以节省大量时间,所有的CRUD代码都可以自动化完成。

MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其在 MyBatis 的基础上提供了很多方便的 CRUD 操作、分页查询、逻辑删除、自动填充等功能。

1 使用流程

添加MyBatis-Plus的依赖

在Maven项目中,需要在pom.xml中添加以下依赖:

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus</artifactId>
  <version>最新版本号</version>
</dependency>

编写配置文件

当我们使用springboot时,可以直接使用properties文件来直接配置,而不再是xml文档。

编写application.properties :

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:xxxx/database?useSSL=false&useUnicode=true&characterEncoding=utf8
spring.datasource.username=xxx
spring.datasource.password=xxx
server.port=8080

配置MyBatis-Plus的Mapper扫描

在Spring Boot项目中,可以通过配置类来配置MyBatis-Plus的Mapper扫描:

@Configuration
@MapperScan("com.example.mapper")
public class MybatisPlusConfig {
}

其中,com.example.mapper是Mapper接口所在的包名。

创建实体类

创建实体类,用于映射数据库表。例如:

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

在实体类上可以使用@TableName注解指定对应的数据库表名,使用@TableId注解指定主键,type属性指定主键生成策略。

创建Mapper接口

创建Mapper接口,用于执行CRUD操作。例如:

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

在Mapper接口上可以使用@Mapper注解标识该接口为MyBatis的Mapper接口,使用BaseMapper作为父接口,可以自动获得一些常用的CRUD方法,无需手动编写SQL语句。

使用Mapper接口执行CRUD操作

使用Mapper接口可以方便地执行CRUD操作。例如:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public void addUser(User user) {
        userMapper.insert(user);
    }

    public void updateUser(User user) {
        userMapper.updateById(user);
    }

    public void deleteUser(Long id) {
        userMapper.deleteById(id);
    }

    public User getUser(Long id) {
        return userMapper.selectById(id);
    }

    public List<User> listUsers() {
        return userMapper.selectList(null);
    }
}

2 查询

基础查询操作

查询全部数据

查询表中全部数据可以使用 selectList 方法,该方法返回一个 List 集合,其中包含了所有符合条件的数据。

List<User> userList = userMapper.selectList(null);

根据条件查询数据

根据条件查询数据可以使用 selectList 方法,该方法需要传入一个 Wrapper 对象作为参数,Wrapper 对象可以使用 QueryWrapper 类或 LambdaQueryWrapper 类创建。下面是一个使用 QueryWrapper 的示例:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三");
List<User> userList = userMapper.selectList(wrapper);

上述代码将查询名字为“张三”的用户数据。

查询单条数据

查询单条数据可以使用 selectOne 方法,该方法返回一个单个对象,如果查询结果为空,返回 null。下面是一个查询 ID 为 1 的用户的示例:

User user = userMapper.selectOne(new QueryWrapper<User>().eq("id", 1));

查询数据条数

查询数据条数可以使用 selectCount 方法,该方法返回一个 long 类型的数据。下面是一个查询名字为“张三”的用户数据条数的示例:

long count = userMapper.selectCount(new QueryWrapper<User>().eq("name", "张三"));

条件构造器

条件构造器是 MyBatis-Plus 中提供的一个用于构造 SQL 查询条件的工具类,可以方便地构造出各种复杂的查询条件。MyBatis-Plus 中有两种条件构造器:QueryWrapperLambdaQueryWrapper,其中 LambdaQueryWrapper 使用 lambda 表达式来构造条件,更加方便易用。

等于条件

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三");

上述代码将查询名字为“张三”的用户数据。

不等于条件

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ne("name", "张三");

等等......

分页查询数据

分页查询数据可以使用 selectPage 方法,该方法需要传入一个 Page 对象作为参数。Page 对象需要指定当前页码和每页显示的数据条数,同时可以指定查询条件和排序方式。

public List<User> queryUserPage(Integer pageNum, Integer pageSize) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.orderByAsc("id");
    Page<User> page = new Page<>(pageNum, pageSize);
    IPage<User> iPage = userService.page(page, wrapper);
    return iPage.getRecords();
}

上述代码中,QueryWrapper 对象用于设置查询条件,orderByAsc 方法用于设置查询结果的升序排序,Page 对象用于设置分页查询的当前页码和每页记录数,IPage 接口表示分页查询的结果,getRecords 方法用于获取查询结果。

例如,调用 queryUserPage(1, 10) 方法将查询第 1 页、每页 10 条记录的用户数据。

下面是一个分页查询示例:

Page<User> page = new Page<>(1, 10);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 18);
wrapper.orderByAsc("id");
userMapper.selectPage(page, wrapper);

上述代码将查询年龄为 18 岁的用户数据,并按照 ID 升序排序,返回第一页的数据,每页显示 10 条。

多表查询

使用 mybatis-plus 进行多表查询需要注意以下几点:

  1. 实体类中必须包含关联表的属性,例如要查询 user 表和 role 表的数据,User 实体类中必须包含 List<Role> 属性。
  2. 在查询方法中必须设置好关联表的映射关系,例如使用 leftJoin 方法设置 user 表和 role 表的关联条件。

下面以查询用户和角色数据为例,演示如何使用 mybatis-plus 进行多表查询。

假设有一个 Role 实体类,对应数据库中的 role 表,代码如下:

@Data
public class Role {
    private Long id;
    private String name;
    private Long userId;
}

假设 User 实体类中包含 List<Role> 属性,代码如下:

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private List<Role> roles;
}

假设有一个 UserService 接口,对应操作 user 表和 role 表的数据,代码如下:

public interface UserService extends IService<User> {
    List<User> queryUserAndRole();
}

下面演示如何使用 mybatis-plus 进行多表查询。

@Override
public List<User> queryUserAndRole() {
    return baseMapper.selectList(new QueryWrapper<User>().lambda()
            .select(User.class, info -> !info.getColumn().getProperty().equals("roles"))
            .select(Role.class, info -> !info.getColumn().getProperty().equals("user"))
            .eq(User::getId, 1)
            .leftJoin(Role.class, Role::getUserId, User::getId)
            .list(User.class));
}

上述代码中,QueryWrapper 对象用于设置查询条件,select 方法用于设置查询结果包含哪些属性,eq 方法用于设置查询条件,leftJoin 方法用于设置关联表的映射关系,list 方法用于设置查询结果的返回类型。

调用 queryUserAndRole() 方法将查询 ID 为 1 的用户数据以及与该用户关联的角色数据。

如果要查询多个关联表的数据,只需要在 leftJoin 方法中添加多个关联条件即可,例如要查询 user 表、role 表和 permission 表的数据,可以使用以下代码:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("id", 1)
       .leftJoin(Role.class, Role::getUserId, User::getId)
       .leftJoin(Permission.class, Permission::getRoleId, Role::getId);
List<User> userList = userService.list(wrapper);

上述代码中,Permission 实体类对应数据库中的 permission 表,UserRole 实体类对应数据库中的 user_role 表。

3 常用注解

Mybatis-Plus提供了许多注解用于进行CRUD操作,这些注解包括:

  • @TableName:用于指定表名
  • @TableField:用于指定字段名
  • @TableId:用于指定主键
  • @TableLogic:用于指定逻辑删除字段
  • @Version:用于指定乐观锁字段
  • @SqlParser:用于指定SQL解析器
  • @Insert:用于插入数据
  • @Update:用于更新数据
  • @Select:用于查询数据
  • @Delete:用于删除数据

下面我们将分别介绍这些注解的使用方法。

@TableName注解

@TableName注解用于指定实体类对应的数据库表名。当实体类名与表名不一致时,可以使用该注解指定表名。

例如,我们有一个名为User的实体类,对应的数据库表名为t_user。那么我们可以在实体类上添加@TableName注解,指定表名为t_user:

@TableName("t_user")
public class User {
    // 实体类代码
}

@TableField注解

@TableField注解用于指定实体类中属性数据库表中字段的映射关系。当属性名与字段名不一致时,可以使用该注解指定映射关系。

例如,我们有一个名为User的实体类,其中属性id对应数据库表中的字段user_id。那么我们可以在id属性上添加@TableField注解,指定映射关系:

public class User {
    @TableId
    @TableField("user_id")
    private Long id;
    // 其他属性代码
}

@TableId注解

@TableId注解用于指定实体类对应的主键,支持多种主键生成策略。当实体类中存在多个属性被@TableId注解修饰时,Mybatis-Plus会自动识别出哪个是主键。

例如,我们有一个名为User的实体类,其中属性id为主键。那么我们可以在id属性上添加@TableId注解:

public class User {
    @TableId
    private Long id;
    // 其他属性代码
}

@TableLogic注解

@TableLogic注解用于指定逻辑删除字段。当表中存在逻辑删除字段时,可以使用该注解指定该字段。

例如,我们有一个名为User的实体类,其中有一个名为deleted的属性用于表示逻辑删除。那么我们可以在deleted属性上添加@TableLogic注解:

public class User {
    @TableLogic
    private Boolean deleted;
    // 其他属性代码
}

@Version注解

@Version注解用于指定乐观锁字段。当表中存在乐观锁字段时,可以使用该注解指定该字段。

例如,我们有一个名为User的实体类,其中有一个名为version的属性用于表示乐观锁。那么我们可以在version属性上添加@Version注解:

public class User {
    @Version
    private Integer version;
    // 其他属性代码
}

@SqlParser注解

@SqlParser注解用于指定SQL解析器,可以在SQL执行前后对SQL进行解析。该注解需要与@Select、@Insert、@Update、@Delete注解一起使用。

例如,我们有一个名为UserMapper的Mapper接口,其中有一个名为selectList的查询方法。那么我们可以在selectList方法上添加@SqlParser注解,指定SQL解析器:

public interface UserMapper extends BaseMapper<User> {
    @SqlParser(filter = true)
    @Select("select * from t_user")
    List<User> selectList();
}

@Insert注解

@Insert注解用于插入数据。在使用该注解时,需要指定SQL语句中的表名和字段名,以及要插入的数据。

例如,我们有一个名为User的实体类,其中有id和name两个属性。那么我们可以在Mapper接口中添加一个名为insertUser的方法,使用@Insert注解进行插入操作:

public interface UserMapper extends BaseMapper<User> {
    @Insert("insert into t_user(id, name) values(#{id}, #{name})")
    int insertUser(@Param("id") Long id, @Param("name") String name);
}

@Update注解

@Update注解用于更新数据。在使用该注解时,需要指定SQL语句中的表名和字段名,以及要更新的数据。

例如,我们有一个名为User的实体类,其中有id和name两个属性。那么我们可以在Mapper接口中添加一个名为updateUser的方法,使用@Update注解进行更新操作:

public interface UserMapper extends BaseMapper<User> {
    @Update("update t_user set name=#{name} where id=#{id}")
    int updateUser(@Param("id") Long id, @Param("name") String name);
}

@Select注解

@Select注解用于查询数据。在使用该注解时,需要指定SQL语句中的表名和字段名。

例如,我们有一个名为User的实体类,其中有id和name两个属性。那么我们可以在Mapper接口中添加一个名为selectUserById的方法,使用@Select注解进行查询操作:

public interface UserMapper extends BaseMapper<User> {
    @Select("select * from t_user where id=#{id}")
    User selectUserById(@Param("id") Long id);
}

@Delete注解

@Delete注解用于删除数据。在使用该注解时,需要指定SQL语句中的表名和字段名,以及要删除的数据。

例如,我们有一个名为User的实体类,其中有id和name两个属性。那么我们可以在Mapper接口中添加一个名为deleteUser的方法,使用@Delete注解进行删除操作:

public interface UserMapper extends BaseMapper<User> {
    @Delete("delete from t_user where id=#{id}")
    int deleteUser(@Param("id") Long id);
}

@SelectProvider注解

@SelectProvider注解用于自定义SQL查询语句。在使用该注解时,需要指定一个类,该类需要实现Provider接口,并实现一个名为sql的方法,该方法返回一个String类型的SQL查询语句。

例如,我们有一个名为UserProvider的类,其中实现了Provider接口,并实现了一个名为sql的方法,该方法返回一个查询所有用户的SQL语句。那么我们可以在Mapper接口中添加一个名为selectAllUser的方法,使用@SelectProvider注解进行查询操作:

public interface UserMapper extends BaseMapper<User> {
    @SelectProvider(type = UserProvider.class, method = "sql")
    List<User> selectAllUser();
}

public class UserProvider implements Provider {
    public String sql() {
        return "select * from t_user";
    }
}

@InsertProvider注解

@InsertProvider注解用于自定义SQL插入语句。在使用该注解时,需要指定一个类,该类需要实现Provider接口,并实现一个名为sql的方法,该方法返回一个String类型的SQL插入语句。

例如,我们有一个名为UserProvider的类,其中实现了Provider接口,并实现了一个名为sql的方法,该方法返回一个插入用户的SQL语句。那么我们可以在Mapper接口中添加一个名为insertUser的方法,使用@InsertProvider注解进行插入操作:

public interface UserMapper extends BaseMapper<User> {
    @InsertProvider(type = UserProvider.class, method = "sql")
    int insertUser(User user);

    class UserProvider implements Provider {
        public String sql() {
            return "insert into t_user(name, age) values(#{name}, #{age})";
        }
    }
}

@UpdateProvider注解

@UpdateProvider注解用于自定义SQL更新语句。在使用该注解时,需要指定一个类,该类需要实现Provider接口,并实现一个名为sql的方法,该方法返回一个String类型的SQL更新语句。

例如,我们有一个名为UserProvider的类,其中实现了Provider接口,并实现了一个名为sql的方法,该方法返回一个更新用户信息的SQL语句。那么我们可以在Mapper接口中添加一个名为updateUser的方法,使用@UpdateProvider注解进行更新操作

public interface UserMapper extends BaseMapper<User> {
    @UpdateProvider(type = UserProvider.class, method = "sql")
    int updateUser(User user);

    class UserProvider implements Provider {
        public String sql() {
            return "update t_user set name=#{name}, age=#{age} where id=#{id}";
        }
    }
}

@DeleteProvider注解

@DeleteProvider注解用于自定义SQL删除语句。在使用该注解时,需要指定一个类,该类需要实现Provider接口,并实现一个名为sql的方法,该方法返回一个String类型的SQL删除语句。

例如,我们有一个名为UserProvider的类,其中实现了Provider接口,并实现了一个名为sql的方法,该方法返回一个删除用户的SQL语句。那么我们可以在Mapper接口中添加一个名为deleteUser的方法,使用@DeleteProvider注解进行删除操作:

public interface UserMapper extends BaseMapper<User> {
    @DeleteProvider(type = UserProvider.class, method = "sql")
    int deleteUser(Long id);

    class UserProvider implements Provider {
        public String sql() {
            return "delete from t_user where id=#{id}";
        }
    }
}

到这里,我们已经介绍了MyBatis-Plus中常用的注解。需要注意的是,使用注解的同时,我们也可以使用XML方式来实现SQL语句的映射。两种方式各有优缺点,具体选择哪种方式,需要根据实际情况进行选择。


以上笔记:90%由Chat-GPT生成文章来源地址https://www.toymoban.com/news/detail-753648.html

到了这里,关于MyBatis-Plus 超详细笔记|配置使用|多种查询|常用注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis-Plus(三)--Mybatis-Plus配置和条件构造器

    在MP中有大量的配置,其中有一部分是Mybatis原生的配置,另一部分是MP的配置,详情:https://mybatis.plus/config 【1】configLocation--自己单独的MyBatis配置的路径 SpringMVC的xml中写法: 【2】mapperLocations--MyBatis Mapper所对应的XML文件位置 如果你在Mapper中有自定义方法(XML中有自定义实现

    2024年02月15日
    浏览(64)
  • 【MyBatis-Plus 进阶学习笔记】

    2.1 优化1 自动填充 有的类没有更新和创建时间字段 2.2 优化2 自己设置时间时填充自己设置的,不设置时自动填充 4.1 PerformanceInterceptor 3.2.0版本被废除 4.2 p6spy 使用

    2024年02月15日
    浏览(40)
  • mybatis-plus配置日志实现方式

    Mybatis-plus是一个基于Mybatis的强大框架,可以帮助开发者快速地开发高质量的数据库应用程序。Mybatis-plus提供了许多配置项,其中一个重要的配置项是log-impl。 log-impl配置项定义了Mybatis-plus的日志实现方式,有两种可选的方式: SLF4J日志实现 如果你的项目已经使用了SLF4J日志框

    2024年02月09日
    浏览(80)
  • Mybatis-Plus《学习笔记(22版尚硅谷)》

    MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。 无侵入 :只做增强不做改变,引入它不会

    2024年02月09日
    浏览(40)
  • mybatis-plus在yml中配置

    pom配置 正常使用基础配置 扩展配置

    2024年02月13日
    浏览(37)
  • 如何利用Mybatis-Plus自动生成代码(超详细注解)

    1、简介 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性

    2024年02月01日
    浏览(46)
  • 如何在springboot中配置mybatis-plus

    MyBatis-Plus(简称为MP)是一个开源的Java持久层框架,它是在MyBatis基础上进行扩展的。他的出现是为了进一步简化和增强MyBatis的功能,提供更多便捷的特性和工具,以提高开发效率。 本文将阐述如何在springboot中配置和使用mybatis-plus 目录 1配置 2 使用 在pom.xml文件中配置mybati

    2024年02月13日
    浏览(36)
  • SpringBoot+Mybatis-Plus实现增删改查超详细步骤

    目录 一、介绍 视频讲解 二、前期准备工作 (一) 创建springboot项目和创建数据库 三、项目配置 (一)pom.xl导入相关依赖  1.导入依赖 (二)yml文件中配置连接数据库 2.配置yml文件  四、代码的编写 数据库展示 项目提前展示!!! (三)MySQL表绑定到spring boot(实体层)

    2024年02月13日
    浏览(39)
  • springboot mybatis-plus数据库超时配置

    超时异常 写XML 写法,单位秒 Mapper类写法,单位秒 超时异常 整个事务的超时时间,单位是秒。 它的原理大致是事务启动时,事务上下文会计算一个到期时间deadLine(当前时间+超时时间),当mybatis - prepareStatement时,会调用 SpringManagedTransaction 的getTimeOut,该方法会计算事务剩

    2024年02月03日
    浏览(56)
  • 最新-mybatis-plus 3.5分页插件配置

    前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5,升级后发现原本的分页竟然不起作用了,每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包,因为版本太低不能使用吗,这个依赖直接删除了,因为mp中本身自己就有这个jar包 以前的配

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包