公司有个项目要用IBATIS,以前没搞过。现在突击ibatis与的spring的配合。但在使用过程中发现无论如何也没法获得新增记录的ID值,查了好多资料,都是说要配SELECTKEY及 TYPE但怎么测都没办法解决,后来怀疑是spring的原因,于是本人又写了一个完全脱离spring的例子测试,但还是无法得到id值 ,现帖上相关代码,谁能看出其中的问题所在。还是说selectkey的配置根本 没用??? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ user.javapackage 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.xmlINSERT INTO t_user (name,sex)VALUES (#name#,#sex#) 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 ~~~~~~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~~~~~~~~~~~~~~滛荡的分割线~~~~ ~~~~~~~~~~~~~~~~滛荡的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以上代码注释部分基本上不用看。运行后的日志文件如下: 。。。。。。。。。。 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)。 补充:无谓的错误啊。。。。。。一切都是因为驱动。。。浪费了我一天的时间唉~~忘大家能接受偶的这个教训,太低级的错误了。。。。
ibatis的自增长ID获取问题,selectKey的配置问题,不要跟我说GOOGLE,基本所有的例子我都看过了。...
最新推荐文章于 2022-01-23 16:38:02 发布