今天试了试原生jdbc insert操作,oracle数据库。出现错误如下
INFO [main] (ConnectionPool.java:98) -Connection created successfully!
INFO [main] (ConnectionPool.java:54) -create pool [Sun Oct 13 22:30:30 CST 2013]
ERROR [main] (UserDaoImpl.java:57) -insert user User [userName=Jesse, passWord=Jesse, gender=null, email=null, address=null, birthday=null, registerDate=null, status=null] failed!
[color=red]ERROR [main] (UserDaoImplTest.java:40) -索引中丢失 IN 或 OUT 参数:: 6[/color]
INFO [main] (ConnectionPool.java:189) -return connection [oracle.jdbc.driver.T4CConnection@4d66f8] to pool
INFO [main] (ConnectionPool.java:236) -close connection [oracle.jdbc.driver.T4CConnection@4d66f8]
其中,insert操作关键代码如下
private static final String ADD_USER_SQL = "insert into oss_user_tbl(username, password, gender, email, address, birthday, registerdate, status) values (?,?,?,?,?,?,?,?)";
try {
PreparedStatement pst = conn.prepareStatement(ADD_USER_SQL);
pst.setString(1, user.getUserName());
pst.setString(2, user.getPassWord());
pst.setString(3, user.getGender());
pst.setString(4, user.getEmail());
pst.setString(5, user.getAddress());
Date birthday = user.getBirthday();
Date registerDate = user.getRegisterDate();
if(birthday != null) {
pst.setDate(6, SimpleUtils.revertDateToSqlDate(birthday));
}
if(registerDate != null) {
pst.setDate(7, SimpleUtils.revertDateToSqlDate(registerDate));
}
pst.setString(8, user.getStatus());
pst.execute();
} catch (SQLException e) {
logger.error("insert user " + user + " failed!");
throw new DaoException(e.getMessage());
}
测试代码如下
@Test
public void testAdd() {
Connection conn = cm.getConnection();
User user = new User();
user.setUserName("Jesse");
user.setPassWord("Jesse");
try {
userDao.add(conn, user);
logger.info(user + " added successfully!");
} catch (DaoException e) {
logger.error(e.getMessage());
}
cm.free(conn);
cm.close();
}
但是,当将user所有字段都设置成不为null的值时,不会出现上述错误
@Test
public void testAdd() {
Connection conn = cm.getConnection();
User user = new User();
user.setUserName("Jesse");
user.setPassWord("Jesse");
user.setGender("M");
user.setEmail("jesse");
user.setAddress("jesse");
user.setBirthday(new Date());
user.setRegisterDate(new Date());
user.setStatus("jesse");
try {
userDao.add(conn, user);
logger.info(user + " added successfully!");
} catch (DaoException e) {
logger.error(e.getMessage());
}
cm.free(conn);
cm.close();
}
网上查了下,说出现这种问题的情况非常多,有的是和数据库类型不一致问题,所以,想到了是insert操作中下面部分代码问题
if(birthday != null) {
pst.setDate(6, SimpleUtils.revertDateToSqlDate(birthday));
}
if(registerDate != null) {
pst.setDate(7, SimpleUtils.revertDateToSqlDate(registerDate));
}
将其改如下,问题解决
@Override
public void add(Connection conn, User user) throws DaoException {
try {
PreparedStatement pst = conn.prepareStatement(ADD_USER_SQL);
pst.setString(1, user.getUserName());
pst.setString(2, user.getPassWord());
pst.setString(3, user.getGender());
pst.setString(4, user.getEmail());
pst.setString(5, user.getAddress());
Date birthday = user.getBirthday();
Date registerDate = user.getRegisterDate();
if(birthday != null) {
pst.setDate(6, SimpleUtils.revertDateToSqlDate(birthday));
} else {
pst.setDate(6, null);
}
if(registerDate != null) {
pst.setDate(7, SimpleUtils.revertDateToSqlDate(registerDate));
} else {
pst.setDate(7, null);
}
pst.setString(8, user.getStatus());
pst.execute();
} catch (SQLException e) {
logger.error("insert user " + user + " failed!");
throw new DaoException(e.getMessage());
}
}
总结:目前,个人认为是sql中的占位符一定要设置值的,待后面深入学习后再回头看看这个问题
分享到:
相关推荐
---------索引中丢失in或out参数终极解决方案---------- 表现:提示的索引位置大于实际参数个数, 每次重启服务可以成功一次或几次, 之后短时间内全部失败. ---------祝各位工作愉快,全网首发,血泪史----------
最终解决方案: 唯一非聚集索引留着, 再添加一个 非聚集索引,保留两个索引, 终于搞定了. CREATE UNIQUE NONCLUSTERED INDEX [IX_SF_CP_Detail_MAC2] ON [dbo].[SF_Cp_Detail] ( [Mac2] ASC ) WHERE ([MAC2]<>'' AND...
mysql全文索引解决方案的最佳选择,coreseek是针对中文分词专门开发结合sphinx全文索引的数据库第三方工具。
MySQL唯一索引重复插入数据解决方案总结.docx
Mysql索引优化解决方案.doc
安卓方案类-游戏发行切包资源索引冲突解决方案.docx
查询sql server 数据库中索引的丢失情况,根据查询出来的数据,可以重新创建索引
K3数据库索引及系统性能优化解决方案(具体应用篇); 此文件经过整理及个人实践可用
OracleGoldenGate针对表没有主键或唯一索引的解决方案[归类].pdf
搜索引擎创建索引时JVM 运行时内存溢出解决方案
《海量数据库解决方案》系列丛书深受广大读者的喜爱已经长达10年之久,在被誉为“圣经”的同时,它已经变成了数据库用户不可或缺的必读书籍。作者竭力探求能够让it工作者在实际工作中轻松应用并掌控的巧妙方法,...
从建立自己的ElasticSearch集群开始,然后进行搜索并扩展搜索参数,你就可以创建一个完全自定义的搜索解决方案。在此基础上,你将进一步地学习ElasticSearch的查询API,以及如何使用强大的过滤和统计功能。在...
goldengate同步无主键无唯一索引表的问题以及解决方案.docx
Dell EMC PowerEdge 服务器参数快速索引指南.pdf
一:union all 肯定是能够命中索引的 二:简单的in能够命中索引 三:对于or,新版的MySQL能够命中索引 四、对于!=,负向查询肯定不能命中索引 五、其他方案
列的 Event 事件,并用来保证写入 Solr 中的 HBase 索引数据的一致性。并且 Indexer 支持 用户自定义的抽取,转换规则来索引 HBase 列数据。Solr 搜索结果会包含用户自定义的 columnfamily:qualifier 字段结果,这样...
《海量数据库解决方案》系列丛书深受广大读者的喜爱已经长达10年之久,在被誉为“圣经”的同时,它已经变成了数据库用户不可或缺的必读书籍。作者竭力探求能够让it工作者在实际工作中轻松应用并掌控的巧妙方法,...
oracle 分区索引,本地索引,全局索引的区别
关于全部已知导致百度索引量下降的原因分析及解决方案.docx
随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table ...