MyBatis中的 useGeneratedKeys和 keyProperty详解

MyBatis 是一种持久层框架,简化了 SQL 映射到 Java 对象的操作。在使用 MyBatis 进行数据库操作时,尤其是在插入数据时,常常需要获取自动生成的主键值。MyBatis 提供了 useGeneratedKeys 和 keyProperty 两个属性来实现这一需求。

一、useGeneratedKeys 和 keyProperty 的作用

  1. useGeneratedKeys

    • 作用:指示 MyBatis 使用数据库生成的主键。
    • 类型:布尔值(true 或 false)。
    • 使用场景:适用于数据库支持自动生成主键的场景,如 MySQL 的 AUTO_INCREMENT,Oracle 的序列等。
  2. keyProperty

    • 作用:指定 MyBatis 将数据库生成的主键值赋值给 Java 对象的哪个属性。
    • 类型:字符串,指定 Java 对象的属性名。
    • 使用场景:需要将生成的主键值回填到插入对象的属性中,以便后续操作使用。

二、使用示例

  1. 数据库表设计
    假设有一个用户表 user,结构如下:

    CREATE TABLE user (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(50),
        age INT
    );
  2. 实体类
    对应的 Java 实体类 User

    public class User {
        private Integer id;
        private String name;
        private Integer age;
    
        // getters and setters
    }
  3. Mapper 配置
    在 MyBatis 的 Mapper XML 文件中,使用 useGeneratedKeys 和 keyProperty

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>
  4. Mapper 接口
    对应的 Mapper 接口:

    public interface UserMapper {
        void insertUser(User user);
    }
  5. 使用示例
    在应用程序中使用 Mapper 插入数据:

    public class MyBatisExample {
        public static void main(String[] args) {
            SqlSessionFactory sqlSessionFactory = ...; // 获取 SqlSessionFactory 实例
            try (SqlSession session = sqlSessionFactory.openSession()) {
                UserMapper mapper = session.getMapper(UserMapper.class);
                User user = new User();
                user.setName("John Doe");
                user.setAge(30);
                mapper.insertUser(user);
                session.commit();
                System.out.println("Inserted user ID: " + user.getId());
            }
        }
    }
     
     

三、useGeneratedKeys 和 keyProperty 的工作机制

  • useGeneratedKeys:当设置为 true 时,MyBatis 会在执行插入操作后,获取数据库生成的主键值。
  • keyProperty:指定主键值回填的 Java 对象的属性。MyBatis 将获取的主键值赋值给该属性。
posted @ 2025-06-02 11:15  kite1990  阅读(211)  评论(0)    收藏  举报