1. 增删改查 常用Handler处理器示例

QueryRunner类提供了两个构造方法:
•默认的构造方法
•需要一个 javax.sql.DataSource来作参数的构造方法。
 
public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatement和ResultSet
的创建和关闭。
public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource)或使用的setDataSource方法中重新获得Connection。
public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :执行一个不需要置换参数的查询操作。
public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
 
ResultSetHandler 接口的实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
  1. public class Demo1 {
  2.  
  3. /**
  4. create database dbutils;
  5. use dbutils;
  6. create table user(
  7. id int primary key auto_increment,
  8. name varchar(40),
  9. password varchar(40),
  10. email varchar(60),
  11. birthday date
  12. );
  13. insert into user(name,password,email,birthday) values('zs','123','xj@qq.com','1990-06-27');
  14. insert into user(name,password,email,birthday) values('ls','123','xj@qq.com','1990-06-27');
  15. insert into user(name,password,email,birthday) values('ww','123','xj@qq.com','1990-06-27');
  16. * @throws SQLException
  17. */
  18.  
  19. @Test
  20. public void add() throws SQLException
  21. {
  22. //创建QueryRunner时带 连接池,获得的连接 用完后会自动归还到连接池
  23. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  24. String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
  25. Object[] params = {"kevin", "12345", "xj@163.com", new Date()};
  26. qr.update(sql, params);
  27. }
  28.  
  29. @Test
  30. public void delete() throws SQLException
  31. {
  32. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  33. String sql = "delete from user where id=?";
  34. qr.update(sql, 1);
  35. }
  36.  
  37. @Test
  38. public void update() throws SQLException
  39. {
  40. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  41. String sql = "update user set name=? where id=?";
  42. Object[] params = {"xiangjie", 2};
  43. qr.update(sql, params);
  44. }
  45.  
  46. @Test
  47. public void find() throws SQLException
  48. {
  49. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  50. String sql = "select * from user where id=?";
  51. Object[] params = {2};
  52. User user = (User) qr.query(sql, new BeanHandler(User.class), params);
  53. System.out.println(user.getName());
  54. }
  55.  
  56. @Test
  57. public void getAll() throws SQLException
  58. {
  59. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  60. String sql = "select * from user";
  61. List list = (List) qr.query(sql, new BeanListHandler(User.class));
  62. System.out.println(list.size());
  63. }
  64.  
  65. @Test
  66. public void testBatch() throws SQLException //SQL批处理
  67. {
  68. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  69. String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
  70. Object[][] params = new Object[10][];
  71. for(int i=0; i<10; i++)
  72. {
  73. params[i] = new Object[]{"xx"+i, "123456", "xj@qq.com", new Date()};
  74. }
  75. qr.batch(sql, params);
  76. }
  77.  
  78. // dbutils 存储大文本 (不建议使用,无缓存,文本被直接放到内存,很大文本直接用JDBC)
  79. /*
  80. create table testclob
  81. (
  82. id int primary key auto_increment,
  83. resume text
  84. );
  85. */
  86. @Test
  87. public void testclob() throws IOException, SerialException, SQLException
  88. {
  89. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  90. String path = Demo1.class.getClassLoader().getResource("test.txt").getPath();
  91. String sql = "insert into testclob(resume) values(?)";
  92. FileReader in =new FileReader(path);
  93. char[] buffer = new char[(int) new File(path).length()];
  94. in.read(buffer);
  95. SerialClob clob = new SerialClob(buffer);
  96. Object[] params = {clob};
  97. qr.update(sql, params);
  98. }
  99.  
  100. /*
  101. * dbutils 提供的 handler 处理器
  102. */
  103. @Test
  104. public void testArrayHandler() throws SQLException
  105. {
  106. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  107. String sql = "select * from user";
  108. Object[] result = (Object[]) qr.query(sql, new ArrayHandler());
  109. System.out.println(Arrays.asList(result));
  110. }
  111.  
  112. @Test
  113. public void testArrayListHandler() throws SQLException
  114. {
  115. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  116. String sql = "select * from user";
  117. List<Object[]> list = (List<Object[]>) qr.query(sql, new ArrayListHandler());
  118. for(Object[] obj : list)
  119. System.out.println(Arrays.asList(obj));
  120. }
  121.  
  122. @Test
  123. public void testKeyedHandler() throws SQLException
  124. {
  125. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  126. String sql = "select * from user";
  127.  
  128. Map<Integer, Map> map = (Map<Integer, Map>) qr.query(sql, new KeyedHandler("id"));
  129. for(Map.Entry<Integer, Map> me : map.entrySet())
  130. {
  131. int id = me.getKey();
  132. Map<String, Object> innermap = me.getValue();
  133. for(Map.Entry<String , Object> innerme : innermap.entrySet() )
  134. {
  135. String columnName = innerme.getKey();
  136. Object value = innerme.getValue();
  137. System.out.println(columnName + "=" + value);
  138. }
  139. System.out.println("-----------------");
  140. }
  141. }
  142.  
  143. @Test
  144. public void testMapHandler() throws SQLException
  145. {
  146. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  147. String sql = "select * from user";
  148.  
  149. Map<String, Object> map = (Map<String, Object>) qr.query(sql, new MapHandler());
  150. for(Map.Entry<String , Object> entry : map.entrySet())
  151. {
  152. System.out.println(entry.getKey() + "=" + entry.getValue());
  153. }
  154. }
  155.  
  156. @Test
  157. public void testMapListHandler() throws SQLException
  158. {
  159. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  160. String sql = "select * from user";
  161.  
  162. List<Map<String, Object>> list = (List<Map<String, Object>>) qr.query(sql, new MapListHandler());
  163. for(Map<String, Object> map : list)
  164. {
  165. for(Map.Entry<String, Object> entry : map.entrySet())
  166. {
  167. System.out.println(entry.getKey() + "=" + entry.getValue());
  168. }
  169. System.out.println("------------------");
  170. }
  171. }
  172.  
  173. @Test
  174. public void testScalarHandler() throws SQLException
  175. {
  176. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  177. String sql = "select count(*) from user";
  178. long L = (Long) qr.query(sql, new ScalarHandler(1));
  179. int count = (int) L;
  180. System.out.println("count: " + count);
  181. }
  182. }

2. 事务操作

方式一: 能实现功能,但不实用

dao层 提供增删改查,共用一个connect

  1. /*
  2. create table account(
  3. id int primary key auto_increment,
  4. name varchar(40),
  5. money float
  6. );
  7.  
  8. insert into account(name,money) values('aaa',1000);
  9. insert into account(name,money) values('bbb',1000);
  10. insert into account(name,money) values('ccc',1000);
  11. insert into account(name,money) values('ddd',1000);
  12. */
  13.  
  14. public class AccountDao {
  15.  
  16. private Connection conn = null;
  17. public AccountDao(Connection conn)
  18. {
  19. this.conn = conn;
  20. }
  21.  
  22. /*
  23. public void transfer() throws SQLException //不实用
  24. {
  25. Connection conn = null;
  26.  
  27. try {
  28. conn = JdbcUtils_C3P0.getConnection();
  29. conn.setAutoCommit(false);
  30. QueryRunner qr = new QueryRunner();
  31. String sql1 = "update account set money=money-100 where id=1";
  32. String sql2 = "update account set money=money+100 where id=2";
  33.  
  34. qr.update(conn, sql1);
  35. qr.update(conn, sql2);
  36. conn.commit();
  37. System.out.println("transfer success");
  38. } catch (SQLException e) {
  39. conn.rollback();
  40. e.printStackTrace();
  41. }finally{
  42. conn.close();
  43. }
  44. }
  45. */
  46.  
  47. public void update(Account account) throws SQLException
  48. {
  49. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  50. String sql = "update account set name=?,money=? where id=?";
  51. Object[] params = {account.getName(), account.getMoney(), account.getId()};
  52. qr.update(conn, sql, params);
  53. }
  54.  
  55. public Account find(int id) throws SQLException
  56. {
  57. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  58. String sql = "select * from account where id=?";
  59. return (Account) qr.query(conn, sql, id, new BeanHandler(Account.class));
  60. }
  61. }

Service层 提供transfer方法, 操作事务

  1. public class AccountService {
  2.  
  3. public void transfer(int sourceid, int targetid, float money) throws SQLException
  4. {
  5. Connection conn = null;
  6.  
  7. try {
  8. conn = JdbcUtils_C3P0.getConnection();
  9. conn.setAutoCommit(false);
  10. AccountDao dao = new AccountDao(conn);
  11.  
  12. Account source = dao.find(sourceid);
  13. Account target = dao.find(targetid);
  14. source.setMoney(source.getMoney()-money);
  15. target.setMoney(target.getMoney()+money);
  16.  
  17. dao.update(source);
  18. dao.update(target);
  19. conn.commit();
  20.  
  21. } catch (SQLException e) {
  22. if(conn!=null)
  23. conn.rollback();
  24. }finally{
  25. if(conn!=null)
  26. conn.close();
  27. }
  28. }
  29. }

方式二: 利用ThreadLocal容器存储Connection, 实用方案

service层

  1. public class AccountService {
  2.  
  3. public void transfer(int sourceid, int targetid, float money) throws SQLException
  4. {
  5. try {
  6.  
  7. JdbcUtils_C3P0.startTransaction(); //利用工具类, 开启事务
  8.  
  9. AccountDao dao = new AccountDao();
  10.  
  11. Account source = dao.find(sourceid);
  12. Account target = dao.find(targetid);
  13. source.setMoney(source.getMoney()-money);
  14. target.setMoney(target.getMoney()+money);
  15.  
  16. dao.update(source);
  17. //int i=1/0; //制造异常中断
  18. dao.update(target);
  19.  
  20. JdbcUtils_C3P0.commit();
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. JdbcUtils_C3P0.rollback(); //回滚
  24. }finally{
  25. JdbcUtils_C3P0.release(); //释放连接
  26. }
  27. }
  28. }

Dao层

  1. public class AccountDao {
  2.  
  3. private Connection conn = null;
  4. public AccountDao(Connection conn)
  5. {
  6. this.conn = conn;
  7. }
  8.  
  9. public AccountDao(){}
  10.  
  11. public void update(Account account) throws SQLException
  12. {
  13. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  14. String sql = "update account set name=?,money=? where id=?";
  15. Object[] params = {account.getName(), account.getMoney(), account.getId()};
  16. qr.update(JdbcUtils_C3P0.getConnection(), sql, params); //利用工具类获得连接
  17. }
  18.  
  19. public Account find(int id) throws SQLException
  20. {
  21. QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
  22. String sql = "select * from account where id=?";
  23. return (Account) qr.query(JdbcUtils_C3P0.getConnection(), sql, id, new BeanHandler(Account.class));
  24. }
  25. }

工具类:

  1. public class JdbcUtils_C3P0 {
  2.  
  3. private static ComboPooledDataSource ds = null;
  4. private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); //Threadlocal容器
  5. static{
  6. ds = new ComboPooledDataSource("c3p0config");
  7. }
  8.  
  9. public static Connection getConnection() throws SQLException{
  10.  
  11. Connection conn = threadLocal.get();
  12. if(conn==null)
  13. {
  14. conn = getDataSource().getConnection();
  15. threadLocal.set(conn);
  16. }
  17. return conn;
  18. }
  19.  
  20. public static DataSource getDataSource()
  21. {
  22. return ds;
  23. }
  24.  
  25. public static void startTransaction()
  26. {
  27. Connection conn = threadLocal.get();
  28. try{
  29. if(conn == null)
  30. {
  31. conn = getDataSource().getConnection();
  32. threadLocal.set(conn);
  33. }
  34. conn.setAutoCommit(false);
  35. }
  36. catch(Exception e)
  37. {
  38. throw new RuntimeException(e);
  39. }
  40. }
  41.  
  42. public static void rollback()
  43. {
  44. try
  45. {
  46. Connection conn = threadLocal.get();
  47. if(conn!=null)
  48. conn.rollback();
  49. }
  50. catch (Exception e)
  51. {
  52. throw new RuntimeException(e);
  53. }
  54. }
  55.  
  56. public static void commit()
  57. {
  58. try
  59. {
  60. Connection conn = threadLocal.get();
  61. if(conn!=null)
  62. conn.commit();
  63. }
  64. catch (Exception e)
  65. {
  66. throw new RuntimeException(e);
  67. }
  68. }
  69.  
  70. public static void release()
  71. {
  72. try
  73. {
  74. Connection conn = threadLocal.get();
  75. if(conn!=null)
  76. {
  77. conn.close();
  78. threadLocal.remove();
  79. }
  80. }
  81. catch (Exception e)
  82. {
  83. throw new RuntimeException(e);
  84. }
  85. }
  86.  
  87. }

工具类C3P0配置文档

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!--
  4. c3p0-config.xml
  5. private static ComboPooledDataSource ds;
  6. static{
  7. try {
  8. ds = new ComboPooledDataSource("c3p0config");
  9. } catch (Exception e) {
  10. throw new ExceptionInInitializerError(e);
  11. }
  12. }
  13. -->
  14.  
  15. <c3p0-config>
  16. <default-config>
  17. <property name="driverClass">com.mysql.jdbc.Driver</property>
  18. <property name="jdbcUrl">jdbc:mysql://localhost:3306/transaction</property>
  19. <property name="user">root</property>
  20. <property name="password">123456</property>
  21.  
  22. <property name="acquireIncrement">5</property>
  23. <property name="initialPoolSize">10</property>
  24. <property name="minPoolSize">5</property>
  25. <property name="maxPoolSize">100</property>
  26.  
  27. </default-config>
  28.  
  29. <named-config name="c3p0config">
  30. <property name="driverClass">com.mysql.jdbc.Driver</property>
  31. <property name="jdbcUrl">jdbc:mysql://localhost:3306/dbutils</property>
  32. <property name="user">root</property>
  33. <property name="password">123456</property>
  34. <property name="acquireIncrement">5</property>
  35. <property name="initialPoolSize">10</property>
  36. <property name="minPoolSize">5</property>
  37. <property name="maxPoolSize">100</property><!-- intergalactoApp adopts a different approach to configuring statement caching -->
  38. </named-config>
  39.  
  40. </c3p0-config>

Java -- DBUtils 框架 操作MySQL数据库的更多相关文章

  1. Java使用Jdbc操作MySql数据库(一)

    这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...

  2. Java 操作MySql数据库

    Java 项目开发中数据库操作是很重要的一个方面,对于初学者来说,MySql是比较容易熟悉的一种常见数据库,这篇文章记录了如何用Java来操作MySql数据库. 第一章 JDBC的概念 JDBC(Ja ...

  3. Java通过JDBC 进行MySQL数据库操作

    转自: http://blog.csdn.net/tobetheender/article/details/52772157 Java通过JDBC 进行MySQL数据库操作 原创 2016年10月10 ...

  4. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  5. java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据

    package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...

  6. 原生Jdbc操作Mysql数据库开发步骤

    原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤:        1.导入数据库驱动包       ...

  7. 转 用C API 操作MySQL数据库

    用C API 操作MySQL数据库 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数,并在下一节详细介绍了它们.请参见25.2.3节,“C API函数描述”. 函数 描述 mysql_a ...

  8. Code First操作Mysql数据库

    前面博客也讲了,自己做一个网站,选用的是MVC+EF Code First+MySql+EasyUI,先说下技术选型.一.为什么选择MVC? 因为之前自己做的系统大部分是webForm,MVC的之前也 ...

  9. JDBC操作MySQL数据库案例

    JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

随机推荐

  1. 【BZOJ1941】[Sdoi2010]Hide and Seek KDtree

    [BZOJ1941][Sdoi2010]Hide and Seek Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了 ...

  2. Java多线程的两种实现方式

    Java总共有两种方式实现多线程 方式1:通过继承Thread类的方式 package com.day04; /** * 通过继承Thread类并复写run方法来是实现多线程 * * @author ...

  3. 关于JAVA中String类型的最大长度

    前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...

  4. Linux下Solr的安装和配置

    一.安装 1.需要的安装包:apache-tomcat-7.0.47.tar.gz.solr-4.10.3.tgz.tgz(jdk自行安装) 2.解压tomcat并创建solr文件夹 [root@lo ...

  5. IOS开发复习笔记(1)-OC基础知识

    在上班之余学习IOS已经有三个多月了,因为基础有些薄弱从OC的基本语法开始学习的,相继看了青柚子和红柚子的书,现在在看编程实战,趁这个机会好好的总结一下: 1.命名约定 对象类型和名称一致,以免混淆 ...

  6. win7安装laravel

    使用Packagist 镜像 建立一个composer.json文件,内容如下: { "name": "laravel/laravel", "desc ...

  7. Linux下简单的多线程编程--线程池的实现

    /* 写在前面的话: 今天刚“开原”,选择了一篇关于线程池的文件与大家分享,希望能对您学习有所帮助,也希望能与大家共同学习! 选择在这个特殊的时候注册并发文章也是有一些我个人特殊的意义的,看我的id( ...

  8. python爬虫--爬取cctv连续剧

    #encoding=utf-8 import requests from bs4 import BeautifulSoup import re import os from aria2rpc impo ...

  9. windows 和rhel,centos双系统安装

    1:首先确保你先安装为windows系统,为indows7以上的把. 2:安装好为indows系统后,进入系统后把磁盘分区,分出足够的空间为安装linux. 3:再为windows下使用软碟通等工具制 ...

  10. C#对excel的操作

    本文先描述如何用c#连接.操作excel文件. 项目中需要引入的DLL文件为Interop.Excel.Interop.Microsoft.Office.Core.Interop.Office等. 操 ...