课程疑问

课程疑问

1.C3P0使用xml文件和配置文件一样都是放在类路径下面也就是src文件下嘛?
   web工程下也是这样?
   
2.C3P0使用properties配置文件的方式是怎么样?就是一开始我们的
  JDBCUtils使用:
  InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
  去加载配置文件,这种就是使用配置文件的方式嘛?
  
3.在视频最后的时候,我们把创建连接池的步骤抽取到了工具类,然后直接把获取连接对象中
  的方法中的加载驱动也去除掉了,而是直接用连接池常量去获得连接对象,为什么这里要去除
  加载驱动?是因为在创建连接池对象的时候,内部会去自动加载驱动嘛?

	//创建一个静态连接池常量
	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
	
	/*
	 *获得连接的方法
	 */
	public static Connection getConnection() throws Exception {
		//直接从连接池中获取连接对象
		Connection conn = dataSource.getConnection();
		return conn;
	}


正在回答

登陆购买课程后可参与讨论,去登陆

7回答

同学你好!

你的配置文件里面的属性书写有误,可以使用下面的配置测试一下

c3p0.driverClass = com.mysql.jdbc.Driver
c3p0.jdbcUrl = jdbc:mysql://localhost:3306/jdbctest
c3p0.user = root
c3p0.password =root

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • jia_蛙 提问者 #1
    老师 修改之后还是报:No suitable driver
    2020-01-12 11:48:36
提问者 jia_蛙 2020-01-12 11:48:13
  • 同学,老师这里测试你的代码是没有问题的,建议你clean一下项目,或者重新创建一个项目测试一下。祝学习愉快~
    2020-01-12 13:39:18
  • 提问者 jia_蛙 回复 好帮手慕柯南 #2
    老师 我找到问题了,我之前写的url是c3p0.url,正确的应该为c3p0.jdbcUrl,所以会照成No suitable driver,现在已经可以查到数据了,老师我还有一个问题,就是如果两种配置文件的方式都存在,系统是会先默认去找xml文件下的配置信息是吧
    2020-01-12 15:24:50
  • 好帮手慕柯南 回复 提问者 jia_蛙 #3
    同学是的,默认会先找xml文件下的配置信息。祝学习愉快~
    2020-01-12 16:10:51
提问者 jia_蛙 2020-01-11 21:52:39
package com.zhou.jdbc.demo3;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.zhou.jdbc.utils.JDBCUtils;
import com.zhou.jdbc.utils.JDBCUtils2;

/**
 * 连接池的测试类
 * @author 25677
 *
 */
public class DataSourceDemo1 {
	
	@Test
	/**
	 * 使用配置文的方式连接连接池
	 * C3P0有两种配置方式:
	 * 	1.使用xx.properties属性文件
	 *  2.使用xml文件  默认的
	 *  - 默认情况下C3P0会在类路径下面也就是src下面一个名为"c3p0-config.xml"文件
	 *  
	 */
	public void demo2() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			//1.获得连接:
			//1.1 创建连接池
			//每次都创建一个连接这样会照成资源浪费,所以我们把这部也抽取成一个工具类
			//这样就能保证我们的连接池在一个程序中只被初始化
			//ComboPooledDataSource dataSource = new ComboPooledDataSource();
			
			//2.直接从连接池中获得连接:
			//conn = dataSource.getConnection();
			conn = JDBCUtils2.getConnection();
			
			//3.编写SQL
			String sql = "SELECT * FROM  user";
			//4.预编译SQL
			pstmt = conn.prepareStatement(sql);
			//5.因为没有占位符代表参数,所以这里不用设置参数
			//6.执行SQL
			rs = pstmt.executeQuery();
			while(rs.next()) {
				System.out.println(rs.getInt("uid") + "   " + rs.getString("username") + "   " + 
						   rs.getString("password") + rs.getString("name"));
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils2.release(rs, pstmt, conn);
		}
	}
}


------------------------------
package com.zhou.jdbc.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * JDBC的工具类
 * @author 25677
 *
 */
public class JDBCUtils2 {
	//创建一个静态连接池常量,创建连接池对象时会自动注册驱动
	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
	
	/*
	 *获得连接的方法
	 */
	public static Connection getConnection() throws Exception {
		//直接从连接池中获取连接对象
		Connection conn = dataSource.getConnection();
		return conn;
	}

	/**
	 * 资源释放
	 */
	public static void release(Statement stmt,Connection conn) {
		if(stmt != null) {
			try {
				stmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		
		if(conn != null) {
			try {
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
		
	}
	public static void release(ResultSet rs,Statement stmt,Connection conn) {
		if(rs != null) {
			try {
				rs.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		
		if(stmt != null) {
			try {
				stmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		
		if(conn != null) {
			try {
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
	
}

http://img1.sycdn.imooc.com//climg/5e19d325096ca4f712510754.jpg

好帮手慕阿满 2020-01-10 19:15:12

同学你好,如果是使用属性文件配置c3p0,文件名应该写为c3p0.properties,其中的配置参考如下:

http://img1.sycdn.imooc.com//climg/5e185c68096ebb7a02020105.jpg

http://img1.sycdn.imooc.com//climg/5e185c68097d63b209570230.jpg

工具类中的代码参考如下:

http://img1.sycdn.imooc.com//climg/5e185c9c09a4671709410404.jpg

创建ComboPooledDataSource对象cpds时,会获取配置文件中的数据。

祝:学习愉快~

  • 提问者 jia_蛙 #1
    老师你看一下,我已经修改了文件名,但是还是出错,哪里需要改?
    2020-01-11 21:54:00
  • 提问者 jia_蛙 #2
    谢谢老师!
    2020-01-12 16:59:47
好帮手慕阿满 2020-01-10 16:55:04

同学你好,c3p0配置文件的名字必须是c3p0-config.xml。这样创建数据库连接池时会默认加载该配置文件,如果不是这个名字,则会报错。

祝:学习愉快~

  • 提问者 jia_蛙 #1
    我的意思是我删除了xml,使用xx.properties配置文件的时候失败了,是不是因为xx.properties配置文件没有用规定的名字所以会出现下面这种错误!我试了一下把c3p0-config.properties 还是报错,和下面一样
    2020-01-10 17:02:22
  • 好帮手慕阿满 回复 提问者 jia_蛙 #2
    同学你好,c3p0的配置文件是xml文件,不能是properties。另外名字一定是c3p0-config才可以。祝:学习愉快~
    2020-01-10 17:09:17
  • 提问者 jia_蛙 回复 好帮手慕阿满 #3
    课程中不是说了C3P0有两种配置方式,一个是属性文件一个xml文件两种方式嘛?
    2020-01-10 17:14:50
提问者 jia_蛙 2020-01-10 15:09:45
老师我对问题2又有点问题,就是在使用C3p0配置文件时,使用配置文件的文件名除了和xml文件一样
要放在web目录下,文件名是否也要和xml文件一样要有特点的文件名,这样默认加载的时候根据这个
文件名来查找?
我尝试了一下,把xml文件删除,按照配置文件的方式,但是出错了: NO Suitable driver 
没有何使的驱动 这是什么意思?按理来说,当我执行方法demo2()的时候,第一步就会去工具类JDBCUtils2
中创建常量池,并且加载驱动什么的,然后会默认加载配置文件,但是这里出错了,老师我哪里
出现了问题呀?

http://img1.sycdn.imooc.com//climg/5e1823170948ad8006120337.jpg

package com.zhou.jdbc.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * JDBC的工具类
 * @author 25677
 *
 */
public class JDBCUtils2 {
	//创建一个静态连接池常量
	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
	
	/*
	 *获得连接的方法
	 */
	public static Connection getConnection() throws Exception {
		//直接从连接池中获取连接对象
		Connection conn = dataSource.getConnection();
		return conn;
	}

	/**
	 * 资源释放
	 */
	public static void release(Statement stmt,Connection conn) {
		if(stmt != null) {
			try {
				stmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		
		if(conn != null) {
			try {
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
		
	}
	public static void release(ResultSet rs,Statement stmt,Connection conn) {
		if(rs != null) {
			try {
				rs.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		
		if(stmt != null) {
			try {
				stmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		
		if(conn != null) {
			try {
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
	
}
public class DataSourceDemo1 {
	
	@Test
	/**
	 * 使用配置文的方式连接连接池
	 * C3P0有两种配置方式:
	 * 	1.使用xx.properties属性文件
	 *  2.使用xml文件  默认的
	 *  - 默认情况下C3P0会在类路径下面也就是src下面一个名为"c3p0-config.xml"文件
	 *  
	 */
	public void demo2() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			//1.获得连接:
			//1.1 创建连接池
			//每次都创建一个连接这样会照成资源浪费,所以我们把这部也抽取成一个工具类
			//这样就能保证我们的连接池在一个程序中只被初始化
			//ComboPooledDataSource dataSource = new ComboPooledDataSource();
			
			//2.直接从连接池中获得连接:
			//conn = dataSource.getConnection();
			conn = JDBCUtils2.getConnection();
			
			//3.编写SQL
			String sql = "SELECT * FROM  user";
			//4.预编译SQL
			pstmt = conn.prepareStatement(sql);
			//5.因为没有占位符代表参数,所以这里不用设置参数
			//6.执行SQL
			rs = pstmt.executeQuery();
			while(rs.next()) {
				System.out.println(rs.getInt("uid") + "   " + rs.getString("username") + "   " + 
						   rs.getString("password") + rs.getString("name"));
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils2.release(rs, pstmt, conn);
		}
	}
	
	
}	


好帮手慕阿满 2020-01-10 13:57:14

同学你好,关于同学的问题:

1、C3P0使用xml文件和配置文件一样都是放在src文件的,web项目也是一样。在之后使用maven项目后,将会放在resources配置文件下。

2、使用C3p0配置文件时,在创建数据库连接池对象ComboPooledDataSource时,就会默认加载配置文件,如:

http://img1.sycdn.imooc.com//climg/5e18121609138f9410810087.jpg

3、是的,同学理解的不错。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 jia_蛙 #1
    老师麻烦看一下我的问题
    2020-01-10 15:10:08
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师