Mybatis和Mybatis-plus常用注解

Mybatis和Mybatis-Plus常用注解

一、Mybatis常用注解

1. @Select

注解说明:标记查询语句,用于定义查询操作的SQL语句。

代码示例

@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(@Param("id") Long id);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Select注解并创建相应的SqlSource和MappedStatement对象。

2. @Insert

注解说明:标记插入语句,用于定义插入操作的SQL语句。

代码示例

@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
int addUser(User user);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Insert注解并创建相应的SqlSource和MappedStatement对象。

3. @Update

注解说明:标记更新语句,用于定义更新操作的SQL语句。

代码示例

@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
int updateUser(User user);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Update注解并创建相应的SqlSource和MappedStatement对象。

4. @Delete

注解说明:标记删除语句,用于定义删除操作的SQL语句。

代码示例

@Delete("DELETE FROM users WHERE id = #{id}")
int deleteUserById(@Param("id") Long id);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Delete注解并创建相应的SqlSource和MappedStatement对象。

5. @Results

注解说明:用于指定多个@Result注解,定义查询结果集的映射关系。

代码示例

@Select("SELECT * FROM users WHERE id = #{id}")
@Results(id = "userResultMap", value = {
    @Result(property = "id", column = "id"),
    @Result(property = "name", column = "name"),
    @Result(property = "age", column = "age")
})
User getUserById(@Param("id") Long id);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Results注解并创建ResultMap对象,保存到Configuration中。

6. @Result

注解说明:用于指定单个属性与结果集中列的映射关系。

代码示例

@Result(property = "userId", column = "id")

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Result注解并创建ResultMapping对象,作为ResultMap的组成部分。

7. @ResultMap

注解说明:用于引用已定义的结果映射集。

代码示例

@Select("SELECT * FROM users WHERE id = #{id}")
@ResultMap("userResultMap")
User getUserById(@Param("id") Long id);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@ResultMap注解并引用已定义的ResultMap对象。

8. @Param

注解说明:用于为SQL语句中的参数指定名称,便于在SQL中引用。

代码示例

List<User> findByNameAndAge(@Param("name") String name, @Param("age") Integer age);

注解处理类:由org.mybatis.spring.mapper.MapperMethod类负责处理,它会解析@Param注解并创建参数映射,用于SQL语句的参数绑定。

9. @Options

注解说明:提供了一系列的选项配置,如是否使用自动生成的键、是否使用缓存等。

代码示例

@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int addUser(User user);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Options注解并配置MappedStatement的相关属性。

10. @One

注解说明:用于一对一关联查询。

代码示例

@Select("SELECT * FROM orders WHERE id = #{id}")
@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "user", column = "user_id", 
            one = @One(select = "com.example.mapper.UserMapper.getUserById"))
})
Order getOrderById(@Param("id") Long id);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@One注解并创建一对一关联的ResultMapping对象。

11. @Many

注解说明:用于一对多关联查询。

代码示例

@Select("SELECT * FROM users WHERE id = #{id}")
@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "orders", column = "id", 
            many = @Many(select = "com.example.mapper.OrderMapper.getOrdersByUserId"))
})
User getUserWithOrders(@Param("id") Long id);

注解处理类:由org.apache.ibatis.builder.annotation.MapperAnnotationBuilder类负责处理,它会解析@Many注解并创建一对多关联的ResultMapping对象。

二、Mybatis-Plus常用注解

1. @TableName

注解说明:用于标记实体类对应的数据库表名,解决实体类名与表名不一致的问题。

代码示例

@Data
@TableName("t_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

注解处理类:由com.baomidou.mybatisplus.core.MybatisConfigurationcom.baomidou.mybatisplus.core.metadata.TableInfoHelper类负责处理,它们会解析@TableName注解并建立实体类与数据库表的映射关系。

2. @TableId

注解说明:用于标记实体类主键字段,可以指定主键类型和生成策略。

代码示例

@TableId(value = "id", type = IdType.AUTO)
private Long id;

注解处理类:由com.baomidou.mybatisplus.core.metadata.TableInfoHelper类负责处理,它会解析@TableId注解并确定主键字段及其生成策略。

IdType枚举值说明:

  • AUTO:数据库自增
  • NONE:不设置主键类型
  • INPUT:用户输入ID
  • ASSIGN_ID:分配ID (主要是雪花算法)
  • ASSIGN_UUID:分配UUID

3. @TableField

注解说明:用于标记实体类中的非主键字段,解决实体类属性名与表字段名不一致的问题,或者指定字段的一些属性。

代码示例

@TableField(value = "name", insertStrategy = FieldStrategy.NOT_EMPTY)
private String userName;

注解处理类:由com.baomidou.mybatisplus.core.metadata.TableInfoHelper类负责处理,它会解析@TableField注解并建立实体类属性与数据库字段的映射关系。

4. @Version

注解说明:用于标记乐观锁版本号字段,实现乐观锁机制。

代码示例

@Version
@TableField(value = "version", fill = FieldFill.INSERT)
private Integer version;

注解处理类:由com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor类负责处理,它会拦截SQL执行并自动增加版本号条件,实现乐观锁机制。

5. @TableLogic

注解说明:用于标记逻辑删除字段,实现逻辑删除功能。

代码示例

@TableLogic(value = "0", delval = "1")
@TableField(value = "deleted")
private Integer deleted;

注解处理类:由com.baomidou.mybatisplus.extension.plugins.inner.LogicDeleteInnerInterceptor类负责处理,它会拦截SQL执行并自动替换删除语句为更新逻辑删除字段的语句。

6. @EnumValue

注解说明:用于标记枚举类中的属性,指定枚举字段存储的值。

代码示例

public enum GenderEnum implements IEnum<Integer> {
    MALE(1, "男"),
    FEMALE(2, "女");
    
    @EnumValue
    private final Integer value;
    
    private final String desc;
    
    GenderEnum(Integer value, String desc) {
        this.value = value;
        this.desc = desc;
    }
    
    @Override
    public Integer getValue() {
        return value;
    }
}

注解处理类:由com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler类负责处理,它会在Java枚举类型与数据库字段值之间进行转换。

7. @KeySequence

注解说明:用于指定序列生成器的名称,适用于Oracle、PostgreSQL等支持序列的数据库。

代码示例

@KeySequence(value = "seq_user", clazz = Long.class)
@TableName("t_user")
public class User {
    @TableId(value = "id", type = IdType.INPUT)
    private Long id;
    // 其他字段
}

注解处理类:由com.baomidou.mybatisplus.extension.incrementer.OracleKeyGeneratorcom.baomidou.mybatisplus.extension.incrementer.PostgreKeyGenerator等类负责处理,根据数据库类型选择相应的序列生成器。

8. @SqlParser

注解说明:用于指定SQL解析器,实现SQL拦截和增强功能。

代码示例

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @SqlParser(using = MyLogicSqlParser.class)
    List<User> selectAll();
}

注解处理类:由com.baomidou.mybatisplus.extension.parser.JsqlParserSupport类负责处理,它会解析SQL并应用自定义的SQL解析逻辑。

9. @InterceptorIgnore

注解说明:用于指定忽略特定的拦截器,灵活控制拦截器的使用。

代码示例

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @InterceptorIgnore(tenantLine = "true")
    List<User> selectAll();
}

注解处理类:由com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor类负责处理,它会根据注解配置决定是否跳过特定的拦截器。

10. @MapperScan

注解说明:用于扫描Mapper接口所在的包,将其注册为Spring Bean。

代码示例

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

注解处理类:由org.mybatis.spring.mapper.MapperScannerConfigurerorg.mybatis.spring.annotation.MapperScannerRegistrar类负责处理,它们会扫描指定包下的Mapper接口并注册为Spring Bean。

11. @Mapper

注解说明:用于标记接口为Mybatis的Mapper接口,将其注册为Spring Bean。

代码示例

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
    // 自定义方法
}

注解处理类:由org.apache.ibatis.annotations.Mapper类负责处理,它会识别@Mapper注解并将接口注册为Mybatis的Mapper。

12. @DS

注解说明:用于多数据源切换,指定使用的数据源。

代码示例

@DS("slave")
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 方法将使用slave数据源
}

注解处理类:由com.baomidou.dynamic.datasource.annotation.DS类负责处理,它会在方法执行前后切换数据源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值