C3P0配置数据库有两种方式:
(两种方式都是在有c3p0-0.9.1.2.jar这个价包的前提下进行的)
①通过本身自由的set方式,一个个的设置驱动以及账号密码
②封装.xml文件放到Src目录下,直接调用
首先第一种方式: 本身的set方法去设置参数
//建立一个可以跟数据库连接的一个独享对象 ComboPooleDataSource
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//建立以和静态代码块,提高作用域
static {
try { // try{}catch(){} 这里会报错需要抛出异常,直接处理
dataSource.setDriverClass("com.mysql.jdbc.Driver"); //加载驱动
dataSource.setJdbcUrl("jdbc:mysql://localhost:8080/student"); //设置连接的数据库是mysql类型,localhost 代表的是本地,8080 是端口号, student 是数据库
dataSource.setUser("root"); //设置数据库的连接帐号
dataSource.setPassword("admin"); //设置数据库的连接密码
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
//写一个静态方法可以直接通过类名.() 的方式获得该方法
public static Connection getConnection(){ //建立的是一个有Connection返回值类型的方法, 用于外界调用方法直接获取Connection 对象
try {
return dataSource.getConnection(); //用于外界调用方法直接获取Connection 对象
} catch (SQLException e) {
//抛出去一个运行异常,说明数据库连接失败了
throw new RuntimeException("数据库连接失败"+e);
}
return conn;
}
//关闭资源
public static void close(ResultSet rst, Statement sta,Connection conn){
// 分别去判断下ResultSet对象,Statement对象,Connection 对象是不是为空,如果为空说明就没有调用,也不存在关闭资源的说法。相反如果不为空就要节省资源,关闭它。
if (rst != null) {
try {
rst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (sta != null) {
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
第二种方式: 封装XML文件直接调用
在Src的根目录下建立一个.xml文件,C3P0会扫描文件进行相关的配置。
<c3p0-config>
<!-- 使用默认的配置读取连接池对象-->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 连接驱动 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property> <!-- 设置数据库,端口 -->
<property name="user">root</property> <!-- 数据库帐号-->
<property name="password">admin</property> <!-- 数据库密码 -->
<!-- 连接池参数 -->
<!-- 初始连接数 -->
<property name="initialPoolSize">5</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">10</property>
<!-- 最大等待时间 -->
<property name="checkoutTimeout">2000</property>
<!-- 最大空闲回收时间 -->
<property name="maxIdleTime">1000</property>
</default-config>
</c3p0-config>
然后直接去封装C3P0
//第一步 建立一个ComboPooleDDataSource对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//第二步 获取Connection 对象
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("程序连接失败"+e);
}
}
//关闭资源
public static void close(ResultSet rst, Statement sta,Connection conn){
if (rst != null) {
try {
rst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (sta != null) {
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
最后的测试连接:
//JDBC_C3P0_Utils代表的是我建立的C3P0的Class类名
Connection conn = JDBC_C3P0_Utils.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement("INSERT INTO user VALUE (?,?,?);"); //?代表的是替代符
preparedStatement.setObject(1,655); //当你上一句调用的?好的时候,是按照顺序来的,比如:这行代码就是 设置第1个'?'为655
preparedStatement.setObject(2,"老王吧");//这行代码就是 设置第2个'?'为"老王吧"
preparedStatement.setObject(3,"cs123");
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("数据添加成功");
}
JDBC_C3P0_Utils.close(null,preparedStatement,conn); //这里如果我们是调用我们的clos(),关闭资源的方法, 如果参数里面没有用到直接使用null代替即可
总结:
C3P0的使用必须要配合C3P0价包(c3p0-0.9.1.2.jar)以及数据库价包(mysql-connector-java-5.1.37-bin.jar)使用。
C3P0只是连接数据库中的一种,另外的还有JDBC,DBUtils等
这里的executrUpdate()方法只用于新增,修改,删除数据,当你使用查询的时候就需要用executeQuery()
PreparedStatement preparedStatement = conn.prepareStatement("SELECT * FROM user where pname=? and pwd=?;");
preparedStatement.setObject(1, name);
preparedStatement.setObject(2, pwds);
ResultSet resultSet = preparedStatement.executeQuery();
preparedStatement.executeQuery()
while (resultSet.next()) {
String pname = resultSet.getString("pname");
String pwd = resultSet.getString("pwd");
System.out.println(pname+" "+pwd+" ");
}