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;
}
來做判斷