最近开发的一个项目中,因为需要,所以需要使用mybatis中的语句返回一个主键id,语句如下,

<insert id="insert" parameterClass="company" >  		
      INSERT INTO
	  F_COMPANY(
			  	company_id,
			  	company_no,
			  	company_name,
			  	company_full_name,
			  	company_logo,
			  	city_id,
			  	gmt_create,
			  	gmt_modify,
			  	last_attendance_time,
			  	create_id,
			  	modify_id,
			  	no_modify_count,
			  	company_status
				)
		 VALUES( 
		  		#company_id:INTEGER#,
		  		#company_no:VARCHAR#,
		  		#company_name:VARCHAR#,
		  		#company_full_name:VARCHAR#,
		  		#company_logo:VARCHAR#,
		  		#city_id:INTEGER#,
		  		now(),
			  	now(),
			  	now(),
		  		#create_id:CHAR#,
		  		#create_id:CHAR#,
		  		#no_modify_count:TINYINT#,
		  		1
	  			)
	  	  <selectKey resultClass="Integer" keyProperty="company_id" > 
			<![CDATA[SELECT LAST_INSERT_ID() AS company_id ]]>
		  </selectKey>	  			
  </insert>


之前没有使用过这样的语句,不知道应该用什么来接收这段语句返回的类型,于是我就试着在mysql中运行一下看返回的结果,我的语句如下,

INSERT INTO
	  F_COMPANY(
			  	company_id,
			  	company_no,
			  	company_name,
			  	company_full_name,
			  	company_logo,
			  	city_id,
			  	gmt_create,
			  	gmt_modify,
			  	create_id,
			  	modify_id,
			  	no_modify_count,
			  	company_status
				)
		 VALUES( 
		  		1,
				'222',
		  		'222',
		  		'222',
		  		'222',
		  		3,
		  	  NOW(),
			  	NOW(),
		  		'222',
		  		'222',
		  		1,
		  		1
	  			)
SELECT LAST_INSERT_ID() AS company_id;


但是这样执行的话会报错,因为这是两条语句,需要添加分号的,我却没有添加。。。。。

下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:

<insert id="insert" parameterType="map">
    insert into table1 (name) values (#{name})
    <selectKey resultType="java.lang.Integer" keyProperty="id">
      CALL IDENTITY()
    </selectKey>
  </insert>


看了一下别人的例子,懂了。。。

上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。