课程疑问

课程疑问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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回答

同学你好!

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

1
2
3
4
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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
1
2
3
4
5
6
7
老师我对问题2又有点问题,就是在使用C3p0配置文件时,使用配置文件的文件名除了和xml文件一样
要放在web目录下,文件名是否也要和xml文件一样要有特点的文件名,这样默认加载的时候根据这个
文件名来查找?
我尝试了一下,把xml文件删除,按照配置文件的方式,但是出错了: NO Suitable driver 
没有何使的驱动 这是什么意思?按理来说,当我执行方法demo2()的时候,第一步就会去工具类JDBCUtils2
中创建常量池,并且加载驱动什么的,然后会默认加载配置文件,但是这里出错了,老师我哪里
出现了问题呀?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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;
        }
    }
     
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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