spring+mybatis插入数据时返回对象id报空指针

K哥 发布于 2013/11/08 10:25
阅读 5K+
收藏 0
mapper.xml

<insert id="addGoodsLack" parameterType="GoodsLack">
		<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="gl_id">
			select last_insert_id() AS gl_id
		</selectKey>
		insert into goods_lack ( 
			...
		) values (
			...
		)
	</insert>
public class MyBatisBaseDaoImpl<T> implements MyBatisBaseDao<T> {
	
	@Resource(name = "sqlSessionTemplate")
	protected SqlSessionTemplate sqlSessionTemplate;

	@Override
	public int add(String sqlId, Object obj) {
		return sqlSessionTemplate.insert(sqlId, obj);
	}
}

DAO层执行添加操作:
@Override
public int addGoodsLack(GoodsLack goodsLack) throws SQLException {
    add("GoodsLack.addGoodsLack", goodsLack);
    return goodsLack.getGl_id();
}

Junit测试:
@ContextConfiguration(locations = { "classpath:spring/spring.xml" })
public class DaoTest extends AbstractJUnit4SpringContextTests {

}

进行junit测试时,在返回插入对象的id时就会报空指针,这是怎么回事呢?有没有人碰到过这个问题?求指教!
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="mapperLocations" value="classpath*:com/test/mapper/*.xml" />
	<property name="typeAliasesPackage" value="com.test.entity" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg index="0" ref="sqlSessionFactoryBean" />
	<constructor-arg index="1" value="BATCH" />
</bean>
用SqlSessionFactory就可以正常返回id了,这是为什么?
加载中
0
快跑的蜗牛
james_you
james_you
这个熟悉mysql的人都知道。但是和楼主返回null不是一个问题。
0
K哥
K哥

引用来自“快跑的蜗牛”的答案

我用 

useGeneratedKeys="true" keyProperty="id"

这种方式也是一样报空指针

0
xmut
xmut

既然是用Mybatis,为什么不直接这些做????

有好多好多人:

明明用Hibernate4,问的还是Hibernate3的问题

明明用Spring3.1,问的还是Spring2.5的配置

明明用Mybatis,问的还是ibatis的写法

……

我表示很无语,╮(╯▽╰)╭

<insert id="insert" parameterType="Role" useGeneratedKeys="true" keyProperty="id">
		INSERT INTO sys_role(role_name, role_desc)
		VALUES(#{name}, #{desc})
	</insert>


0
K哥
K哥

引用来自“xmut”的答案

既然是用Mybatis,为什么不直接这些做????

有好多好多人:

明明用Hibernate4,问的还是Hibernate3的问题

明明用Spring3.1,问的还是Spring2.5的配置

明明用Mybatis,问的还是ibatis的写法

……

我表示很无语,╮(╯▽╰)╭

<insert id="insert" parameterType="Role" useGeneratedKeys="true" keyProperty="id">
		INSERT INTO sys_role(role_name, role_desc)
		VALUES(#{name}, #{desc})
	</insert>


用这种方式测试过的,结果还是一样,取id时就报空指针。。。
xmut
xmut
还有,keyProperty是写对象的属性名,而不是表字段名,你有没有搞混?
xmut
xmut
你的MySQL的id有设置自增长吗?你有测试:手动新增记录可以返回自增长值吗?
0
13123123
13123123
你的resulttype谢了吗
0
13123123
13123123
    <!-- 新增销售追踪代码 -->
    <insert id="save" parameterType="erpObject" useGeneratedKeys="true">
        insert into tb_market_active_track_code (
        market_code, description, type, create_date, last_update_date, dnis,
        begin_date, end_date, count_sceond, track_second, activer_market_id, addUser_Id
        )
        values(
        #{marketCode}, #{description}, #{type}, #{create_Date}, #{lastUpdateDate}, #{dnis},
        #{beginDate}, #{endDate}, #{countSceond}, #{trackSecond}, #{activerMarketId}, #{addUserId})
        <selectKey resultType="int" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS ID
        </selectKey>
    </insert>
0
0
K哥
K哥

引用来自“13123123”的答案

    <!-- 新增销售追踪代码 -->
    <insert id="save" parameterType="erpObject" useGeneratedKeys="true">
        insert into tb_market_active_track_code (
        market_code, description, type, create_date, last_update_date, dnis,
        begin_date, end_date, count_sceond, track_second, activer_market_id, addUser_Id
        )
        values(
        #{marketCode}, #{description}, #{type}, #{create_Date}, #{lastUpdateDate}, #{dnis},
        #{beginDate}, #{endDate}, #{countSceond}, #{trackSecond}, #{activerMarketId}, #{addUserId})
        <selectKey resultType="int" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS ID
        </selectKey>
    </insert>

设置了useGeneratedKeys="true"后,就不用再设置下面的selectKey了吧。

我在DAO里注入的是

@Resource(name = "sqlSessionTemplate")


protected SqlSessionTemplate sqlSessionTemplate;
时才会出现返回对象id空指针的问题。

如果注入的是SqlSessionFactory的话,就没问题了。

SqlSessionTemplate 不是mybatis和spring集成时提供的吗?怎么会有这样的问题呢?


13123123
13123123
问题解决了么
0
13123123
13123123
肯定要设置selectkey 这是erp-open里面代码 你可以看下 谢谢
0
K哥
K哥

引用来自“34176470”的答案

引用来自“13123123”的答案

    <!-- 新增销售追踪代码 -->
    <insert id="save" parameterType="erpObject" useGeneratedKeys="true">
        insert into tb_market_active_track_code (
        market_code, description, type, create_date, last_update_date, dnis,
        begin_date, end_date, count_sceond, track_second, activer_market_id, addUser_Id
        )
        values(
        #{marketCode}, #{description}, #{type}, #{create_Date}, #{lastUpdateDate}, #{dnis},
        #{beginDate}, #{endDate}, #{countSceond}, #{trackSecond}, #{activerMarketId}, #{addUserId})
        <selectKey resultType="int" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS ID
        </selectKey>
    </insert>

设置了useGeneratedKeys="true"后,就不用再设置下面的selectKey了吧。

我在DAO里注入的是

@Resource(name = "sqlSessionTemplate")


protected SqlSessionTemplate sqlSessionTemplate;
时才会出现返回对象id空指针的问题。

如果注入的是SqlSessionFactory的话,就没问题了。

SqlSessionTemplate 不是mybatis和spring集成时提供的吗?怎么会有这样的问题呢?


木有,我还是将SqlSessionTemplate换成SqlSessionFactory了
返回顶部
顶部