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;
}
来做判断