dbutils插入数据到mysql数据库报莫名其妙地NullpointerException

web层
public class BaseServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        //获取子类字节码对象
        Class clazz = this.getClass();
        System.out.println(this);

        //获取method方法名参数,作为获取方法对象的参数
        String m = request.getParameter("method");
        if(m==null){
            m="index";
        }
        System.out.println(m);

        //获取方法对象
        Method method = clazz.getMethod(m, HttpServletRequest.class, HttpServletResponse.class);

        //让方法执行,返回值为请求转发路径
        String s = (String) method.invoke(this, request, response);
        System.out.println(s);
        //判断次路径是否为空,不为空请求转发到次路径
        if(s != null){
            request.getRequestDispatcher(s).forward(request, response);
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException();
    }


}

public class OrderServlet extends BaseServlet {

/**
 * 生成订单
 * @param request
 * @param response
 * @return
 * @throws Exception
 */
public String add(HttpServletRequest request, HttpServletResponse response) throws Exception {
    //0判断用户是否登录
    User user = (User) request.getSession().getAttribute("user");
    if(user == null) {
        request.setAttribute("msg", "请先登录~~~~~");
        return "/jsp/msg.jsp";
    }

    //1封装数据
    Order order = new Order();

    //1.1 封装订单id
    order.setOid(UUIDUtils.getId());

    //1.2封装订单时间
    order.setOrderTime(new Date());

    //1.3封装订单金额
    //获取session中的购物车
    Cart cart = (Cart) request.getSession().getAttribute("cart");
    order.setTotal(cart.getTotalPrice());

    //1.4封装订单项    
    //从购物车中获取购物车项,遍历购物车中的购物车项,得到每个订单项中的数据
    for (CartItem cartItem : cart.getCartItem()) {
        OrderItem  oi = new OrderItem();
        //设置订单项id
        oi.setItemid(UUIDUtils.getId());
        //设置订单项包含的商品
        oi.setProduct(cartItem.getProduct());
        //设置包含于那个订单
        oi.setOrder(order);
        //设置订单项中的商品数
        oi.setCount(cartItem.getCount());
        //设置定单项的小计
        oi.setSubTotal(cartItem.getSubTotal());

        //添加订单项到order对 象中
        order.getItems().add(oi);
    }

    //1.5设置用户
    order.setUser(user);


    //调用service,完成对订单的添加

     OrderService os = (OrderService) BeanFactory.getBean("OrderService");
     os.add(order);



    //将order对象放入request域
    request.setAttribute("order", order);

    //将以前的购物车中的东西,即将以前的从购物车清除了
    request.getSession().removeAttribute("cart");

    //请求转发到订单详情页面
    return "/jsp/order_info.jsp";
}

}
service层

public interface OrderService {

void add(Order order) throws Exception;

}

public class OrderServiceImpl implements OrderService {
/**
* 将订单数据添加到数据库中
* @throws Exception
*/
@Override
public void add(Order order) throws Exception{

    try {
        //1对者两个添加要加入事务
        DataSourceUtils.startTransaction();

        //2在order添加一条数据
        OrderDao od  = (OrderDao) BeanFactory.getBean("OrderDao");
        od.add2Order(order);
        //在orderitem中添加n条数据
        for (OrderItem oi : order.getItems()) {
            od.add2OrderItem(oi);           
        }
        //提交事务
        DataSourceUtils.commitAndClose();
    } catch (Exception e) {
        e.printStackTrace();
        //事务回滚
        DataSourceUtils.rollbackAndClose();
        throw e;
    }

}

}

dao层

public interface OrderDao {

void add2Order(Order order) throws Exception;

void add2OrderItem(OrderItem oi) throws Exception;

}

public class OrderDaoImpl implements OrderDao{
/**
* 添加一条订单
/
@Override
public void add2Order(Order order) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into order values(?, ?, ?, ?, ?, ?, ?, ?)";
qr.update(DataSourceUtils.getConnection(), sql, order.getOid(), order.getOrderTime(), order.getTotal(),
order.getState(), order.getAddress(), order.getName(),
order.getPhone(), order.getUser().getUid());
}
/
*
* 添加一条订单项
*/
@Override
public void add2OrderItem(OrderItem oi) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into orderitem values(?, ?, ?, ?, ?)";
qr.update(DataSourceUtils.getConnection(),sql, oi.getItemid(), oi.getCount(), oi.getSubTotal(), oi.getProduct().getPid(), oi.getOrder().getOid());

}

}

出错后jsp页面显示不出,所报异常
java.lang.NullPointerException
at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397)
at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275)
at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402)
at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19)
at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28)
at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397)
at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275)
at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402)
at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19)
at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28)
at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82)
... 28 more
七月 08, 2017 12:01:24 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [OrderServlet] in context with path [/store] threw exception
java.lang.RuntimeException
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

com.local.web.servlet.OrderServlet@8bc0b9
add

我用debug方式看了看了下order在dao用dbutils插入时的数据,数据是封装进去的,就name,address,phone,三项没有封装。并已经接图。以前在mysql中插入数据页是可以插入空数值的,
为何会报NullPointerException,困扰了好些时候了,各位大神有时间的话帮着看一下呀!

1,如果你要自己调查的话,
可以下载dbutils和mysql driver的source,
然后在,com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397) 设断点,
一点点反查问题。

2,如果你要自己调查的话, 修改add2Order里的,
修改前

qr.update(DataSourceUtils.getConnection(), sql, order.getOid(), order.getOrderTime(), order.getTotal(), 
order.getState(), order.getAddress(), order.getName(),
order.getPhone(), order.getUser().getUid()); 

修改后

qr.update(DataSourceUtils.getConnection(), "insert into testtable values (?)", "1");

建表语句

CREATE TABLE `demo`.`testtable` (
  `id` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`));

试下上面的语句是否好用。

3,如果想让大家一起分析下的话,
提供下dbutils和mysql driver的版本。
提供下order建表语句。

谢谢大神回答,你说的方式我会试下,我还是提供建表语句您看看吧,因为关键现在导致的那个jsp页面显示不出
都已经两天了,我用的mysql的驱动包是mysql-connector-java-5.0.4-bin.jar,用的myql是mysql Server 5.1,
用的dbutils的jar包是:commons-dbutils-1.4.jar,用的c3p0的连接池的jar包是c3p0-0.9.1.2.jar。本来想在
原贴更新,但我这里电脑没有联网,手机上app上找不到再次编辑原问题的入口,所以只有以回复的方式了,手机上回复老是失败,我用评论试试。

order的建表语句:
CREATE TABLE order (
oid varchar(32) NOT NULL,
ordertime datetime DEFAULT NULL,
total double DEFAULT NULL,
state int(11) DEFAULT NULL,
address varchar(30) DEFAULT NULL,
name varchar(20) DEFAULT NULL,
phone varchar(20) DEFAULT NULL,
uid varchar(32) DEFAULT NULL,
PRIMARY KEY (oid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

orderitem的建表语句:
CREATE TABLE orderitem (
itemid varchar(32) NOT NULL,
count int(11) DEFAULT NULL,
subtotal double DEFAULT NULL,
pid varchar(32) DEFAULT NULL,
oid varchar(32) DEFAULT NULL,
PRIMARY KEY (itemid),
KEY fk_0001 (pid),
KEY fk_0002 (oid),
CONSTRAINT fk_0001 FOREIGN KEY (pid) REFERENCES product (pid),
CONSTRAINT fk_0002 FOREIGN KEY (oid) REFERENCES orders (oid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

order实体类:
public class Order implements Serializable {

private String oid;         
private Date orderTime;
private Double total;

private Integer state=0;//0未支付,1是已支付

private String address;
private String name;

private String phone;
private User user;

//包含那些个订单项
private List<OrderItem> items = new LinkedList<>();


public String getOid() {
    return oid;
}
public void setOid(String oid) {
    this.oid = oid;
}
public Date getOrderTime() {
    return orderTime;
}
public void setOrderTime(Date orderTime) {
    this.orderTime = orderTime;
}
public Double getTotal() {
    return total;
}
public void setTotal(Double total) {
    this.total = total;
}
public int getState() {
    return state;
}
public void setState(int state) {
    this.state = state;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAddress() {
    return address;
}
public void setAddress(String address) {
    this.address = address;
}
public String getPhone() {
    return phone;
}
public void setPhone(String phone) {
    this.phone = phone;
}
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}
public List<OrderItem> getItems() {
    return items;
}
public void setItems(List<OrderItem> items) {
    this.items = items;
}

}

OrderItem实体类:
public class OrderItem implements Serializable {

private String itemid;  
private Integer count;
private Double subTotal;
//包含那个商品
private Product  product;
//被包含于那个订单
private Order order;


public String getItemid() {
    return itemid;
}
public void setItemid(String itemid) {
    this.itemid = itemid;
}
public Product getProduct() {
    return product;
}
public void setProduct(Product product) {
    this.product = product;
}
public Order getOrder() {
    return order;
}
public void setOrder(Order order) {
    this.order = order;
}
public Integer getCount() {
    return count;
}
public void setCount(Integer count) {
    this.count = count;
}

public Double getSubTotal() {
    return subTotal;
}
public void setSubTotal(Double subTotal) {
    this.subTotal = subTotal;
}

}

你好,尝试用你提供的版本,确实出现同样的问题。
个人怀疑可能是mysql connector的bug。

如果你是学习的话,建议用下面版本。
mysql-connector-java-5.1.41-bin.jar

这个问题是,你数据库的表order和sql关键字排序order冲突了,你insert order的时候它会默认吧order转为关键字,也就是你这条sql会存在语法错误了,我是在淘宝开代码调试的,刚才有人来问我同样的问题,我看到你的帖子了,发现也没有人给出答案,那我就自己解决了。
我的淘宝店铺是“浮想翩翩软件开发”