Java -- DBUtils 框架 操作MySQL数据库
1. 增删改查 常用Handler处理器示例
的创建和关闭。
public class Demo1 { /**
create database dbutils;
use dbutils;
create table user(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
);
insert into user(name,password,email,birthday) values('zs','123','xj@qq.com','1990-06-27');
insert into user(name,password,email,birthday) values('ls','123','xj@qq.com','1990-06-27');
insert into user(name,password,email,birthday) values('ww','123','xj@qq.com','1990-06-27');
* @throws SQLException
*/ @Test
public void add() throws SQLException
{
//创建QueryRunner时带 连接池,获得的连接 用完后会自动归还到连接池
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
Object[] params = {"kevin", "12345", "xj@163.com", new Date()};
qr.update(sql, params);
} @Test
public void delete() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "delete from user where id=?";
qr.update(sql, 1);
} @Test
public void update() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "update user set name=? where id=?";
Object[] params = {"xiangjie", 2};
qr.update(sql, params);
} @Test
public void find() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user where id=?";
Object[] params = {2};
User user = (User) qr.query(sql, new BeanHandler(User.class), params);
System.out.println(user.getName());
} @Test
public void getAll() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user";
List list = (List) qr.query(sql, new BeanListHandler(User.class));
System.out.println(list.size());
} @Test
public void testBatch() throws SQLException //SQL批处理
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
Object[][] params = new Object[10][];
for(int i=0; i<10; i++)
{
params[i] = new Object[]{"xx"+i, "123456", "xj@qq.com", new Date()};
}
qr.batch(sql, params);
} // dbutils 存储大文本 (不建议使用,无缓存,文本被直接放到内存,很大文本直接用JDBC)
/*
create table testclob
(
id int primary key auto_increment,
resume text
);
*/
@Test
public void testclob() throws IOException, SerialException, SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String path = Demo1.class.getClassLoader().getResource("test.txt").getPath();
String sql = "insert into testclob(resume) values(?)";
FileReader in =new FileReader(path);
char[] buffer = new char[(int) new File(path).length()];
in.read(buffer);
SerialClob clob = new SerialClob(buffer);
Object[] params = {clob};
qr.update(sql, params);
} /*
* dbutils 提供的 handler 处理器
*/
@Test
public void testArrayHandler() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user";
Object[] result = (Object[]) qr.query(sql, new ArrayHandler());
System.out.println(Arrays.asList(result));
} @Test
public void testArrayListHandler() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user";
List<Object[]> list = (List<Object[]>) qr.query(sql, new ArrayListHandler());
for(Object[] obj : list)
System.out.println(Arrays.asList(obj));
} @Test
public void testKeyedHandler() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user"; Map<Integer, Map> map = (Map<Integer, Map>) qr.query(sql, new KeyedHandler("id"));
for(Map.Entry<Integer, Map> me : map.entrySet())
{
int id = me.getKey();
Map<String, Object> innermap = me.getValue();
for(Map.Entry<String , Object> innerme : innermap.entrySet() )
{
String columnName = innerme.getKey();
Object value = innerme.getValue();
System.out.println(columnName + "=" + value);
}
System.out.println("-----------------");
}
} @Test
public void testMapHandler() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user"; Map<String, Object> map = (Map<String, Object>) qr.query(sql, new MapHandler());
for(Map.Entry<String , Object> entry : map.entrySet())
{
System.out.println(entry.getKey() + "=" + entry.getValue());
}
} @Test
public void testMapListHandler() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from user"; List<Map<String, Object>> list = (List<Map<String, Object>>) qr.query(sql, new MapListHandler());
for(Map<String, Object> map : list)
{
for(Map.Entry<String, Object> entry : map.entrySet())
{
System.out.println(entry.getKey() + "=" + entry.getValue());
}
System.out.println("------------------");
}
} @Test
public void testScalarHandler() throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select count(*) from user";
long L = (Long) qr.query(sql, new ScalarHandler(1));
int count = (int) L;
System.out.println("count: " + count);
}
}
2. 事务操作
方式一: 能实现功能,但不实用
dao层 提供增删改查,共用一个connect
/*
create table account(
id int primary key auto_increment,
name varchar(40),
money float
); insert into account(name,money) values('aaa',1000);
insert into account(name,money) values('bbb',1000);
insert into account(name,money) values('ccc',1000);
insert into account(name,money) values('ddd',1000);
*/ public class AccountDao { private Connection conn = null;
public AccountDao(Connection conn)
{
this.conn = conn;
} /*
public void transfer() throws SQLException //不实用
{
Connection conn = null; try {
conn = JdbcUtils_C3P0.getConnection();
conn.setAutoCommit(false);
QueryRunner qr = new QueryRunner();
String sql1 = "update account set money=money-100 where id=1";
String sql2 = "update account set money=money+100 where id=2"; qr.update(conn, sql1);
qr.update(conn, sql2);
conn.commit();
System.out.println("transfer success");
} catch (SQLException e) {
conn.rollback();
e.printStackTrace();
}finally{
conn.close();
}
}
*/ public void update(Account account) throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "update account set name=?,money=? where id=?";
Object[] params = {account.getName(), account.getMoney(), account.getId()};
qr.update(conn, sql, params);
} public Account find(int id) throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from account where id=?";
return (Account) qr.query(conn, sql, id, new BeanHandler(Account.class));
}
}
Service层 提供transfer方法, 操作事务
public class AccountService { public void transfer(int sourceid, int targetid, float money) throws SQLException
{
Connection conn = null; try {
conn = JdbcUtils_C3P0.getConnection();
conn.setAutoCommit(false);
AccountDao dao = new AccountDao(conn); Account source = dao.find(sourceid);
Account target = dao.find(targetid);
source.setMoney(source.getMoney()-money);
target.setMoney(target.getMoney()+money); dao.update(source);
dao.update(target);
conn.commit(); } catch (SQLException e) {
if(conn!=null)
conn.rollback();
}finally{
if(conn!=null)
conn.close();
}
}
}
方式二: 利用ThreadLocal容器存储Connection, 实用方案
service层
public class AccountService { public void transfer(int sourceid, int targetid, float money) throws SQLException
{
try { JdbcUtils_C3P0.startTransaction(); //利用工具类, 开启事务 AccountDao dao = new AccountDao(); Account source = dao.find(sourceid);
Account target = dao.find(targetid);
source.setMoney(source.getMoney()-money);
target.setMoney(target.getMoney()+money); dao.update(source);
//int i=1/0; //制造异常中断
dao.update(target); JdbcUtils_C3P0.commit();
} catch (SQLException e) {
e.printStackTrace();
JdbcUtils_C3P0.rollback(); //回滚
}finally{
JdbcUtils_C3P0.release(); //释放连接
}
}
}
Dao层
public class AccountDao { private Connection conn = null;
public AccountDao(Connection conn)
{
this.conn = conn;
} public AccountDao(){} public void update(Account account) throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "update account set name=?,money=? where id=?";
Object[] params = {account.getName(), account.getMoney(), account.getId()};
qr.update(JdbcUtils_C3P0.getConnection(), sql, params); //利用工具类获得连接
} public Account find(int id) throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource());
String sql = "select * from account where id=?";
return (Account) qr.query(JdbcUtils_C3P0.getConnection(), sql, id, new BeanHandler(Account.class));
}
}
工具类:
public class JdbcUtils_C3P0 { private static ComboPooledDataSource ds = null;
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); //Threadlocal容器
static{
ds = new ComboPooledDataSource("c3p0config");
} public static Connection getConnection() throws SQLException{ Connection conn = threadLocal.get();
if(conn==null)
{
conn = getDataSource().getConnection();
threadLocal.set(conn);
}
return conn;
} public static DataSource getDataSource()
{
return ds;
} public static void startTransaction()
{
Connection conn = threadLocal.get();
try{
if(conn == null)
{
conn = getDataSource().getConnection();
threadLocal.set(conn);
}
conn.setAutoCommit(false);
}
catch(Exception e)
{
throw new RuntimeException(e);
}
} public static void rollback()
{
try
{
Connection conn = threadLocal.get();
if(conn!=null)
conn.rollback();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
} public static void commit()
{
try
{
Connection conn = threadLocal.get();
if(conn!=null)
conn.commit();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
} public static void release()
{
try
{
Connection conn = threadLocal.get();
if(conn!=null)
{
conn.close();
threadLocal.remove();
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
} }
工具类C3P0配置文档
<?xml version="1.0" encoding="UTF-8"?> <!--
c3p0-config.xml
private static ComboPooledDataSource ds;
static{
try {
ds = new ComboPooledDataSource("c3p0config");
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
--> <c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/transaction</property>
<property name="user">root</property>
<property name="password">123456</property> <property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">100</property> </default-config> <named-config name="c3p0config">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/dbutils</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">100</property><!-- intergalactoApp adopts a different approach to configuring statement caching -->
</named-config> </c3p0-config>
Java -- DBUtils 框架 操作MySQL数据库的更多相关文章
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- Java 操作MySql数据库
Java 项目开发中数据库操作是很重要的一个方面,对于初学者来说,MySql是比较容易熟悉的一种常见数据库,这篇文章记录了如何用Java来操作MySql数据库. 第一章 JDBC的概念 JDBC(Ja ...
- Java通过JDBC 进行MySQL数据库操作
转自: http://blog.csdn.net/tobetheender/article/details/52772157 Java通过JDBC 进行MySQL数据库操作 原创 2016年10月10 ...
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- java数据库 JDBC操作MySQL数据库常用API 部门表和员工表 创建表 添加数据 查询数据
package com.swift.department; import java.sql.Connection; import java.sql.PreparedStatement; import ...
- 原生Jdbc操作Mysql数据库开发步骤
原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤: 1.导入数据库驱动包 ...
- 转 用C API 操作MySQL数据库
用C API 操作MySQL数据库 参考MYSQL的帮助文档整理 这里归纳了C API可使用的函数,并在下一节详细介绍了它们.请参见25.2.3节,“C API函数描述”. 函数 描述 mysql_a ...
- Code First操作Mysql数据库
前面博客也讲了,自己做一个网站,选用的是MVC+EF Code First+MySql+EasyUI,先说下技术选型.一.为什么选择MVC? 因为之前自己做的系统大部分是webForm,MVC的之前也 ...
- JDBC操作MySQL数据库案例
JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...
随机推荐
- EasyNVR浏览器无插件直播在Linux系统下将录像文件与EasyNVR可执行文件分离运行的方案
问题背景 在工控机上运行EasyNVR,WEB访问出现设备在线,但是视频没有快照和无法正常直播: 问题原因分析 通过上工控机发现是由于磁盘空间被占满导致的软件运行收到影响. 解决问题分析 由于录像文件 ...
- UI auto程序结构组织方式
UI Auto分三个layer: 1. Object finding – 单独一个类,寻找到控件.因为UI auto最容易改动的就是UI界面,这样全部放到一起就便于统一修改. 2. Task - 对控 ...
- <2013 08 26> 雅思听力相关
近两日开始接触雅思题型,初步做了6套剑桥雅思题的听力部分,完成情况还可以,这里做个总结. 1.听力总共约40左右道题目,30min左右完成,结束后有十分钟把答案写到答题卷上.所有听力材料都只播放一遍! ...
- Hibernate 框架入门(一)
1. SSH Web 层: Struts2 业务层: Spring 持久层: Hibernate 2. Hibernate 概述 概述 Hibernate 是一个对象关系映射框架(ORM 框架); 对 ...
- JavaWeb 之文件下载
1. 下载概述 下载就是向客户端响应字节数据! 将一个文件变成字节数组, 使用 response.getOutputStream() 来响应给浏览器!! 2. 下载要求 两个头一个流 Content- ...
- 经典书Discrete.Mathematics上的大神
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- 《Python 数据分析》笔记——pandas
Pandas pandas是一个流行的开源Python项目,其名称取panel data(面板数据)与Python data analysis(Python 数据分析)之意. pandas有两个重要的 ...
- Way to Git
最近在学习Git,我先后在CentOS6.4, Ubuntu12.04, Windows7上安装Git,遇到的问题比较多的是在CentOS上的安装,Ubuntu和Windows7上的安装相对比较简单, ...
- Eclipse部署项目的时候抛异常【Multiple Contexts have a path of "/cdcpm".】
Eclipse部署项目的时候抛异常[Multiple Contexts have a path of "/cdcpm".]重新clean .删除server都不好使.查看一下tom ...
- MySQL数据库(3)_MySQL数据库表记录操作语句
附: MYSQL5.7版本sql_mode=only_full_group_by问题 .查询当前sql_mode: select @@sql_mode .查询出来的值为: set @@sql_mode ...