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;
}

來做判斷

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