环境:MySQL5.7,MyBatis3.4.5
在MyBatis的映射文件中有两种写法:
一、
<insert id="insUser" parameterType="com.hnlib.model.User"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into User (name,password) values (#{name},#{password})
</insert>
- useGeneratedKeys: 是否自动生成主键,默认false
- keyProperty :返回的主键值赋给哪个JavaBean属性
- keyColumn: 数据库、表中的自增主键的字段名
二、
<insert id="insUser" parameterType="com.hnlib.model.User">
<selectKey resultType="int" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into User (name,password) values (#{name},#{password})
</insert>
这种方法适合没有提供自增功能的数据库,例如Oracle。
| 属性名 | 描述 |
|---|---|
| keyProperty | selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
| keyColumn | 匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 |
| resultType | 结果的类型,MyBatis 通常可以推算出来。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。 |
| order | 可为BEFORE 或 AFTER。如果是 BEFORE,那么它会先执行selectKey设置 keyProperty 然后执行插入语句。如果为AFTER则相反。 |
| statementType | 使用何种语句类型,默认PREPARED。 有STATEMENT,PREPARED 和 CALLABLE 语句的映射类型。 |
Service类中的写法(简写):
先来错误的示范:
public int insUser(User user){
return mapper.insUser(user);
}
错误原因在于MyBatis的insert语句总是返回受影响的行数,因此插入成功的话一直都是返回1,我在这个地方一直卡着,也是醉了。
正确的做法是:
public int insUser(User user){
mapper.insUser(user);
return user.getId();
}
MyBatis会将自增的属性直接映射到对象中,直接调用对象的get方法即可。
本文介绍在MyBatis中使用两种不同的方法实现主键的自动生成,一种适用于支持自增功能的数据库如MySQL,另一种适用于不支持自增功能的数据库如Oracle,并给出具体的XML配置示例及Service层实现。
2797

被折叠的 条评论
为什么被折叠?



