公司有个项目要用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)。
补充:无谓的错误啊。。。。。。一切都是因为驱动。。。浪费了我一天的时间唉~~忘大家能接受偶的这个教训,太低级的错误了。。。。
分享到:
相关推荐
- **后获取主键**:对于自动增长的主键,如MySQL,`<selectKey>`可以在插入语句之后配置,利用`LAST_INSERT_ID()`获取自增主键。 5. **SQL参数(ParameterClass)**: - 插入操作:`parameterClass`指定传入参数...
在Ibatis配置中,可以通过`<selectKey>`标签来指定使用序列生成主键。 2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后...
对于自动增长的主键,iBatis 提供了 `<selectKey>` 标签来处理。在插入数据后,这个标签会执行一个单独的 SELECT 语句来获取新生成的主键值,并将其绑定到 Java 对象的相应属性上。 **优点** iBatis 的优点包括: 1...
- 使用`selectKey`元素来获取最后插入行的主键值。 2. **查询操作**: - 同样在`sql_map_user.xml`中定义了一个`select`元素,用于查询`t_user`表中的所有记录。 - `resultClass`属性指定了结果集映射到的类,即...
iBatis的selectKey语句用于检索自动增长的值。selectKey语句可以用于检索数据库中自动增长的值,使得开发者更加方便地实现业务逻辑。 iBatis是一个功能强大且灵活的ORM解决方案,能够大大简化Java项目中的数据库...
在iBatis中,插入新记录后获取自增长ID值是非常常见的需求。`SqlMapClient`提供了一种方式,通过`<selectKey>`标签来实现。例如: ```xml <insert id="insertUser"> insert into t_user values (null, #username#,...
在上面的代码中,`selectKey` 元素将获取最后插入的自动增长的主键值,并将其赋值给参数对象的 `id` 字段。 在实际应用中,我们可能需要在插入数据之后执行其他操作,例如,获取插入后的主键值,以便进行下一步的...
当插入一条新记录时,如果数据库字段(如`id`)是自动增长的,我们可以使用`<selectKey>`标签来获取新生成的ID值。`<selectKey>`标签允许我们执行一个SQL查询,如`SELECT @@IDENTITY AS ID`,该查询返回刚刚插入...
在开始之前,我们需要创建一个名为`student`的数据库表,包含字段`id`(主键,自增长),`name`(姓名)和`age`(年龄)。这将作为我们的数据存储基础。 ```sql CREATE TABLE `student` ( `id` int(11) NOT NULL ...