在jdbc封装(基础的CRUD)的时候(查询一条数据,查询多条数据,更新。。。。)经常会用到一个BeanUtil来设置属性值,当对象中存在Date类型的时候,会报错:如下:

2017-11-03 13:47:01 13   ERROR [main] org.apache.commons.beanutils.PropertyUtils     - Method invocation failed.
java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1773)
    at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
    at org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
    at org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
    at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
    at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:313)
    at com.voice.Test.Dao2.transforMapListToBeanList(Dao2.java:111)
    at com.voice.Test.Dao2.getForList(Unknown Source)
    at com.voice.Test.TestAllTest.test(TestAllTest.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

好吧,先附上代码:

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.commons.beanutils.BeanUtils; /**
* java类的属性
* 1)在javaEE中,java的类的属性通过getter,setter来定义:get(或者set)方法,去除get(或者set)后,后字母小写即为java类的属性;以前那个那个属性叫做成员变量
* 操作java类的属性有一个工具包:beanutils a.setProperty b.getProperty
*
* dao:data access object
* why:实现功能模块化,有利于代码维护和升级
* what:访问信息的类,包含了CRUD(creat read update delete);DAO可以被子类继承或者直接使用
* how:适用jdbc编写 DAO 可能会包含的方法
*insert update deleted都可以通过以下
*void update(Strig sql ,Object...args)
*
*查询一条纪录:
*<T> T get(Class<T>clazz,String sql,Object...args)
*
*查询多条数据
*<T> List<T> getForList(Class<t>clazz,String sql,Object...args)
*
*返回某个字段都值或者是统计的值(一共有多少条纪录)
*<E> E getForValue(String sql,Object...args)
*/
public class Dao2 { public void update(String sql,Object...args) throws Exception{
Connection con = null;
PreparedStatement p = null;
ResultSet r = null;
try {
con = JdbcTools.getConnection();
p = con.prepareStatement(sql);
for(int i=0;i<args.length;i++){
p.setObject(i+1, args[i]);
}
p.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcTools.releaseDB(r, p, con);
}
}
//查询一条纪录:
public <T> T get(Class<T>clazz,String sql,Object...args) throws Exception{
List<T> result = getForList(clazz, sql, args);
if(result.size()>0){
return result.get(0);
}
return null;
} //查询多条数据
public <T> List<T> getForList(Class<T>clazz,String sql,Object...args) throws Exception{
List<T> list = new ArrayList<>();
Connection con = null;
PreparedStatement p = null;
ResultSet r = null;
try {
//1. 得到结果集
con = JdbcTools.getConnection();
p = con.prepareStatement(sql);
for(int i=0;i<args.length;i++){
p.setObject(i+1, args[i]);
}
r = p.executeQuery();
//1. 处理结果集得到 map对应的list,其中一个map对象就是一条纪录,key是字段名
List<Map<String, Object>> values = handelResultSetToMapList(r);
//1. 把map的list转为clazz对应的list,map的key是clazz的propertyName,而map的value是clazz对应的对象的value
list = transforMapListToBeanList(clazz, values);
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcTools.releaseDB(r, p, con);
} return list;
}
private <T> List<T> transforMapListToBeanList(Class<T> clazz, List<Map<String, Object>> values)
throws InstantiationException, IllegalAccessException, InvocationTargetException {
List<T> result = new ArrayList<>();
T bean = null;
if(values.size()>0){
for(Map<String,Object> entry:values){
bean = clazz.newInstance();
for(Map.Entry<String, Object> entry1:entry.entrySet()){
String propertyName = entry1.getKey();
Object propertyValue = entry1.getValue();
if("addTime".equals(propertyName)){
SimpleDateFormat format = new SimpleDateFormat("yyyy-M-dd HH:mm:ss");
try {
propertyValue =format.parse(propertyValue+"");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
BeanUtils.setProperty(bean, propertyName, propertyValue);
}
//把object对象放入
result.add(bean);
}
}
return result;
}
/**
*处理结果集,得到Map的一个List其中,一个map对象对应一条纪录
*/
private List<Map<String, Object>> handelResultSetToMapList(ResultSet r) throws Exception, SQLException {
List<Map<String,Object>> values = new ArrayList<>();
List<String> lable = getCloumLable(r);
//7.处理resultset ,使用while
while(r.next()){
Map<String,Object> map = new HashMap<String,Object>();
//11.填充的map对象放入5准备的List中
for(String name:lable){
Object obj = r.getObject(name);
map.put(name, obj);
}
values.add(map);
}
return values;
}
//返回某个字段都值或者是统计的值(一共有多少条纪录)
public <E> E getForValue(String sql,Object...args) throws Exception{
//得到结果集,该结果集只有一行且只有一列
Connection con = null;
PreparedStatement p = null;
ResultSet r = null;
try {
con = JdbcTools.getConnection();
p = con.prepareStatement(sql);
for(int i=0;i<args.length;i++){
p.setObject(i+1, args[i]);
}
r = p.executeQuery();
//取得结果集
if(r.next()){
return (E) r.getObject(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcTools.releaseDB(r, p, con);
} return null;
} /**
*获取结果集的ColumLable 对应的list(得到数据库字段名)
*/
public List<String> getCloumLable(ResultSet rs) throws Exception{
List<String> list = new ArrayList<>();
ResultSetMetaData a = rs.getMetaData();
for(int i=0;i<a.getColumnCount();i++){
String name = a.getColumnLabel(i+1);
list.add(name);
}
return list;
}
}

很奇怪?难道都不行么?所有的转换都不行,还是只是时间不行?(看到代码标红处,好像不显示颜色,就是 transforMapListToBeanList方法那里!有个日期转换的!)我Debug的时候发现Date类型的属性时,类型是TimeStamp.这个到现在还不是为啥,普通的Date类型,Debug的时候类型是Date,,百度了一下,说就是有Date的时候会出现这个问题。好吧,直接处理掉就可以了,(看到代码标红处)。

BeanUtils Date的更多相关文章

  1. BeanUtils No value specified for Date的解决方法

    /** * ConversionException: No value specified for Date的解决方法 */ ConvertUtils.register(new DateConvert ...

  2. BeanUtils 日期转换(本地格式yyyy-MM-dd)转换成date

    1.BeanUtils工具的使用 1)beanUtils 可以便于对javaBean的属性进行赋值. 2)beanUtils 可以便于对javaBean的对象进行赋值. 3)beanUtils可以将一 ...

  3. BeanUtils.copyProperties方法,当属性Date为null解决

    问题描述:org.apache.commons.beanutils user对象和formBean对象都有属性birthday,而且都是java.sql.Date类型的 当进行BeanUtils.co ...

  4. 使用BeanUtils设置属性转换String到Date类型

    主要是用来设置非空对象的属性. 1 使用BeanUtils进行设置属性时,对于String,int可以自动转换.比如下面的例子 常用方法 1)BeanUtils.setProperty    //// ...

  5. No value specified for 'Date' BeanUtils.copyProperties 日期为空 转型错误

    BEGIN; 最近在用spring data,使用的hibernate实现,然后用了一对多等关系配置,导致PO类转换JSON时会死循环,最后使用VO接受数据解决该问题.PO与VO相互转换我用的是org ...

  6. java jdbc的优化之BeanUtils组件

    1. BeanUtils组件 1.1 简介 程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件. BeanUtils ...

  7. Beanutils基本用法

    Beanutils用了魔术般的反射技术,实现了很多夸张有用的功能,都是C/C++时代不敢想的.无论谁的项目,始终一天都会用得上它.我算是后知后觉了,第一回看到它的时候居然错过. 1.属性的动态gett ...

  8. BeanUtils

    BeanUtils包的使用   BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: ...

  9. BeanUtils.copyProperties()方法和PropertyUtils.copyProperties()的区别

    首先两者来源于同一个包: import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.Prop ...

随机推荐

  1. 键盘遮挡控件(textfield/textview.......)

    采用的是通知的常规方式 // 解决键盘遮挡问题//选择didShow是因为需要键盘的高度//选择willHide是因为视图frame重置需要优先于键盘消失,否则表现得不连贯 [[NSNotificat ...

  2. 路由传参,path和query的刷新报错js文件丢失

    日常的路由跳转,基本都会用到传参,有两种方式:path + query, name + params 常用的写法: this.$router.push({ path: 'proDetail',quer ...

  3. matlab2018a安装后帮助文档打不开解决方法

    安装matlab2018a破解版后,帮助文档提示需要许可证问题(破解版没有可用许可证): 解决方法是把文档设置为离线即可(预设---->帮助---->安装在本地---->小窗口)

  4. Zeppelin interperter 模式设置总结图解2

    该配置是在zeppelin的Interpreter的后台配置文件:conf/Interpreter.json spark Interpreter的模块定义那里.特别感谢开发团队组长大神的提示,深入挖掘 ...

  5. JQuery制作网页—— 第二章 JavaScript操作BOM对象

    1.window对象: 浏览器对象模型(BOM)是javascript的组成之一, 它提供了独立与浏览器窗口进行交换的对象,使用浏览器对象模型可以实现与HTML的交互. 它的作用是将相关的元素组织包装 ...

  6. PHP Socket服务器搭建和测试

    1.socket服务器搭建思路 1) 目的:理解socket服务器工作机制 2) 思路:创建socket -> 把socket加入连接池 -> 处理接收信息 -> 握手动作 -> ...

  7. 17-比赛1 C - Binary Nim (栈的游戏)

    题目描述 Tweedle-Dee 和 Tweedle-Dum 正在进行一场激烈的二进制 Nim 游戏.这是你没有玩过的船新版本,游戏包含 N 个栈,每个栈只包含 0 和 1 的元素.就像一般的 Nim ...

  8. python,多线程

    多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生. Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核.多线程的并发在Python中就是一个美丽的梦. ...

  9. 110Balanced Binary Tree

    问题:判断二叉树是否为平衡二叉树分析:树上的任意结点的左右子树高度差不超过1,则为平衡二叉树.         搜索递归,记录i结点的左子树高度h1和右子树高度h2,则i结点的高度为max(h1,h2 ...

  10. 1082: [SCOI2005]栅栏

    链接 思路 二分+搜索+剪枝. 首先二分一个答案,表示最多可以切出x块.(一个结论:切出的一定是从较小的前x块.如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多.) ...