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

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

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

  • 一、Test类部分
@Test
    public void testInsertCustomer(){
        Customer customer = new Customer();
        customer.setName("张三的小名");
        customer.setTelephone("12345678901");
        customer.setDept("人事部");
        customer.setEamil("[email protected]");
        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;
}

来做判断

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章