`
xnxqs
  • 浏览: 11959 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

ibatis的自增长ID获取问题,selectKey的配置问题,不要跟我说GOOGLE,基本所有的例子我都看过了。

阅读更多
公司有个项目要用IBATIS,以前没搞过。现在突击ibatis与的spring的配合。但在使用过程中发现无论如何也没法获得新增记录的ID值,查了好多资料,都是说要配SELECTKEY及 TYPE但怎么测都没办法解决,后来怀疑是spring的原因,于是本人又写了一个完全脱离spring的例子测试,但还是无法得到id值 ,现帖上相关代码,谁能看出其中的问题所在。还是说selectkey的配置根本 没用???

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

user.java
package com.ibatis.sample.bean;

import java.io.Serializable;

import org.springframework.stereotype.Repository;

@Repository
public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String name;
	private Integer sex;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getSex() {
		return sex;
	}
	public void setSex(Integer sex) {
		this.sex = sex;
	}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
User.xml

	
		
<![CDATA[		
INSERT INTO t_user (name,sex)VALUES (#name#,#sex#)
]]>		
			
			<![CDATA[ SELECT SCOPE_IDENTITY() AS id]]> 
			
	
	
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


UserDao.java
package com.ibatis.sample.dao.impl;

......

@Service
@Transactional
public class UserDao extends BaseDao implements IUserDao {

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.ibatis.sample.dao.impl.IUserDao#insertUser(com.ibatis.sample.bean
	 * .User)
	 */
	public User addUser(User user) {
		Integer id = null;

		id =(Integer )getSqlMapClientTemplate().insert("addUser", user);
		// this.getSqlMapClient()
		if (id != null)
			user.setId(id);//
		else
			user = null;
		return user;
	}
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
basedao.java

package com.ibatis.sample.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.sqlmap.client.SqlMapClient;

public class BaseDao extends SqlMapClientDaoSupport {
	@Autowired
	public void setSqlMapClientBase(SqlMapClient sqlMapClient) {
		super.setSqlMapClient(sqlMapClient);
	}
}


~~~~~~~~~IUserDao ~~~~~~~~~~~~~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.ibatis.sample.dao;

import java.util.List;

import com.ibatis.sample.bean.User;

public interface IUserDao {

	public User addUser(User user);

	public void delUser(User user);

	public void delUserById(User user);

	public void delUserByName(User user);

	public void updateUser(User user);

	public User getUser(User user);

	public abstract List getUsers(User user);
}

~~~~~~~~~~~~~~~~~~~~~测试类~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.ibatis.sample.test;

import static org.junit.Assert.*;导的包太多了。省略

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class CopyOfUserDaoTest {
	@Autowired
	IUserDao userDao;
	@Autowired
	User user;

	static List userList = new ArrayList();
	@Before
	public void setUp1() throws Exception {
		System.out.println("setup1被调用 ");
	}	

	@Test
//	@Rollback(false)
//	@NotTransactional
	public void insertUser() {
		user.setName("a2");
		user.setSex(2);
		user = userDao.addUser(user);

	}


}



~~~~~~~~~~~~~~applicationContext.xml~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	
		
			classpath:DB.properties
		
	

	
		
		
		
		
	

	
		
		
	
	
		
	



	

	<!-- a PlatformTransactionManager is still required -->
	
		<!-- (this dependency is defined somewhere else) -->
		
	
	
	


~~~~~~DB.properties~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=rbac;SelectMethod=Cursor;
jdbc.username=sa
jdbc.password=sa
~~~~~~sql-map-config.xml~~~~~~~~~~~~~~滛荡的分割线~~~~


	


	<!-- typeAlias alias="mapBean" type="com.vsc.po.MapBean" / -->

	


~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


以上代码注释部分基本上不用看。运行后的日志文件如下:
。。。。。。。。。。
DEBUG] 2009-07-14 19:33:45 :Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@19bf795] for key [org.apache.commons.dbcp.BasicDataSource@1e881b6] bound to thread [main]
    [DEBUG] 2009-07-14 19:33:45 :Obtained JDBC Connection [jdbc:microsoft:sqlserver://localhost:1433;NETADDRESS=000000000000;HOSTPROCESS=0;SENDSTRINGPARAMETERSASUNICODE=true;LOGINTIMEOUT=0;DATABASENAME=rbac;PROGRAMNAME=;SELECTMETHOD=Cursor;WSID=, UserName=sa, SQLServer] for iBATIS operation
    [DEBUG] 2009-07-14 19:33:45 :{conn-100000} Preparing Statement:     INSERT INTO t_user (name,sex)VALUES (?,?)                               
    [DEBUG] 2009-07-14 19:33:45 :Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@19bf795] for key [org.apache.commons.dbcp.BasicDataSource@1e881b6] bound to thread [main]
    [DEBUG] 2009-07-14 19:33:45 :{pstm-100001} Executing Statement:     INSERT INTO t_user (name,sex)VALUES (?,?)                               
    [DEBUG] 2009-07-14 19:33:45 :{pstm-100001} Parameters: [a2, 2]
    [DEBUG] 2009-07-14 19:33:45 :{pstm-100001} Types: [java.lang.String, java.lang.Integer]
    [DEBUG] 2009-07-14 19:33:45 :{conn-100000} Preparing Statement:      SELECT SCOPE_IDENTITY() AS value      
    [DEBUG] 2009-07-14 19:33:45 :Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@19bf795] for key [org.apache.commons.dbcp.BasicDataSource@1e881b6] bound to thread [main]
    [DEBUG] 2009-07-14 19:33:45 :{pstm-100002} Executing Statement:      SELECT SCOPE_IDENTITY() AS value      
    [DEBUG] 2009-07-14 19:33:45 :{pstm-100002} Parameters: []
    [DEBUG] 2009-07-14 19:33:45 :{pstm-100002} Types: []
    [DEBUG] 2009-07-14 19:33:45 :{rset-100003} ResultSet
    [DEBUG] 2009-07-14 19:33:46 :{rset-100003} Header: [ID]
    [DEBUG] 2009-07-14 19:33:46 :{rset-100003} Result: [0]
    [DEBUG] 2009-07-14 19:33:46 :Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@19bf795] for key [org.apache.commons.dbcp.BasicDataSource@1e881b6] bound to thread [main]
    [DEBUG] 2009-07-14 19:33:51 :Completing transaction for [com.ibatis.sample.dao.IUserDao.addUser]
。。。。。。。。。。。。。

整个过程没有出错。只是请注意帖出的日志部分, SELECT SCOPE_IDENTITY() AS value      
我在执行器单位跑过,没问题,可取出刚插入的ID值,但从日志文件来看。其实已经获知header为id.但不知为什么result为0,why?难道selectKey都不起作用吗?
附上案例,有需要的朋友可以研究一下。
环境:myeclipse7.5+sql server2000
Spring2.5+ibatis2.3.4
因spring2.5的包太多,所以只附上部分包,其它的请自备,如果用myeclipse打开的话,就不存在差包的问题了。

为什么我点bbcode按键,无编辑器出来??是je的js兼容问题还是??我用的是ie7,这样太难看了。。。。
补充,加了一个附件(ibatisTest.rar),本人用这个最简的附件测试还是无法得到ID值。如果嫌上面的难看的朋友请下载第二个附件(ibatis.rar)。

补充:无谓的错误啊。。。。。。一切都是因为驱动。。。浪费了我一天的时间唉~~忘大家能接受偶的这个教训,太低级的错误了。。。。

  
  
分享到:
评论
1 楼 pejaming 2009-07-16  
驱动错误?能麻烦您再说说么,虽然没遇到过,但是以备后用啊

相关推荐

Global site tag (gtag.js) - Google Analytics