Mybatis 配置文件 useGeneratedKeys 参数(mysql和oracle)以及注意事项

Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

/*
 * 配置 useGeneratedKeys = true
 * */
<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE configuration   
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
    "http://mybatis.org/dtd/mybatis-3-config.dtd">   

<configuration>   
    <settings>   
        <setting name="useGeneratedKeys" value="true" />   
    </settings>   
    <typeAliases>   
        <!-- ... -->  
    </typeAliases>   
    <environments default="development">   
       <environment id="development">   
           <dataSource>   
            <!-- ... -->  
           </dataSource>   
       </environment>   
    </environments>   
    <mappers>   
        <mapper resource="mappers/*.xml" />   
    </mappers>   
</configuration>
/*
 * 使用示例:表对应的 POJO
 * */
public class User {
    private int id;
    private String name;
    private Integer age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id= id;
    }
    //... 省略其它 getter 和 setter
}

/*
 * 使用示例:mapper
 * keyProperty 指明表的自增主键列
 * */
<insert id="addUser" parameterType="com.model.User"  keyProperty="id">
    insert into User(name, age) values(#{name}, #{age})
</insert>

DAO 调用 addUser 后,User 对象参数中就保存了新增的 user 的 id 属性了。

注意事项!!!

下面贴下部分pojo代码,下面就是getset就不贴了

public class Test implements Serializable {

   private static final long serialVersionUID = 1L;

   private Integer id;
mapper.insert(test);
System.out.println(test.getId());

大家猜测下这里打印的结果会是什么结果,NULL?主键?大家不妨去试下这个代码试下?

ok,不卖关子了这里返回的确实是NULL,问题是出现在哪里呢?

就是这个序列化,如果你是直接操作数据库的话请不要去序列化,去掉序列化的代码就ok了,这可能是mybatis的bug吧,具体原因暂时没空去查,等有空查出来了再来分享给大家。

ORACLE数据库:

但是,如果是 Oracle 这样不支持自增主键列的数据库,如果把useGeneratedKeys 参数配置为 true,在插入多条数据时则可能会出现 ORA-00933: SQL command not properly ended 
这样的错误。这时,可以将 useGeneratedKeys 配置为 false,或者为了保证兼容性,使用 mybatis 提供的 selectKey 手动提供类似自增序列的效果。

<insert id="addUser" parameterType="com.model.User" >
    <selectKey keyProperty="id" resultType="_long" order="BEFORE">      
        select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1
    </selectKey>


    insert into User(id, name, age) values(#{id}, #{name}, #{age})
</insert>

mysql也可以使用
<insert id="insertSpu" parameterType="com.efivestar.scs.back.api.scsp.domain.ItemSpu">
        <selectKey keyColumn="spu_id" keyProperty="spuId" order="AFTER" resultType="java.math.BigInteger">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into
        item_spu(spu_code,spu_name,`describe`,model_type,brand_code,
        industry_code,dept_id,unit,gross_weight,net_weight,origin,
        volume,life_cycle,packed_flag,supplier_code_lock,
        machinenumber_flag,category_attributes,sale_attributes,json_data,
        approval_flag,create_time,create_by,status_flag,quality_level,setting_industry_name,update_by,sys_source)
        value
        (#{spuCode},#{spuName},#{describe},#{modelType},#{brandCode},
        #{industryCode},#{deptId},#{unit},#{grossWeight},#{netWeight},#{origin},
        #{volume},#{lifeCycle},#{packedFlag},#{supplierCodeLock},
        #{machinenumberFlag},#{categoryAttributes},#{saleAttributes},#{jsonData},
        0,#{createTime},#{createBy},1,#{qualityLevel},#{settingIndustryName},#{updateBy},0)
    </insert>

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis配置文件MyBatis框架中的一个重要配置文件,用于配置MyBatis的核心组件和参数。一般情况下,MyBatis配置文件的名称为mybatis-config.xml。 MyBatis配置文件中包含以下几个重要的配置项: 1. properties:定义全局属性,可以被XML配置文件中的所有元素引用。 2. settings:定义MyBatis全局配置项,包括缓存、日志、数据源等。 3. typeAliases:定义Java类型与别名的映射,可以简化XML配置文件中的类型引用。 4. typeHandlers:定义Java类型与JDBC类型的映射,可以增强MyBatis对不同类型的支持。 5. environments:定义MyBatis的环境配置,包括数据源和事务管理器等。 6. mappers:定义Mapper接口的映射器,包括Mapper XML文件和Mapper接口类。 下面是一个简单的MyBatis配置文件的示例: ```xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> <mapper class="com.example.mapper.UserMapper"/> </mappers> </configuration> ``` 这个示例配置文件定义了一个开发环境(development),使用JDBC事务管理器和连接池数据源。同时,该配置文件还定义了一个Mapper映射器,包括Mapper XML文件和Mapper接口类。在具体的应用程序中,需要根据实际情况进行相应的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值