`
xnxqs
  • 浏览: 12327 次
  • 性别: 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  
驱动错误?能麻烦您再说说么,虽然没遇到过,但是以备后用啊

相关推荐

    iBatis_SqlMap的配置总结[1]

    - **后获取主键**:对于自动增长的主键,如MySQL,`&lt;selectKey&gt;`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...

    08_传智播客ibatis教程_sql主键生成方式

    在Ibatis配置中,可以通过`&lt;selectKey&gt;`标签来指定使用序列生成主键。 2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后...

    ibatis PPT

    对于自动增长的主键,iBatis 提供了 `&lt;selectKey&gt;` 标签来处理。在插入数据后,这个标签会执行一个单独的 SELECT 语句来获取新生成的主键值,并将其绑定到 Java 对象的相应属性上。 **优点** iBatis 的优点包括: 1...

    Ibatis入门教程

    - 使用`selectKey`元素来获取最后插入行的主键值。 2. **查询操作**: - 同样在`sql_map_user.xml`中定义了一个`select`元素,用于查询`t_user`表中的所有记录。 - `resultClass`属性指定了结果集映射到的类,即...

    ibatis学习之搭建Java项目

    iBatis的selectKey语句用于检索自动增长的值。selectKey语句可以用于检索数据库中自动增长的值,使得开发者更加方便地实现业务逻辑。 iBatis是一个功能强大且灵活的ORM解决方案,能够大大简化Java项目中的数据库...

    SqlMapClient对象.docx

    在iBatis中,插入新记录后获取自增长ID值是非常常见的需求。`SqlMapClient`提供了一种方式,通过`&lt;selectKey&gt;`标签来实现。例如: ```xml &lt;insert id="insertUser"&gt; insert into t_user values (null, #username#,...

    mybatis insert返回主键代码实例

    在上面的代码中,`selectKey` 元素将获取最后插入的自动增长的主键值,并将其赋值给参数对象的 `id` 字段。 在实际应用中,我们可能需要在插入数据之后执行其他操作,例如,获取插入后的主键值,以便进行下一步的...

    SqlMapClient对象.pdf

    当插入一条新记录时,如果数据库字段(如`id`)是自动增长的,我们可以使用`&lt;selectKey&gt;`标签来获取新生成的ID值。`&lt;selectKey&gt;`标签允许我们执行一个SQL查询,如`SELECT @@IDENTITY AS ID`,该查询返回刚刚插入...

    Mybatis之接口式编程.doc

    在开始之前,我们需要创建一个名为`student`的数据库表,包含字段`id`(主键,自增长),`name`(姓名)和`age`(年龄)。这将作为我们的数据存储基础。 ```sql CREATE TABLE `student` ( `id` int(11) NOT NULL ...

Global site tag (gtag.js) - Google Analytics