Mybatis SQL注解使用场景

MyBatis 提供了几种常用的注解,主要用于简化 XML 映射文件的编写,使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例:

1. @Select

@Select 注解用于执行查询操作,并将查询结果映射到指定的 Java 对象或基本数据类型。

java 复制代码
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(Long id);

2. @Insert

@Insert 注解用于执行插入操作,将 Java 对象的数据插入到数据库中。

java 复制代码
@Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")
void insertUser(User user);

3. @Update

@Update 注解用于执行更新操作,更新数据库中已有的数据。

java 复制代码
@Update("UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}")
void updateUser(User user);

4. @Delete

@Delete 注解用于执行删除操作,从数据库中删除指定的数据行。

java 复制代码
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUserById(Long id);

5. @ResultMap

@ResultMap 注解用于引用 XML 映射文件中定义的 resultMap,将查询结果映射到 Java 对象。

java 复制代码
@Select("SELECT * FROM users")
@ResultMap("userResultMap")
List<User> getAllUsers();

6. @Results 和 @Result

@Results@Result 注解结合使用,定义查询结果到 Java 对象的映射关系。

java 复制代码
@Results({
    @Result(property = "id", column = "user_id"),
    @Result(property = "username", column = "user_name"),
    @Result(property = "password", column = "user_password")
})
@Select("SELECT user_id, user_name, user_password FROM users WHERE id = #{id}")
User getUserById(Long id);

7. @Param

@Param 注解用于给 SQL 查询或操作方法的参数命名,以便在 SQL 语句中引用。

java 复制代码
@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")
User getUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

小结

以上这些注解在 MyBatis 中定义和执行 SQL 操作更加方便和直观,避免了大量 XML 配置文件编写。每种注解的具体写法取决于要执行的 SQL 类型和需要传递的参数。

分析注解用法与原理

例如当使用MyBatis框架中的 @Insert 注解时,主要目的是将一个Java对象插入到数据库中。这个注解允许在Java方法上直接指定插入操作的SQL语句,而不需要显式地在XML映射文件中定义。

@Insert 注解的用法

  1. 定义Mapper接口方法

    首先,你需要定义一个Mapper接口方法,使用 @Insert 注解来标记这个方法执行插入操作。

    java 复制代码
    import org.apache.ibatis.annotations.Insert;
    
    public interface UserMapper {
        @Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")
        void insertUser(User user);
    }
    • @Insert 注解中的参数是一个字符串,它包含了实际的SQL插入语句。这个语句使用了MyBatis的动态SQL语法,其中 #{} 表示参数占位符,它会被MyBatis动态地替换为Java对象 User 中对应的属性值。
  2. Java对象

    在上述内容中,User 是一个简单的Java对象,用来映射数据库中的用户表。

    java 复制代码
    public class User {
        private Long id;
        private String username;
        private String password;
    
        // Getters and setters
    }

    在实际使用中,会创建一个 User 对象,并将其作为参数传递给 insertUser 方法。

  3. 调用方法

    最后,调用 insertUser 方法来执行插入操作。MyBatis会根据 @Insert 注解中指定的SQL语句生成并执行相应的SQL。

    java 复制代码
    public class Main {
        public static void main(String[] args) {
            // 获取UserMapper实例
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
            // 创建一个User对象
            User user = new User();
            user.setId(1L);
            user.setUsername("john_doe");
            user.setPassword("password123");
    
            // 执行插入操作
            userMapper.insertUser(user);
    
            // 提交事务
            sqlSession.commit();
        }
    }

@Insert 注解的具体原理

  • 动态SQL解析 :MyBatis在运行时会解析 @Insert 注解中的SQL语句,并将其中的 #{} 占位符替换为对应的Java对象属性值。这种动态性允许你在不同的场景下使用相同的插入语句,只需传入不同的Java对象即可。

  • SQL执行 :当调用标记有 @Insert 注解的方法时,MyBatis会根据注解中的SQL语句生成PreparedStatement,并执行插入操作。执行过程中,MyBatis负责处理数据库连接的获取、事务管理等底层操作。

  • 参数映射 :MyBatis会将方法的参数(即插入方法中的Java对象)与 @Insert 注解中的SQL语句进行映射,确保每个属性值都被正确地插入到数据库中相应的字段中。

小结

通过理解和使用 @Insert 注解,可以在MyBatis中简化SQL操作的定义和执行过程,提高开发效率和代码可读性。

注解调用写法

当使用 MyBatis 注解时,注解中的内容可以有多种变化形式,主要取决于执行的 SQL 操作和传递的参数。下面详细列出每种注解在被调用时的不同写法:

1. @Select

  • 单参数

    java 复制代码
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);
  • 多参数 (使用 @Param 注解进行参数命名):

    java 复制代码
    @Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")
    User getUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

2. @Insert

  • 单对象参数

    java 复制代码
    @Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")
    void insertUser(User user);

3. @Update

  • 单对象参数

    java 复制代码
    @Update("UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}")
    void updateUser(User user);

4. @Delete

  • 单参数

    java 复制代码
    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUserById(Long id);

5. @ResultMap

  • 单结果集映射

    java 复制代码
    @Select("SELECT * FROM users")
    @ResultMap("userResultMap")
    List<User> getAllUsers();

6. @Results 和 @Result

  • 映射定义

    java 复制代码
    @Results({
        @Result(property = "id", column = "user_id"),
        @Result(property = "username", column = "user_name"),
        @Result(property = "password", column = "user_password")
    })
    @Select("SELECT user_id, user_name, user_password FROM users WHERE id = #{id}")
    User getUserById(Long id);

在这些例子中,注解括号中的内容具体形式会根据具体需求和 SQL 语句的复杂度而变化。重要的是确保参数名与 SQL 语句中的占位符 (#{...}) 一致,并正确地映射结果到 Java 对象或基本数据类型。

特殊形式

MyBatis 允许在SQL语句中嵌入动态内容,可以使用<script>标签来定义一个SQL脚本,使用@Select("script")@Insert("script")@Update("script")@Delete("script")注解来执行。

java 复制代码
@Select("<script>" +
        "SELECT * FROM users " +
        "<where>" +
        "   <if test='name != null'>" +
        "       AND name = #{name}" +
        "   </if>" +
        "   <if test='age != null'>" +
        "       AND age = #{age}" +
        "   </if>" +
        "</where>" +
        "</script>")
List<User> getUsersWithConditions(@Param("name") String name, @Param("age") Integer age);

在这个例子中,<script> 标签包含了动态生成的SQL语句,根据传入的参数决定是否包含 nameage 条件。这种方式能够根据不同的条件动态地构建SQL语句,灵活实用。

除了使用 <script> 标签来编写动态SQL语句外,还有一些其他常见的高级用法比如:

  1. 动态条件语句

    java 复制代码
    @Select("<script>" +
            "SELECT * FROM users " +
            "<where>" +
            "   <if test='name != null'>" +
            "       AND name = #{name}" +
            "   </if>" +
            "   <if test='age != null'>" +
            "       AND age = #{age}" +
            "   </if>" +
            "</where>" +
            "</script>")
    List<User> getUsersWithConditions(@Param("name") String name, @Param("age") Integer age);

    这个例子中,根据传入的参数动态地拼接 WHERE 子句,条件的组合可以根据参数的有无来动态生成。

  2. 动态更新语句

    java 复制代码
    @Update("<script>" +
            "UPDATE users " +
            "<set>" +
            "   <if test='name != null'>" +
            "       name = #{name}," +
            "   </if>" +
            "   <if test='age != null'>" +
            "       age = #{age}," +
            "   </if>" +
            "</set>" +
            "WHERE id = #{id}" +
            "</script>")
    void updateUser(User user);

    这个例子是如何在更新语句中使用 <set> 标签来动态设置需要更新的字段,同样根据传入的参数决定是否包含相应的字段更新。

  3. 动态插入语句

    java 复制代码
    @Insert("<script>" +
            "INSERT INTO users (name, age)" +
            "VALUES " +
            "<foreach item='user' collection='users' separator=','>" +
            "   (#{user.name}, #{user.age})" +
            "</foreach>" +
            "</script>")
    void insertUsers(@Param("users") List<User> users);

    这个例子使用 <foreach> 标签来动态地插入多条数据,可以根据传入的列表动态生成插入值的部分。

其他

除了使用脚本之外,MyBatis还提供了一些其他高级功能,允许更灵活地处理SQL语句:

  1. 使用SQL注释:可以在SQL语句中添加注释,以提高可读性或添加一些额外的说明。例如:

    java 复制代码
    @Select("SELECT * FROM users-- This is a comment\nWHERE id = #{id}")
    User getUserByIdComment(Long id);
  2. 存储过程:如果使用的是支持存储过程的数据库(如MySQL或Oracle),可以定义一个存储过程,然后使用MyBatis的注解执行它。例如:

    java 复制代码
    @Select({ "call sp_UserById(:id)", "param.id = #{id}" })
    User callUserById(Long id);
  3. 使用命名参数:可以为参数指定名称,而不是使用位置参数。这在SQL语句中特别有用,因为它增强了可读性并避免了参数顺序问题。

    java 复制代码
    @Select("SELECT * FROM users WHERE id = :id")
    User getUserByIdNamedParam(Map<String, Object> params);

这些都是MyBatis注解中一些较复杂的用法,它允许更灵活地处理SQL语句,适应不同情况下的需求。

相关推荐
goTsHgo3 分钟前
Clickhouse如何完全保证数据的去重
数据库·clickhouse
Dylanioucn3 分钟前
【编程底层原理】亿级数据表查询最后10条记录limit 99999990,10性能为啥特慢,而且数据库都被查宕机了
数据库·oracle
goTsHgo3 分钟前
从底层原理上理解ClickHouse 中的稀疏索引
数据库·clickhouse
不染_是非44 分钟前
Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)
数据库·后端·学习·django·web
飞翔的佩奇1 小时前
Java项目: 基于SpringBoot+mybatis+maven校园资料分享平台(含源码+数据库+答辩PPT+毕业论文)
java·spring boot·spring·毕业设计·maven·mybatis·校园资料分享平台
akbar&1 小时前
计算机三级 - 数据库技术 - 第十三章 大规模数据库架构 笔记
数据库·笔记
架构师ZYL1 小时前
node.js+Koa框架+MySQL实现注册登录
前端·javascript·数据库·mysql·node.js
酷帅且洋仔1 小时前
Redis——常用数据类型List
数据库·redis·list
惟长堤一痕1 小时前
MySQL基础篇(黑马程序员2022-01-18)
数据库·mysql
兔十卅1 小时前
1、常用的数据库、表操作
数据库