首页 > 其他分享 >23个Mybatis注解:Mybatis架构分析与注解案例(必须收藏)

23个Mybatis注解:Mybatis架构分析与注解案例(必须收藏)

时间:2024-09-10 19:51:34浏览次数:3  
标签:name 23 int id interface Mybatis 注解 public

在这里插入图片描述

MyBatis 是一款优秀的持久层框架,它通过提供数据访问对象(DAO)和数据访问层(DAL)的抽象,简化了数据库交互的复杂性。利用注解如 @Select@Insert@Update@Delete,MyBatis 支持定制化 SQL、存储过程以及高级映射,使得开发者能够灵活地处理数据库操作。其核心特性包括动态 SQL 构建、强大的数据映射以及插件扩展机制,这些都极大地提升了开发效率和数据访问的性能。MyBatis 的易用性和灵活性使其成为企业级应用开发中的热门选择,特别是在需要细粒度控制 SQL 语句的场景下。通过注解如 @Results@Result@One@Many,MyBatis 进一步简化了结果集的映射和关联对象的处理,使得开发者可以更加专注于业务逻辑的实现。

肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注

欢迎 点赞,关注,评论。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

mybatis 架构图

在这里插入图片描述

  • 核心组件 包括 MyBatis 框架、SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapped Statements、Result Maps 和动态 SQL 元素。
  • 集成 包括插件和拦截器,它们扩展了 MyBatis 的功能。
  • 数据访问 包括数据源和数据库,展示了 MyBatis 如何连接和访问数据库。
  • 事务管理 展示了事务管理组件,它与 SqlSession 相关联。

1. 基本SQL操作注解

0. 主键生成和检索

@SelectKey
  • 注解作用介绍

用于在插入或更新操作后获取由数据库自动生成的主键值。

  • 注解属性介绍
    • statement: 指定用于获取主键值的 SQL 语句。
    • keyProperty: 指定主键值应设置到哪个属性。
    • before: 指定是否在插入或更新操作之前执行 SQL 语句。
    • resultType: 指定返回结果的类型。
  • 注解业务案例
public interface UserMapper {
    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    @SelectKey(statement="SELECT 0", keyProperty="id", before=false, resultType=Long.class)
    void insertUser(User user);
}
1.1. @Select
  • 注解作用介绍

用于执行查询操作。

  • 注解属性介绍
    • value: 指定查询的SQL语句。
  • 注解业务案例
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(@Param("id") int userId);
}
1.2. @Insert
  • 注解作用介绍

用于执行插入操作。

  • 注解属性介绍
    • value: 指定插入的SQL语句。
  • 注解业务案例
public interface UserMapper {
    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    int insertUser(User user);
}
1.3. @Update
  • 注解作用介绍

用于执行更新操作。

  • 注解属性介绍
    • value: 指定更新的SQL语句。
  • 注解业务案例
public interface UserMapper {
    @Update("UPDATE users SET name = #{name} WHERE id = #{id}")
    int updateUser(@Param("id") int userId, @Param("name") String newName);
}
1.4. @Delete
  • 注解作用介绍

用于执行删除操作。

  • 注解属性介绍
    • value: 指定删除的SQL语句。
  • 注解业务案例
public interface UserMapper {
    @Delete("DELETE FROM users WHERE id = #{id}")
    int deleteUser(@Param("id") int userId);
}

2. 结果映射注解

2.1. @Results
  • 注解作用介绍

用于指定复杂的结果集映射。

  • 注解属性介绍
    • id: 指定结果映射的ID。
    • value: 包含的@Result注解数组。
  • 注解业务案例
public interface UserMapper {
    @Results({
        @Result(property = "id", column = "user_id"),
        @Result(property = "name", column = "name")
    })
    @Select("SELECT user_id, name FROM users WHERE id = #{id}")
    User selectUserWithResults(@Param("id") int id);
}
2.2. @Result
  • 注解作用介绍

用于指定单个字段的结果集映射。

  • 注解属性介绍
    • property: Java对象的属性名。
    • column: 数据库列名。
  • 注解业务案例
public class User {
    private int id;
    private String name;

    // 省略getter和setter方法
}
2.3. @ResultMap
  • 注解作用介绍

用于引用已定义的结果映射。

  • 注解属性介绍
    • value: 结果映射的名称。
  • 注解业务案例
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    @ResultMap("userResultMap")
    User selectUserWithResultMap(@Param("id") int id);
}
2.4. @TypeDiscriminator
  • 注解作用介绍

用于在结果集中根据某个字段的值来区分不同的类型,实现多态查询。

  • 注解属性介绍
    • column: 指定用于区分类型的列名。
    • javaType: 指定列的 Java 类型。
    • jdbcType: 指定列的 JDBC 类型。
    • cases: 指定具体的类型映射关系。
  • 注解业务案例
public interface VehicleMapper {
    @Select("SELECT type, name FROM vehicles")
    @Results({
        @Result(property="type", column="type", @TypeDiscriminator(column="type", javaType=String.class, cases={
            @Case(value="CAR", type=Car.class),
            @Case(value="TRUCK", type=Truck.class)
        }))
    })
    List<Vehicle> selectVehicles();
}

3. 关联映射注解

3.1. @One
  • 注解作用介绍

用于指定一对一关联的结果映射。

  • 注解属性介绍
    • select: 指定关联对象的查询语句。
  • 注解业务案例
public interface UserMapper {
    @Results({
        @Result(property = "address", column = "address_id", select = "selectAddress")
    })
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserWithAddress(@Param("id") int id);
}
3.2. @Many
  • 注解作用介绍

用于指定一对多关联的结果映射。

  • 注解属性介绍
    • select: 指定关联集合的查询语句。
  • 注解业务案例
public interface UserMapper {
    @Results({
        @Result(property = "posts", column = "id", select = "selectPostsByUserId")
    })
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserWithPosts(@Param("id") int id);
}

4. 高级映射注解

4.1. @MapKey
  • 注解作用介绍

用于指定Map的键值字段。

  • 注解属性介绍
    • value: 指定作为Map键的字段。
  • 注解业务案例
public interface UserMapper {
    @Select("SELECT name, count FROM user_count")
    @MapKey("name")
    Map<String, Integer> selectUserCount();
}

5. 动态SQL注解

5.1.@SelectProvider

  • 注解作用介绍

@SelectProvider 用于动态生成查询SQL语句。

  • 注解业务案例
public interface UserMapper {
    @SelectProvider(type=UserSqlProvider.class, method="selectUsers")
    List<User> selectUsers(UserSpecification specification);
}

5.2.@InsertProvider

  • 注解作用介绍

@InsertProvider 用于动态生成插入SQL语句。

  • 注解业务案例
public interface UserMapper {
    @InsertProvider(type=UserSqlProvider.class, method="insertUser")
    int insertUser(User user);
}

5.3.@UpdateProvider

  • 注解作用介绍

@UpdateProvider 用于动态生成更新SQL语句。

  • 注解业务案例
public interface UserMapper {
    @UpdateProvider(type=UserSqlProvider.class, method="updateUser")
    int updateUser(User user);
}

5.4.@DeleteProvider

  • 注解作用介绍

@DeleteProvider 用于动态生成删除SQL语句。

  • 注解业务案例
public interface UserMapper {
    @DeleteProvider(type=UserSqlProvider.class, method="deleteUser")
    int deleteUser(User user);
}

6. 参数绑定注解

6.1. @Param
  • 注解作用介绍

用于指定方法参数的名称,以便在SQL语句中使用。

  • 注解属性介绍
    • value: 参数的名称。
  • 注解业务案例
public interface UserMapper {
    @Select("SELECT * FROM users WHERE name = #{userName}")
    List<User> findUsersByName(@Param("userName") String name);
}
6.2 @ConstructorArgs
  • 注解作用介绍

用于指定使用构造方法参数进行结果映射,允许将查询结果直接映射到对象的构造方法。

  • 注解属性介绍
    • value: 指定构造方法参数的数组。
  • 注解业务案例
public class User {
    private final int id;
    private final String name;

    public User(@Param("id") int id, @Param("name") String name) {
        this.id = id;
        this.name = name;
    }
}

public interface UserMapper {
    @Select("SELECT id, name FROM users WHERE id = #{id}")
    @ConstructorArgs({
        @Arg(column="id", javaType=int.class),
        @Arg(column="name", javaType=String.class)
    })
    User selectUserById(@Param("id") int id);
}

7. 配置注解

7.1. @Options
  • 注解作用介绍

用于指定一些配置选项,如执行超时时间、刷新缓存等。

  • 注解属性介绍
    • useCache: 是否使用缓存。
    • flushCache: 是否刷新缓存。
    • timeout: 执行超时时间。
  • 注解业务案例
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    @Options(useCache=true, flushCache=FlushCachePolicy.TRUE, timeout=1000)
    User getUserWithOptions(@Param("id") int id);
}
7.2. @CacheNamespace
  • 注解作用介绍

用于配置命名空间级别的缓存选项。

  • 注解属性介绍
    • value: 缓存命名空间的名称。
    • eviction: 缓存逐出策略。
    • size: 缓存大小。
    • readOnly: 是否只读。
  • 注解业务案例
@CacheNamespace(eviction=Eviction.LRU, size=100, readOnly=true)
public interface UserMapper {
    // 映射语句
}
7.3. @Flush
  • 注解作用介绍

用于指定在插入、更新或删除操作后是否刷新缓存。

  • 注解属性介绍
    • flushCache: 是否刷新缓存。
  • 注解业务案例
public interface UserMapper {
    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    @Flush(flushCache=FlushCachePolicy.TRUE)
    int insertUser(User user);
}

8. 类型映射注解

8.1. @MappedJdbcTypes
  • 注解作用介绍

用于指定Java类型到JDBC类型的映射。

  • 注解属性介绍
    • value: 映射的JDBC类型。
  • 注解业务案例
public class User {
    @MappedJdbcTypes(JdbcType.VARCHAR)
    private String name;
}
8.2. @MappedTypes
  • 注解作用介绍

用于指定Java类型与数据库类型的映射关系。

  • 注解属性介绍
    • value: 映射的Java类型。
  • 注解业务案例
@MappedTypes(User.class)
public interface

标签:name,23,int,id,interface,Mybatis,注解,public
From: https://blog.csdn.net/alises1314/article/details/142107755

相关文章

  • 代码随想录训练营day41|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股
    121.买卖股票的最佳时机这题和贪心中的买股票很想,但这里不用考虑局部问题,因为只用买一张卖一张。我想可以用一个数组dp来记录买入价格和卖出价格。然后遍历数组草我感觉我写的想贪心。动态规划dp[i][0]表示第i天不持股的最大收益,dp[i][1]表示第i天持股的最大收益。dp......
  • 线程池以及详解使用@Async注解异步处理方法
    目录一.什么是线程池:二.使用线程池的好处:三.线程池的使用场景:四.使用线程池来提高Springboot项目的并发处理能力:1.在application.yml配置文件中配置:2.定义配置类来接受配置文件内的属性值:3.启用异步支持:4.实例: 五.详细解析@Async注解的使用:1.@Async注解作用:2.@Asyn......
  • 一键下载,轻松应对工作挑战:Adobe InDesign 2023 最新版软件下载
    ##一键下载,轻松应对工作挑战:AdobeInDesign2023最新版软件下载在当今快节奏的工作环境中,效率和便捷性是成功的关键。无论是设计师、出版商还是营销人员,都需要一款功能强大且易于使用的排版软件来应对各种工作挑战。AdobeInDesign2023正是这样一款软件,它凭借其强大的功能和不......
  • 下载-轻松应对工作挑战:DW下载2023正版下载安装,2014-2023下载
    ##下载-轻松应对工作挑战:DW下载2023正版下载安装,2014-2023下载在当今数字化时代,高效的工作离不开强大的工具支持。AdobeDreamweaver(简称DW)作为一款专业的网页设计和开发工具,自2014年发布以来,凭借其强大的功能和便捷的操作,一直深受广大设计师和开发者的青睐。如今,DW已经更新至2023......
  • P7230 [COCI2015-2016#3] NEKAMELEONI
    这个做法与\(k\)无关。非常好常数,爱来自Hanghang。Hanghang给出了一个空间\(O(n)\),常数很小,代码很短的单侧递归做法。我们考虑维护哪些区间是不符合要求的,对于一个数\(a_x\),下一个\(a_x\)下标是\(d_x\),则满足\(x<l\ler<d_x\)的区间\((l,r)\)是不符合要求的。然......
  • TimesNet - 时序升维卷积任务通用模型 论文笔记 ICLR2023
    论文信息标题:Timesnet:Temporal2d-variationmodelingforgeneraltimeseriesanalysis作者:HaixuWu,TenggeHu,YongLiu,HangZhou,JianminWang,MingshengLong代码:https://github.com/thuml/TimesNet[原仓库,代码已迁移到TSLib]https://github.com/thuml/Time-Ser......
  • 文心一言 VS 讯飞星火 VS chatgpt (340)-- 算法导论23.1 9题
    九、设为的一棵最小生成树,设为由为由是连通的,则的一棵最小生成树。如果要写代码,请用go语言。文心一言:要证明如果是是诱导的的子图,即诱导的的子图,即是连通的,即:由于诱导的的子图,并且是的生成树,因此是:假设存在。由于是(即中不在的权重加上的权重,由于......
  • Mybatis踩坑记录:探究Mybatis源码为何当传入参数Integer类型为0时,if条件生效
    目录前言 ​编辑问题背景 深入源码 解决问题方案一方案二方案三 结果结语前言在MyBatis中,<if>标签用于动态生成SQL查询条件。然而,在一些特定的场景下,<if>标签的条件判断可能会出现意料之外的结果。例如,当传入的Integer参数为0时,条件判断可能不会如......
  • COMP2230/COMP6230 Algorithms
    TheUniversityofNewcastle,AustraliaSchoolofInformationandPhysicalSciencesCOMP2230/COMP6230AlgorithmsAssignment1Marks100Weight15%IndividualSubmissionviaCanvas1LearningOutcomesThisassignmentwillrequirestudentsto:Applyspecific......
  • 2389. 和有限的最长子序列
    题目链接2389.和有限的最长子序列思路贪心+排序+二分题解链接非暴力做法:前缀和+二分查找+原地O(1)空间(Python/Java/C++/Go)关键点1.贪心:由于元素和有上限,为了能让子序列尽量长,子序列中的元素值越小越好。2.本题要求计算元素和,因此元素在数组中的位置无......