conn.excute()插入数据库成功,但却返回false原因

来源:互联网 发布:定义一个二维数组 编辑:程序博客网 时间:2024/05/18 07:22

excute()插入数据库成功,但却返回false

本文主要通过一个插入mysql数据库实例演示:

  • 一、Test类部分
@Test    public void testInsertCustomer(){        Customer customer = new Customer();        customer.setName("张三的小名");        customer.setTelephone("12345678901");        customer.setDept("人事部");        customer.setEamil("123456@qq.com");        crudController.insertCustomer(customer);    }
  • 二、Controller层部分
/**     * 保存用户信息     * @param customer     */    public static void insertCustomer(Customer customer) {        boolean flag = crudService.insertCustomer(customer);        if (flag){            System.out.println("保存客户信息成功");        } else {            System.out.println("保存客户信息失败");        }    }
  • 三、Service层部分
/**     * 保存客户信息     */    public boolean insertCustomer(Customer customer){        boolean flag = false;        try {            conn = dataSourceUtil.getConnection();            String sql = "insert into demo_customer(cus_name,cus_telephone,cus_dept,cus_email)" +                    "values(?,?,?,?)";            ps = conn.prepareCall(sql);            ps.setString(1,customer.getName());            ps.setString(2,customer.getTelephone());            ps.setString(3,customer.getDept());            ps.setString(4,customer.getEamil());            flag = ps.execute();        } catch (Exception e){            e.printStackTrace();        } finally {            dataSourceUtil.realeaseResource(rs,ps,conn);        }        return flag;    }
  • 涉及到的dataSources类
package com.qiuxx.c3p0_java;import com.mchange.v2.c3p0.ComboPooledDataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;/** * c3p0连接池工具类 */public class DataSourceUtil {    private static final String username = "root";    private static final String password = "root";//**设置密码**    private static final String driverName = "com.mysql.jdbc.Driver";    private static final String url = "jdbc:mysql://localhost:3306/demo_test";    private static final int maxPoolSize = 20;  //连接池最大连接数    private static final int minPoolSize = 10;  //连接池最小连接数    private static final int initialPoolSize = 10; //连接池初始的连接数   // private static final int maxStatements = 100; //连接池的缓存Statement的最大数    private static  Connection conn;    private static ComboPooledDataSource dataSources;    static {        try{            dataSources = new ComboPooledDataSource();            dataSources.setDriverClass(driverName);            dataSources.setJdbcUrl(url);            dataSources.setUser(username);            dataSources.setPassword(password);            dataSources.setMaxPoolSize(maxPoolSize);            dataSources.setMinPoolSize(minPoolSize);            dataSources.setInitialPoolSize(initialPoolSize);            //dataSources.setMaxStatements(maxStatements);        } catch (Exception e){            e.printStackTrace();        }    }    public DataSourceUtil(){}    public DataSourceUtil(String JdbcUrl){        dataSources.setJdbcUrl(JdbcUrl);    }    public static Connection getConnection(){        try {            conn = dataSources.getConnection();        } catch (Exception e){            e.printStackTrace();        }        return conn;    }    public static void realeaseResource(ResultSet rs, PreparedStatement ps, Connection conn){        try{            if (null != rs){                rs.close();            }            if (null != ps){                ps.close();            }            if (null != conn){                conn.close();            }        } catch (Exception e){            e.printStackTrace();        }    }}
  • 至于Customer bean类,只有String的name,telephone,email,dept,以及setter/getter/toString方法

最终结果发现,插入数据库成功,但打印的信息确实“保存失败”,这是为什么?
- 追踪excute方法进入CallableStatement类,再追踪excute(),最终进入PreparedStatement类,可以看到返回规则:

return rs != null && rs.reallyResult();

可以看到这有两个判断条件,而在增删改时ResultSet,也就是rs这时是为null的,所以返回一直是false。

  • 建议!!
    flag = ps.execute();修改一下
    使用
int resNum = ps.executeUpdate();if (resNum == 1){   flag = true;}

来做判断

阅读全文
1 0