dbcp下载  传送门

  Commons Pool下载  传送门

  Commons log下载  传送门

  MySQL_(Java)【事物操作】使用JDBC模拟银行转账向数据库发起修改请求  传送门

  MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池  传送门

  DBCP(DataBase Connection Pool):数据库连接池,是Java数据库连接池的一种,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开百度百科

  模拟银行由a向b转账1000元操作,使用事物+DBCP连接池

  

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7.  
  8. public class JDBC01 {
  9.  
  10. public static void main(String[] args) throws SQLException {
  11. transferAccount("a","b",1000);
  12. }
  13.  
  14. public static void selectAll() throws SQLException {
  15. //注册驱动 使用驱动连接数据库
  16. Connection con = null;
  17. Statement stmt = null;
  18. ResultSet rs = null;
  19. try {
  20. //数据库的连接
  21. con = JDBCUtils.getConnection();
  22. //数据库的增删改查
  23. stmt = con.createStatement();
  24. //返回一个结果集
  25. rs =stmt.executeQuery("select * from garytb");
  26.  
  27. while(rs.next()) {
  28. //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
  29. System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
  30. }
  31.  
  32. } catch (Exception e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }finally {
  36. JDBCUtils.close(rs, stmt, con);
  37. }
  38. }
  39.  
  40. //校验用户
  41. public static boolean selectByUernamePassword(String username,String password) throws SQLException {
  42. Connection con=null;
  43. Statement stmt = null;
  44. ResultSet rs = null;
  45. try {
  46. Class.forName("com.mysql.jdbc.Driver");
  47.  
  48. String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
  49. con = DriverManager.getConnection(url,"root","123456");
  50. stmt =con.createStatement();
  51. String sql = "select * from garytb where username = '"+username+"' and password = '"+password+"'";
  52. //System.out.println(sql);
  53. rs = stmt.executeQuery(sql);
  54.  
  55. if(rs.next()) {
  56. return true;
  57. }else {
  58. return false;
  59. }
  60.  
  61. } catch (Exception e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }finally {
  65. if(rs!=null)
  66. rs.close();
  67. if(stmt!=null)
  68. stmt.close();
  69. if(con!=null)
  70. con.close();
  71. }
  72.  
  73. return false;
  74. }
  75.  
  76. public static boolean selectByUP2(String username,String password) throws SQLException{
  77. Connection con=null;
  78. Statement stmt = null;
  79. ResultSet rs = null;
  80. try {
  81. Class.forName("com.mysql.jdbc.Driver");
  82.  
  83. String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
  84. con = DriverManager.getConnection(url,"root","123456");
  85.  
  86. String sql = "select * from garytb where username = ? and password = ?";
  87. PreparedStatement pstmt = con.prepareStatement(sql);
  88. //添加参数
  89. pstmt.setString(1, username);
  90. pstmt.setString(2, password);
  91. //进行查询
  92. rs = pstmt.executeQuery();
  93.  
  94. if(rs.next()) {
  95. return true;
  96. }else {
  97. return false;
  98. }
  99.  
  100. } catch (Exception e) {
  101. // TODO Auto-generated catch block
  102. e.printStackTrace();
  103. }finally {
  104. if(rs!=null)
  105. rs.close();
  106. if(stmt!=null)
  107. stmt.close();
  108. if(con!=null)
  109. con.close();
  110. }
  111.  
  112. return false;
  113. }
  114.  
  115. //pageNumber是页数,第几页,pageCount是每页显示多少个数据
  116. public static void selectUserByPage(int pageNumber,int pageCount) throws SQLException {
  117. //注册驱动 使用驱动连接数据库
  118. Connection con = null;
  119. PreparedStatement stmt = null;
  120. ResultSet rs = null;
  121. try {
  122. Class.forName("com.mysql.jdbc.Driver");
  123.  
  124. //String url ="jdbc:mysql://localhost:3306/garysql";
  125. //指定编码查询数据库
  126. String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
  127. String user = "root";
  128. String password = "123456";
  129. //建立和数据库的连接
  130. con = DriverManager.getConnection(url,user,password);
  131.  
  132. stmt = con.prepareStatement("select * from garytb limit ?,?");
  133. stmt.setInt(1, (pageNumber-1)*pageCount );
  134. stmt.setInt(2, pageCount);
  135.  
  136. rs = stmt.executeQuery();
  137.  
  138. while(rs.next()) {
  139. //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
  140. System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
  141. }
  142.  
  143. } catch (Exception e) {
  144. // TODO Auto-generated catch block
  145. e.printStackTrace();
  146. }finally {
  147. if(rs!=null)
  148. rs.close();
  149. if(stmt!=null)
  150. stmt.close();
  151. if(con!=null)
  152. con.close();
  153. }
  154. }
  155.  
  156. //crud: create read update delete
  157. //插入语句
  158. public static void insert(String username,String password) throws SQLException {
  159. //注册驱动 使用驱动连接数据库
  160. Connection con = null;
  161. PreparedStatement stmt = null;
  162. ResultSet rs = null;
  163. try {
  164. con = JDBCUtils.getConnection();
  165. String sql = "insert into garytb(username,password) values(?,?)";
  166. stmt = con.prepareStatement(sql);
  167. stmt.setString(1, username);
  168. stmt.setString(2, password);
  169. int result =stmt.executeUpdate();// 返回值代表收到影响的行数
  170. System.out.println("插入成功"+username);
  171. } catch (Exception e) {
  172. // TODO Auto-generated catch block
  173. e.printStackTrace();
  174. }finally {
  175. JDBCUtils.close(rs, stmt, con);
  176. }
  177. }
  178. //删除语句
  179. public static void delete(int id) throws SQLException {
  180. //注册驱动 使用驱动连接数据库
  181. Connection con = null;
  182. PreparedStatement stmt = null;
  183. ResultSet rs = null;
  184. try {
  185. con = JDBCUtils.getConnection();
  186.  
  187. String sql = "delete from garytb where id = ?";
  188. stmt = con.prepareStatement(sql);
  189. stmt.setInt(1, id);
  190. int result =stmt.executeUpdate();// 返回值代表收到影响的行数
  191. if(result>0) {
  192. System.out.println("删除成功");
  193. }else {
  194. System.out.println("删除失败");
  195. }
  196. } catch (Exception e) {
  197. e.printStackTrace();
  198. } finally {
  199. JDBCUtils.close(rs, stmt, con);
  200. }
  201. }
  202. //修改语句
  203. public static void update(int id,String newPassword) throws SQLException {
  204. Connection con = null;
  205. PreparedStatement stmt = null;
  206. ResultSet rs = null;
  207. try {
  208. con = JDBCUtils.getConnection();
  209.  
  210. String sql = "update garytb set password = ? where id = ?";
  211. stmt = con.prepareStatement(sql);
  212. stmt.setString(1, newPassword);
  213. stmt.setInt(2, id);
  214. int result =stmt.executeUpdate();// 返回值代表收到影响的行数
  215. if(result>0) {
  216. System.out.println("修改成功");
  217. }else {
  218. System.out.println("修改失败");
  219. }
  220. } catch (Exception e) {
  221. e.printStackTrace();
  222. } finally {
  223. JDBCUtils.close(rs, stmt, con);
  224. }
  225. }
  226.  
  227. //事物操作
  228. //由username1向username2转账金额
  229. public static void transferAccount(String username1,String username2,int money) {
  230. Connection con = null;
  231. PreparedStatement stmt1 = null;
  232. PreparedStatement stmt2 = null;
  233. ResultSet rs = null;
  234. try {
  235. con = DBCPDataSource.getConnection();
  236.  
  237. //开启事物 是否自动提交
  238. con.setAutoCommit(false);
  239.  
  240. String sql = "update garytb set balance = balance - ? where username = ?";
  241. stmt1 = con.prepareStatement(sql);
  242. stmt1.setInt(1, money);
  243. stmt1.setString(2, username1);
  244. stmt1.executeUpdate();// 返回值代表收到影响的行数
  245.  
  246. //显示异常throw new Exception("出现错误");
  247. //隐示异常 空指针异常
  248. //String s = null;
  249. //s.charAt(2);
  250.  
  251. sql = "update garytb set balance = balance + ? where username = ?";
  252. stmt2 = con.prepareStatement(sql);
  253. stmt2.setInt(1, money);
  254. stmt2.setString(2, username2);
  255. stmt2.executeUpdate();// 返回值代表收到影响的行数
  256. System.out.println("操作成功!!");
  257.  
  258. //提交事务
  259. //当事物中所有事物都完成了才会提交
  260. con.commit();
  261.  
  262. } catch (Exception e) {
  263. e.printStackTrace();
  264. } finally {
  265. DBCPDataSource.close(stmt2, stmt1, con);
  266. }
  267. }
  268.  
  269. }

JDBC01.java

  1. import java.sql.Connection;
  2. import java.sql.SQLException;
  3.  
  4. import org.apache.commons.dbcp2.BasicDataSource;
  5. import java.sql.Connection;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9.  
  10. public class DBCPDataSource {
  11.  
  12. private static final String connectionURL = "jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
  13. private static final String username = "root";
  14. private static final String password = "123456";
  15.  
  16. private static BasicDataSource ds;
  17.  
  18. //静态代码块:当整个程序执行的时候,优先加载静态代码块
  19. static {
  20. //初始化dbcp数据源
  21. ds = new BasicDataSource();
  22. ds.setDriverClassName("com.mysql.jdbc.Driver");
  23. ds.setUrl(connectionURL);
  24. ds.setUsername(username);
  25. ds.setPassword(password);
  26.  
  27. //初始化连接池5个
  28. ds.setInitialSize(5);
  29. //连接池最多个数20个
  30. ds.setMaxTotal(20);
  31. //最小的空闲连接
  32. ds.setMinIdle(3);
  33. }
  34.  
  35. public static Connection getConnection() {
  36. try {
  37. //通过dbcp得到的连接,不需要归还,直接close就可以
  38. return ds.getConnection();
  39. } catch (SQLException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. return null;
  44. }
  45.  
  46. public static void close(ResultSet rs,Statement stmt,Connection con) {
  47. closeResultSet(rs);
  48. closeStatement(stmt);
  49. closeConnection(con);
  50. }
  51. public static void close(Statement stmt1,Statement stmt2,Connection con) {
  52. closeStatement(stmt1);
  53. closeStatement(stmt2);
  54. closeConnection(con);
  55. }
  56.  
  57. private static void closeResultSet(ResultSet rs ) {
  58. try {
  59. if(rs!=null)rs.close();
  60. } catch (SQLException e) {
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. }
  64. }
  65. private static void closeStatement(Statement stmt) {
  66. try {
  67. if(stmt!=null)
  68. stmt.close();
  69. } catch (SQLException e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. }
  73. }
  74. private static void closeConnection(Connection con) {
  75. try {
  76. if(con!=null)con.close();//这里会把链接归还给dbcp连接池,并不是真正的断开链接
  77. } catch (SQLException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. }
  81. }
  82.  
  83. }

DBCPDataSource.java

  a向b转账事物方法

  1. //事物操作
  2. //由username1向username2转账金额
  3. public static void transferAccount(String username1,String username2,int money) {
  4. Connection con = null;
  5. PreparedStatement stmt1 = null;
  6. PreparedStatement stmt2 = null;
  7. ResultSet rs = null;
  8. try {
  9. con = DBCPDataSource.getConnection();
  10.  
  11. //开启事物 是否自动提交
  12. con.setAutoCommit(false);
  13.  
  14. String sql = "update garytb set balance = balance - ? where username = ?";
  15. stmt1 = con.prepareStatement(sql);
  16. stmt1.setInt(1, money);
  17. stmt1.setString(2, username1);
  18. stmt1.executeUpdate();// 返回值代表收到影响的行数
  19.  
  20. //显示异常throw new Exception("出现错误");
  21. //隐示异常 空指针异常
  22. //String s = null;
  23. //s.charAt(2);
  24.  
  25. sql = "update garytb set balance = balance + ? where username = ?";
  26. stmt2 = con.prepareStatement(sql);
  27. stmt2.setInt(1, money);
  28. stmt2.setString(2, username2);
  29. stmt2.executeUpdate();// 返回值代表收到影响的行数
  30. System.out.println("操作成功!!");
  31.  
  32. //提交事务
  33. //当事物中所有事物都完成了才会提交
  34. con.commit();
  35.  
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. } finally {
  39. DBCPDataSource.close(stmt2, stmt1, con);
  40. }
  41. }

MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物的更多相关文章

  1. 几个主流java连接池

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  2. 转载: 几个主流的Java连接池整理

    https://www.cnblogs.com/linjian/p/4831088.html 池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所 ...

  3. 几个主流的Java连接池整理

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  4. 关于 Mybatis的原生连接池 和 DBCP 连接池

    一 遇到的问题:  项目用的play框架,数据库DB2, 持久化框架是Mybatis, 连接池用的是Mybatis原生的,遇到的问题是:有时候抛出如下异常: play.api.UnexpectedEx ...

  5. [JavaEE] 了解Java连接池

    转载自51CTO http://developer.51cto.com/art/201006/207768.htm 51CTO曾经为我们简单的介绍过Java连接池.要了解Java连接池我们先要了解数据 ...

  6. JDBC连接池(三)DBCP连接池

    JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了  1.JDBC自定义连接池  2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包   (注意:mysql和mysql 驱动 ...

  7. Java 连接池的工作原理(转)

    原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释 ...

  8. KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

    KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

  9. Redis Java连接池调研

    Redis Java连接池调研 线上服务,由于压力大报错RedisTimeOut,但是需要定位到底问题出现在哪里? 查看Redis慢日志,slowlog get 发现耗时最大的也是11000us也就是 ...

随机推荐

  1. jq之display:none与visible:hidden

    http://www.cnblogs.com/linxiong945/p/4075146.html 今天学习到jquery的hide()部分时,突然有一个想法,jquery中的隐藏/显示部分的实现是给 ...

  2. asp.net 13 缓存,Session存储

    1.缓存 将数据从数据库/文件取出来放在服务器的内存中,这样后面的用来获取数据,不用查询数据库,直接从内存(缓冲)中获取数据,提高了访问的速度,节省了时间,也减轻了数据库的压力. 缓冲空间换时间的技术 ...

  3. 数值或者电话号码被EXCEL转成了科学计数法,用XSSFCell 如何读取

    public static Map<String, Integer> readXls() throws IOException { //用来获取每一个小号重复多次,被多少账号用了.来平均 ...

  4. MySQL之常见错误

    1)mysql导入较大sql文件,出现MySQL server has gone away ERROR (HY000) at line in file: 'E:\xampp\htdocs\SsCpc\ ...

  5. React学习——子组件给父组件传值

    //子组件 var Child = React.createClass({ render: function(){ return ( <div> 请输入邮箱:<input onCha ...

  6. (七)make menuconfig

    1.make menuconfig进入图形界面后,输入 / 进行查找页面,如果输入有错,要删除前面输入的可以输入 ctrl加<--键(ctrl加回退按键)

  7. PAT Basic 1092 最好吃的月饼 (20 分)

    月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出全国各地各种月饼的销量,要求你从中找出 ...

  8. QTP(13)

    练习1:Flight4a 要求: a.录制Flight4a登录+购票+退出业务流程 b.实现登录1次,购票3次,退出1次 c.对Fly From.Fly to.航班实现随机参数化 随机参数化:Rand ...

  9. zencart加大数据表字段长度

    批量表产品名称过长导致被截断的情况,是由于产品名称超出了数据库表中字段设置的最大长度,下面通过修改数据库表字段长度来避免此类情况发生: ) ; ) ; ) ; ) ; ) ; ) ; ) ; ) ; ...

  10. 【2019中国大学生程序设计竞赛-女生专场】C - Function

    原题 韦神提供的思路orz 首先一个显然的性质,所有的c可以提出来,方程变成ax^2+bx的形式 因为x的值是离散的,而m的值又不大 所以一开始让x都为1(注意!x是正整数),然后每次挑一个x让他加一 ...