使用NamedParameterJdbcTemplate向oracle插入枚举类型数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用NamedParameterJdbcTemplate向oracle插入枚举类型数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4682字,纯文字阅读大概需要7分钟。
内容图文
![使用NamedParameterJdbcTemplate向oracle插入枚举类型数据](/upload/InfoBanner/zyjiaocheng/495/dd52604300b4400c9096c90fdbcea5bf.jpg)
1 create table meta_physic_column 2 ( 3 id varchar2(128), 4 name varchar2(128), 5 description varchar2(512), 6 table_id varchar2(128), 7 data_type varchar2(128), 8 primary_key varchar2(1) 9 );
执行如下代码插入数据时出现了“无效的列类型”错误
1 public void insertPhysicColumn(MetaPhysicColumn physicColumn) { 2 String sql = "insert into meta_physic_column (id, name, description, table_id, data_type, primary_key) values( :id, :name, :description, :tableId, :dataType, :primaryKey)"; 3 SqlParameterSource paramSource = new BeanPropertySqlParameterSource(physicColumn); 4 this.getNamedParameterJdbcTemplate().update(sql, paramSource); 5 }
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [insert into cngtest(id, name, description, table_id, data_type, primary_key) values( ?, ?, ?, ?, ?, ?)]; SQL state [99999]; error code [17004]; 无效的列类型; nested exception is java.sql.SQLException: 无效的列类型 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649)
从Oracle中读取varchar2类型数据装配到相应的枚举类型不会出现问题,但是插入数据时,BeanPropertySqlParameterSource没有提供枚举类型到varchar2的映射,执行时会报错。从源码分析:SqlParameterSource是用来实现命名参数传递的接口,NamedParameterJdbcTemplate.update()通过调用其中的getSqlType(var)和getValue(var)两个函数来获取列对应的SQL类型和JAVA中绑定的对象,BeanPropertySqlParameterSource是SqlParameterSource的一个实现,继承结构为BeanPropertySqlParameterSource extends AbstractSqlParameterSource implements SqlParameterSource,AbstractSqlParameterSource类中提供了registerSqlType()函数手动注册列的类型,可以通过这个接口把枚举对应列注册为varchar2类型,代码如下,但是每个对象中的枚举属性名字都不同,这个方法不具有一般性;
1 public void insertPhysicColumn(MetaPhysicColumn physicColumn) { 2 String sql = "insert into meta_physic_column (id, name, description, table_id, data_type, primary_key) 3 values( :id, :name, :description, :tableId, :dataType, :primaryKey)"; 4 BeanPropertySqlParameterSource paramSource = new BeanPropertySqlParameterSource(physicColumn); 5 paramSource.registerSqlType("dataType", Types.VARCHAR); 6 this.getNamedParameterJdbcTemplate().update(sql, paramSource); 7 }
另一个解决方法是继承BeanPropertySqlParameterSource,在子类中覆盖getSqlType()方法,其中先调用父类的getSqlType(),如果没有找到列对应的SQL类型,并且这个列对应对象为枚举类型,则返回Varchar2, 在使用上子类和BeanPropertySqlParameterSource完全一样,但是提供了对枚举类型的支持,代码如下
1 public class MyBeanPropertySqlParameterSource extends BeanPropertySqlParameterSource { 2 3 public MyBeanPropertySqlParameterSource(Object object) { 4 super(object); 5 } 6 @Override 7 public int getSqlType(String var) { 8 int sqlType = super.getSqlType(var); 9 if (sqlType == TYPE_UNKNOWN && hasValue(var)) { 10 if (getValue(var).getClass().isEnum()) { 11 sqlType = Types.VARCHAR; 12 } 13 } 14 return sqlType; 15 } 16 }
1 public void insertPhysicColumn(MetaPhysicColumn physicColumn) { 2 String sql = "insert into meta_physic_column (id, name, description, table_id, data_type, primary_key) values( :id, :name, :description, :tableId, :dataType, :primaryKey)"; 3 SqlParameterSource paramSource = new MyBeanPropertySqlParameterSource(physicColumn); 4 this.getNamedParameterJdbcTemplate().update(sql, paramSource); 5 }
ps:对于boolean类型,BeanPropertySqlParameterSource将其映射为SQL的varchar2,将表结构对应类型设为number会报错;从数据库读取varchar2类型到boolean类型时,JdbcTemplate只能识别0和1,其他字符同样会报错。
使用NamedParameterJdbcTemplate向oracle插入枚举类型数据
标签:.exe sla temp frame 定义 date() end 匹配 error
本文系统来源:http://www.cnblogs.com/ngchen/p/7892019.html
内容总结
以上是互联网集市为您收集整理的使用NamedParameterJdbcTemplate向oracle插入枚举类型数据全部内容,希望文章能够帮你解决使用NamedParameterJdbcTemplate向oracle插入枚举类型数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。