问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

项目数据库链接改成Mysql namedParameterjdbctemplate就不能使用

发布网友 发布时间:2022-04-10 08:34

我来回答

4个回答

懂视网 时间:2022-04-10 12:55

public class MetaPhysicColumn { 2 3 public enum DataType{NUMBER, STRING, DATE, TIMESTAMP} 4 5 private String id; 6 private String name; 7 private String description; 8 private String tableId; 9 private DataType dataType; 10 private boolean primaryKey; 11 }


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   

热心网友 时间:2022-04-10 10:03

1.是否有驱动,并且是否正确使用
2.数据库服务是否启动
3.用户名密码或者URL是否正确

热心网友 时间:2022-04-10 11:21

驱动是mysql的吗? 驱动改了么?

热心网友 时间:2022-04-10 12:56

有没有装jdbc for sql 的驱动,如果装了看看是否指定对了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 2021年斑马线超速撞死人,没有得到谅解可以有哪些民事赔偿吗? 斑马线上撞死人如何断案 酒后骑无证,刹车不灵,在斑马线撞死人怎么判,赔多少钱? 无酒架毒架有证件,只是斑马线过失撞死人怎么赔钱? 斑马线撞死人怎么判 为什么老师会在这里 为什么我会对老师有这样的感觉 为什么老师会在这 老师为什么会这么说呀 为什么老师会这样说? 为啥老师会这样说? 为什么我在老师面前会这样 为什么对老师会有这样的感觉? 为什么老师会那么做 这个老师为什么会这样呢? 老师为什么会这样? 为什么老师会变成这样 幼儿园老师带小朋友孵化鸭蛋,老师为什么会这样做? 原来老师也有逃课的想法,你觉得老师为什么会有这样的想法? 辽宁90后女教师将学生衣服带回家清洗,这位教师为什么会这么做? 跟银行怎么签订代扣代缴协议 国税扣税账户怎么签3方协议 委托中国银行缴纳税款,签订了三方协议 怎么获取扣税发票 郑州浦发银行星期六哪里上班? 之前逾期过钱己还清,剩下的没还完可以坐高铁么? 鸡肾炒芹菜怎么炒好吃 鸡肾炒西芹怎么做好吃 鸡肾煲仔饭怎么做好吃 太平洋两全其美两全险性价比高吗?价格多少? 太平洋人寿燃行保2021性价比怎么样?价格多少? 太平洋人寿燃行保2021有什么优缺点?价格多少? 太平洋人寿燃行保2021哪里买?价格多少? 獐子岛股票为什么涨 SPRING namedParameterJdbcTemplate为什么返回null 签了劳动合同,公司可以随便开除员工吗 没有劳动合同公司可以随意解雇员工吗? 如果签合同是一年,到期以后,公司能随意解雇吗? 适合少女的个性签名 小女生个性签名写什么好? 适合11岁女孩子的个性签名