记账本开发记录——第十天(2020.1.28)

今天,简单学习了JDBC连接池的概念和自定义连接池。

所谓连接池,就是连接完后不close,而是归还到连接池内,可以解决数据库连接的性能问题。

对于自定义连接池,我们可以自己创建连接池,然后通过这个连接池进行连接。如下代码:

 1 public class MyDataSource implements DataSource{
 2     // 创建一个List集合用于存放多个连接对象.
 3     private List<Connection> list = new ArrayList<Connection>();
 4     // 在程序开始的时候,初始化几个连接,将连接存放到list中.
 5     public MyDataSource() {
 6         // 初始化3个连接:
 7         for(int i=1;i<=3;i++){
 8             Connection conn = JDBCUtils.getConnection();
 9             list.add(conn);
10         }
11     }
12
13     @Override
14     // 获得连接的方法:
15     public Connection getConnection() throws SQLException {
16         if(list.size() <= 0){
17             for(int i=1;i<=3;i++){
18                 Connection conn = JDBCUtils.getConnection();
19                 list.add(conn);
20             }
21         }
22         Connection conn = list.remove(0);
23         return conn;
24     }
25
26     // 归还连接的方法:
27     public void addBack(Connection conn){
28         list.add(conn);
29     }
30 ...
31 }

可这样的自定义连接会出现一定的问题,比如需要记住自己定义的API名字,并且不能使用面向对象的接口方式,等于是放弃了一个大好的特性。因此要解决这个问题,我们直接不定义自己的API,通过改写自带的方法,就可以达到一样的效果:

 1 public class MyConnection implements Connection{
 2
 3     private Connection conn;
 4     private List<Connection> list;
 5
 6     public MyConnection(Connection conn,List<Connection> list) {
 7         this.conn = conn;
 8         this.list = list;
 9     }
10
11
12     @Override
13     public void close() throws SQLException {
14         list.add(conn);
15     }
16      ...
17 }
18
19 连接池的getConnection方法:
20     @Override
21     // 获得连接的方法:
22     public Connection getConnection() throws SQLException {
23         if(list.size() <= 0){
24             for(int i=1;i<=3;i++){
25                 Connection conn = JDBCUtils.getConnection();
26                 list.add(conn);
27             }
28         }
29         Connection conn = list.remove(0);
30         MyConnection myConn = new MyConnection(conn, list);
31         return myConn;
32     }

但实际开发中,我们可以使用开源的连接池,如DBCP和C3P0,并且学习了这两个开源连接池的使用方式:

C3P0:

第一步:引入C3P0连接池的jar包.
第二步:编写代码:
* 手动设置参数:
* 配置文件设置参数:
 

我们也可以通过书写工具类来进行一个更为便捷的操作:

 1 public class JDBCUtils2 {
 2     private static final ComboPooledDataSource DATA_SOURCE =new ComboPooledDataSource();
 3     /**
 4      * 获得连接的方法
 5      */
 6     public static Connection getConnection(){
 7         Connection conn = null;
 8         try {
 9             conn = DATA_SOURCE.getConnection();
10         } catch (SQLException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14         return conn;
15     }
16 ...

对于DBCP,配置要更为繁琐:

 1 @Test
 2     /**
 3      * 手动方式:
 4      */
 5     public void demo1(){
 6         Connection conn = null;
 7         PreparedStatement stmt = null;
 8         ResultSet rs = null;
 9         BasicDataSource dataSource = new BasicDataSource();
10         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
11         dataSource.setUrl("jdbc:mysql:///web_07");
12         dataSource.setUsername("root");
13         dataSource.setPassword("123");
14         try{
15             // 获得连接:
16             conn = dataSource.getConnection();
17             // 编写SQL:
18             String sql = "select * from category";
19             // 预编译SQL:
20             stmt = conn.prepareStatement(sql);
21             // 执行SQL:
22             rs = stmt.executeQuery();
23             while(rs.next()){
24                 System.out.println(rs.getInt("cid")+"   "+rs.getString("cname"));
25             }
26         }catch(Exception e){
27             e.printStackTrace();
28         }finally{
29             JDBCUtils.release(rs,stmt, conn);
30         }
31     }
32
33     @Test
34     /**
35      * 配置文件方式:
36      */
37     public void demo2(){
38         Connection conn = null;
39         PreparedStatement stmt = null;
40         ResultSet rs = null;
41         Properties properties = new Properties();
42
43         try{
44             properties.load(new FileInputStream("src/dbcpconfig.properties"));
45             DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
46             // 获得连接:
47             conn = dataSource.getConnection();
48             // 编写SQL:
49             String sql = "select * from category";
50             // 预编译SQL:
51             stmt = conn.prepareStatement(sql);
52             // 执行SQL:
53             rs = stmt.executeQuery();
54             while(rs.next()){
55                 System.out.println(rs.getInt("cid")+"   "+rs.getString("cname"));
56             }
57         }catch(Exception e){
58             e.printStackTrace();
59         }finally{
60             JDBCUtils.release(rs,stmt, conn);
61         }
62     }

目前来说,C3P0使用的xml配置文件要更为简单和方便。

之后,学习了DBUtils的使用。DBUtils就是把JDBC的各种操作进行了简化,下面是一些实例操作:

 1 package cn.itheima.jdbc.test;
 2
 3 import java.sql.SQLException;
 4
 5 import org.apache.commons.dbutils.QueryRunner;
 6 import org.junit.Test;
 7
 8 import cn.itheima.jdbc.utils.C3P0Utils;
 9
10 /**
11  * 测试DBUtils工具类的增删改操作
12  *
13  * @author Never Say Never
14  * @date 2016年7月31日
15  * @version V1.0
16  */
17 public class TestDBUtils1 {
18
19     /**
20      * 添加所有用户方法
21      */
22     @Test
23     public void testAddUser() {
24         try {
25             // 1.创建核心类QueryRunner
26             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
27             // 2.编写SQL语句
28             String sql = "insert into tbl_user values(null,?,?)";
29             // 3.为站位符设置值
30             Object[] params = { "余淮", "耿耿" };
31             // 4.执行添加操作
32             int rows = qr.update(sql, params);
33             if (rows > 0) {
34                 System.out.println("添加成功!");
35             } else {
36                 System.out.println("添加失败!");
37             }
38         } catch (SQLException e) {
39             // TODO Auto-generated catch block
40             e.printStackTrace();
41         }
42     }
43
44     /**
45      * 根据id修改用户方法
46      *
47      */
48     @Test
49     public void testUpdateUserById() {
50         try {
51             // 1.创建核心类QueryRunner
52             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
53             // 2.编写SQL语句
54             String sql = "update tbl_user set upassword=? where uid=?";
55             // 3.为站位符设置值
56             Object[] params = { "xxx", 21 };
57             // 4.执行添加操作
58             int rows = qr.update(sql, params);
59             if (rows > 0) {
60                 System.out.println("修改成功!");
61             } else {
62                 System.out.println("修改失败!");
63             }
64         } catch (SQLException e) {
65             // TODO Auto-generated catch block
66             e.printStackTrace();
67         }
68     }
69
70     /**
71      * 根据id删除用户方法
72      */
73     @Test
74     public void testDeleteUserById() {
75         try {
76             // 1.创建核心类QueryRunner
77             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
78             // 2.编写SQL语句
79             String sql = "delete from tbl_user where uid=?";
80             // 3.为站位符设置值
81             Object[] params = {19};
82             // 4.执行添加操作
83             int rows = qr.update(sql, params);
84             if (rows > 0) {
85                 System.out.println("删除成功!");
86             } else {
87                 System.out.println("删除失败!");
88             }
89         } catch (SQLException e) {
90             // TODO Auto-generated catch block
91             e.printStackTrace();
92         }
93     }
94 }
  1 package cn.itheima.jdbc.test;
  2
  3 import java.sql.SQLException;
  4 import java.util.List;
  5 import java.util.Map;
  6
  7 import org.apache.commons.dbutils.QueryRunner;
  8 import org.apache.commons.dbutils.handlers.BeanHandler;
  9 import org.apache.commons.dbutils.handlers.BeanListHandler;
 10 import org.apache.commons.dbutils.handlers.ColumnListHandler;
 11 import org.apache.commons.dbutils.handlers.MapListHandler;
 12 import org.apache.commons.dbutils.handlers.ScalarHandler;
 13 import org.junit.Test;
 14
 15 import cn.itheima.domain.User;
 16 import cn.itheima.jdbc.utils.C3P0Utils;
 17
 18 /**
 19  * 测试DBUtils查询操作
 20  *
 21  * @author Never Say Never
 22  * @date 2016年7月31日
 23  * @version V1.0
 24  */
 25 public class TestDBUtils2 {
 26
 27     /*
 28      * 查询所有用户方法
 29      */
 30     @Test
 31     public void testQueryAll() {
 32         try {
 33             // 1.获取核心类queryRunner
 34             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
 35             // 2.编写sql语句
 36             String sql = "select * from tbl_user";
 37             // 3.执行查询操作
 38             List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
 39             // 4.对结果集集合进行遍历
 40             for (User user : users) {
 41                 System.out.println(user.getUname() + " : " + user.getUpassword());
 42             }
 43         } catch (SQLException e) {
 44             throw new RuntimeException(e);
 45         }
 46     }
 47
 48     /*
 49      * 根据id查询用户方法
 50      */
 51     @Test
 52     public void testQueryUserById() {
 53         try {
 54             // 1.获取核心类queryRunner
 55             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
 56             // 2.编写sql语句
 57             String sql = "select * from tbl_user where uid=?";
 58             //3.为占位符设置值
 59             Object[] params = {21};
 60             // 4.执行查询操作
 61             User user = qr.query(sql, new BeanHandler<User>(User.class), params);
 62             System.out.println(user.getUname() + " : " + user.getUpassword());
 63         } catch (SQLException e) {
 64             throw new RuntimeException(e);
 65         }
 66     }
 67
 68     /*
 69      * 根据所有用户的总个数
 70      */
 71     @Test
 72     public void testQueryCount() {
 73         try {
 74             // 1.获取核心类queryRunner
 75             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
 76             // 2.编写sql语句
 77             String sql = "select count(*) from tbl_user";
 78             // 4.执行查询操作
 79             Long count = (Long) qr.query(sql, new ScalarHandler());
 80             System.out.println(count);
 81         } catch (SQLException e) {
 82             throw new RuntimeException(e);
 83         }
 84     }
 85
 86     /*
 87      * 查询所有用户方法
 88      */
 89     @Test
 90     public void testQueryAll1() {
 91         try {
 92             // 1.获取核心类queryRunner
 93             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
 94             // 2.编写sql语句
 95             String sql = "select * from tbl_user";
 96             // 3.执行查询操作
 97             List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
 98             // 4.对结果集集合进行遍历
 99             for (Map<String, Object> map : list) {
100                 System.out.println(map);
101             }
102         } catch (SQLException e) {
103             throw new RuntimeException(e);
104         }
105     }
106
107     /*
108      * 查询所有用户方法
109      */
110     @Test
111     public void testQueryAll2() {
112         try {
113             // 1.获取核心类queryRunner
114             QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
115             // 2.编写sql语句
116             String sql = "select * from tbl_user";
117             // 3.执行查询操作
118             List<Object> list = qr.query(sql, new ColumnListHandler("uname"));
119             // 4.对结果集集合进行遍历
120             for (Object object : list) {
121                 System.out.println(object);
122             }
123         } catch (SQLException e) {
124             throw new RuntimeException(e);
125         }
126     }
127 }

需要注意的是,DBUtils的方法有一些涉及到map和list等集合,这部分需要好好进行理解。

今日学习的问题:有一些jar包虽然名字一样,但实际使用起来却不一样,需要仔细看看。

原文地址:https://www.cnblogs.com/wushenjiang/p/12238579.html

时间: 2024-09-28 22:59:30

记账本开发记录——第十天(2020.1.28)的相关文章

记账本开发记录——第八天(2020.1.26)

在疫情如此严重的现在,在家安心学习. 昨天初一守夜无聊的时候学完了JQ剩下的部分.这里讲到了一个插件validate.使用这个插件可以很方便的进行表单的检验,并且具有很好看的效果样式.以下是代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>网站注册页面</title> 6 <style> 7 #contan

记账本开发记录——第十二天(2020.1.30)

今天,学习了HTTP协议的相关内容和Servlet的运行原理.HTTP协议,全称叫做超文本传输协议,是一种网络协议,用来定义WEB浏览器与WEB服务器之间交换数据的过程. 在HTTP协议中,分为HTTP请求和HTTP响应(request和response)在HTTP请求中,根据请求方式的不同,内容也有所不同.对于get请求,会将内容放在浏览器URL内,不如post请求安全.post请求会把内容放到request内,而不会显示在浏览器URL内,相对来说要更加的安全. 在请求中有很多固定的参数,作为

家庭记账本开发记录(1)

这个寒假前面的时间一直在学习web前端,因为之前开发JavaWeb时,一些界面应用太粗糙,所以利用前段时间系统了解了一下前端技术,以便接下来后端开发的界面美观.再就是今天的关于家庭记账本软件的开发,确定了一下设计思路,其中主要是对数据库的操作比较重要,因为记账的收入支出需要进行数据汇总,一段时间以后用可视化数据报表进行呈现.对收入支出的费用又各有分类,收入有薪资.理财.红包.借入.收债.其他,支出消费.餐饮.购物.住房.交通.通讯.娱乐.医疗.教育.红包.旅行.投资.借出.还债.其他,至于对数据

记账本开发记录——第三天(2020.1.20)

本来按照今天的原计划来说,应该学习完javascript的基础内容.但今天一天都在干活,到晚上八点才坐到电脑前,已经精疲力尽了.于是简单设计了一下网站的几个页面和大体结构.以下是具体: 网站主界面: 开始记账界面: (希望实现:点击加号后弹出一个界面进行增) (删除时要弹出确认提示) (改时可以更改所有信息,也是弹出一个界面) 账单汇总 (选择汇总条件,目前只计划添加某时间段,如果时间允许增加种类等属性) (查找后输出在某段时间内总花费) 图表数据(尝试使用百度的smartart功能,生成一段时

记账本开发记录——第四天(2020.1.21)

总结:今天学习完了javascript的第一部分基础知识(昨天没学完的)并尝试使用div+css编写了记账本的index.html.以下是具体: 首先,使用javascript完成了首页轮播图效果,使用了setInterval.下面是代码:(实现较为低级) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>首页</title>

记账本开发记录——第十三天(2020.1.31)

今天主要是学习了如何使用servletcontext来进行一个记录网站登录人数的案例.在实现这个案例之前,首先要学习相关的知识. ServletContext:在服务器启动的时候,为每个web应用创建一个单独的ServletContext对象,我们可以使用这个对象存储数据. 那么我们实现这个案例的思路是如何呢?我们可以在登录的Servlet中初始一个变量count为0,然后将其存到ServletContext中,在进入页面时就读取ServletContext的内容.下面是相关代码: packag

记账本开发记录——第五天(2020.1.22)

今天继续学习了javascript的相关内容,同时学习了关于表格标签的一些新标签. 首先,学习了如何使表格隔行换色.整体的思路不算复杂,用java里的思路就可以大致理解,以下是效果和代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>表格隔行换色</title> 6 <script> 7 window.onl

记账本开发记录——第六天(2020.1.22)

在学习JQ之前,我上网百度了一下,看看是否有学习该部分的必要.根据网友所说,虽然JQ的使用率不比以前,但作为一个十分经典的框架,仍然值得学习.现在很多框架都依赖于JQ,这点也是不容忽略的.在JQ中的AJAX也是个很多公司需要的功能.总的来说对于初学者来说学习JQ还是很有必要的. 在学习了一部分JS的基础上,今天学习了jQuery的基本操作.jQuery其实就是js query(查询),从名字可以看到,jQuery是对JS代码的一个简单化的框架.运用JQ可以很简单的编写出用JS来说比较复杂的案例.

记账本开发记录——第七天(2020.1.24)

今天由于除夕以及各种乱七八糟的事,并没有学习完JQ的知识.下面是我学习到的案例: 首先,了解了使用JQ的遍历操作.在JQ中,有两种遍历方法,这里采用的是第二种方法.通过JQ重写了JS的省市二级联动.下面是代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>使用jQuery完成省市二级联动</title> 6 <st