Mybatis中获取Statement

博客包含Java相关代码,但未给出具体代码内容。

代码:

 

<think> 在MyBatis中,当我们执行插入操作时,有时需要获取数据库自动生成的主键值。MyBatis提供了两种主要的方式来实现这一需求: 1. 使用<selectKey>标签(适用于不支持自动生成主键的数据库,如Oracle,或者需要获取自定义主键的情况) 2. 使用useGeneratedKeys属性(适用于支持自动生成主键的数据库,如MySQL和SQL Server) 下面分别给出这两种方式的示例和说明。 假设我们有一个User表,其结构如下: CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, age INT, PRIMARY KEY (id) ); 对应的Java实体类: public class User { private int id; private String name; private int age; // 省略getter和setter } 方式一:使用useGeneratedKeys(推荐,适用于MySQL) 在MyBatis的Mapper文件中,我们可以这样写: ```xml <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> ``` 说明: - useGeneratedKeys="true": 表示使用数据库自动生成主键 - keyProperty="id": 表示将自动生成的主键值赋给参数对象(即User对象)的id属性 这样,当我们执行insert操作后,传入的User对象中的id属性就会被自动设置成生成的主键值。 方式二:使用<selectKey>标签 这种方式更通用,尤其适用于不支持自动生成主键的数据库(如Oracle)。对于MySQL,我们可以这样写: ```xml <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> ``` 说明: - <selectKey>标签用于在插入语句执行前后获取主键值。 - keyProperty:指定将获取到的主键值设置到参数对象的哪个属性上。 - resultType:主键的数据类型。 - order:指定执行selectKey语句的顺序。对于MySQL,因为LAST_INSERT_ID()是在插入之后才能获取到,所以使用AFTER。对于Oracle,可能需要使用BEFORE,因为Oracle是通过序列获取值再插入。 在代码中使用: 无论是哪种方式,我们在调用Mapper的insert方法后,传入的User对象的id属性就会被自动赋值。 例如: ```java User user = new User(); user.setName("Tom"); user.setAge(20); userMapper.insertUser(user); // 执行插入 // 插入成功后,user对象的id已经被设置为数据库生成的主键值 System.out.println(user.getId()); ``` 注意事项: - 使用useGeneratedKeys要求数据库支持自动生成主键(如MySQL和SQL Server),且数据库驱动也要支持。 - 对于Oracle,通常使用序列(sequence)来生成主键,此时我们可以使用<selectKey>标签在插入前获取序列值并设置到参数对象中。例如: ```xml <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT seq_user_id.nextval FROM dual </selectKey> INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age}) </insert> ``` 总结:根据不同的数据库,选择合适的方式来获取插入后的主键值。对于MySQL,推荐使用useGeneratedKeys属性,因为它更简洁。 下面给出一个完整的示例(MySQL环境): 1. Mapper接口: public interface UserMapper { int insertUser(User user); } 2. Mapper XML(使用useGeneratedKeys方式): <mapper namespace="com.example.mapper.UserMapper"> <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> </mapper> 3. 测试代码: User user = new User("Tom", 20); userMapper.insertUser(user); System.out.println("Generated ID: " + user.getId()); // 这里会打印出生成的主键 §§相关问题§§: 1. MyBatis中除了插入获取主键,还有哪些常用操作? 2. 在使用MyBatis时,如何处理批量插入并获取主键? 3. 对于Oracle数据库,如何使用MyBatis获取序列生成的主键? 4. 如果数据库表的主键不是自增的,而是使用UUID,MyBatis如何实现插入时生成主键? </think> ### MyBatis 插入时获取主键的解决方案 在 MyBatis获取 INSERT 操作生成的主键主要有两种方式,根据数据库类型和配置方式选择: #### 1. 使用 `useGeneratedKeys`(推荐,适用于自增主键的数据库) 适用于 MySQL、SQL Server 等支持自增主键的数据库。 **Mapper XML 配置:** ```xml <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users(name, email) VALUES(#{name}, #{email}) </insert> ``` **代码说明:** - `useGeneratedKeys="true"`:启用数据库生成的主键获取 - `keyProperty="id"`:主键值将注入到参数对象的 id 属性 - 插入后可直接从传入参数对象获取主键 **Java 调用示例:** ```java User user = new User("Alice", "alice@example.com"); userMapper.insertUser(user); // 执行插入 // 插入后主键已自动注入到对象 System.out.println("Generated ID: " + user.getId()); ``` #### 2. 使用 `<selectKey>` 标签(通用方案) 适用于所有数据库(包括 Oracle 序列或 UUID 等场景) **Oracle 示例(使用序列):** ```xml <insert id="insertProduct"> <selectKey keyProperty="id" resultType="long" order="BEFORE"> SELECT products_seq.nextval FROM dual </selectKey> INSERT INTO products(id, name, price) VALUES(#{id}, #{name}, #{price}) </insert> ``` **MySQL 示例(获取自增 ID):** ```xml <insert id="insertOrder"> <selectKey keyProperty="id" resultType="long" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO orders(product_id, quantity) VALUES(#{productId}, #{quantity}) </insert> ``` **关键属性说明:** - `order="BEFORE/AFTER"`:主键获取在 INSERT 之前/之后执行 - `keyProperty`:主键注入的目标属性 - `resultType`:主键数据类型(Long/Integer/String) #### 3. 批量插入获取主键(MySQL 示例) ```xml <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users(name) VALUES <foreach item="user" collection="list" separator=","> (#{user.name}) </foreach> </insert> ``` 调用后每个 User 对象的 id 属性都会被注入对应主键。 --- ### 执行原理说明 1. **数据库驱动支持**:JDBC 的 `Statement.RETURN_GENERATED_KEYS` 机制 2. **MyBatis 处理流程**: - 执行 INSERT 语句 - 通过 JDBC 获取生成的 ResultSet - 将主键值反射注入到参数对象的指定属性 3. **事务边界**:必须在同一个事务内获取,分布式场景需要特殊处理 --- ### 不同数据库注意事项 | 数据库 | 推荐方式 | 特殊配置 | |------------|------------------------|-----------------------------| | MySQL | useGeneratedKeys | 无需额外配置 | | Oracle | `<selectKey>` | 需使用序列 (order="BEFORE") | | PostgreSQL | useGeneratedKeys | 配置 `keyColumn="id"` | | SQL Server | useGeneratedKeys | 表需设置 IDENTITY 列 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值