公司有个项目要用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)。
补充:无谓的错误啊。。。。。。一切都是因为驱动。。。浪费了我一天的时间唉~~忘大家能接受偶的这个教训,太低级的错误了。。。。
分享到:
相关推荐
这是一个用iBator生成iBatis有关代码的例子。 特别说明: Eclipse应该是3.4.1以上版本, 并且安装了iBator插件。否则可用iBator的命令行版本或ant工具。 测试用数据是: CREATE TABLE PERSON( id INTEGER NOT NULL,...
ibatis代码自动生成,ibatis代码自动生成,ibatis代码自动生成,ibatis代码自动生成
ibatis用xml配置文件配置的使用,基本包括了ibatis遇到的所有问题
ibatis demo,ibatis例子,ibatis示例
ibatis配置ibatis配置ibatis配置ibatis配置ibatis配置 以及相关资料
Ibatis基本配置---[环境搭建
ibatis 配置文件详解
简单的Ibatis入门例子,让你踏入Ibatis大门
ibatis学习 ibatis总结 ibatis ibatis ibatis
很好的spring+ibatis事务的配置文档.
ibatis例子,本例子是使用MySQL的,若使用Oracle或其他数据库,可以查看JDBC连接时使用的URL和账号用户名信息,具体自行查询。
ibatis 实例 配置 源码 依赖包 ibatis-2.3.4.726.jar commons-logging-api.jar commons-logging-1.1.jar commons-dbcp-1.2.2.jar commons-pool.jar
测试iBatis的一个简单java Project,iBatis和mysql的包我都放在了src目录之下,生成数据库的sql文件也在项目之中。
ibatis小例子Demo,对于初学者是个很好的例子。
ibatis最简单的两个小例子,给刚刚学习ibatis的学友一点帮助
学会ibatis 中sqlMap配置
本例子集成了ibatis的常用操作,如果掌握了本实例教程,相信应付一般的工作是没有问题的了。本实例教程还集成了数据库脚本。导入工程就可以运行。里面有详细的注释。
下载须知:1、里面jar包要自己导入; 2、导入Eclipse或idea后,会看到一个employee.sql文件,里面是创建“employee”表的sql语句 3、运行TestIbatis类
ibatis 自动生成工具 用于生成dao 实体类
ibatis的配置文件和映射文件,以及ibatis的应用