mysql sqlserver oracle 数据库的驱动jar包
http://download.csdn.net/download/csdn576038874/8833683
package cn.hp.svse.jdbc;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 使用本类的方法,必须提供c3p0-copnfig.xml文件
* @author qdmmy6
*/
public class JdbcUtils {
// 饿汉式
private static DataSource ds = new ComboPooledDataSource();
/**
* 它为null表示没有事务
* 它不为null表示有事务
* 当开启事务时,需要给它赋值
* 当结束事务时,需要给它赋值为null
* 并且在开启事务时,让dao的多个方法共享这个Connection
*/
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
public static DataSource getDataSource() {
return ds;
}
/**
* dao使用本方法来获取连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
/*
* 如果有事务,返回当前事务的con
* 如果没有事务,通过连接池返回新的con
*/
Connection con = tl.get();//获取当前线程的事务连接
if(con != null) return con;
return ds.getConnection();
}
/**
* 开启事务
* @throws SQLException
*/
public static void beginTransaction() throws SQLException {
Connection con = tl.get();//获取当前线程的事务连接
if(con != null) throw new SQLException("已经开启了事务,不能重复开启!");
con = ds.getConnection();//给con赋值,表示开启了事务
con.setAutoCommit(false);//设置为手动提交
tl.set(con);//把当前事务连接放到tl中
}
/**
* 提交事务
* @throws SQLException
*/
public static void commitTransaction() throws SQLException {
Connection con = tl.get();//获取当前线程的事务连接
if(con == null) throw new SQLException("没有事务不能提交!");
con.commit();//提交事务
con.close();//关闭连接
con = null;//表示事务结束!
tl.remove();
}
/**
* 回滚事务
* @throws SQLException
*/
public static void rollbackTransaction() throws SQLException {
Connection con = tl.get();//获取当前线程的事务连接
if(con == null) throw new SQLException("没有事务不能回滚!");
con.rollback();
con.close();
con = null;
tl.remove();
}
/**
* 释放Connection
* @param con
* @throws SQLException
*/
public static void releaseConnection(Connection connection) throws SQLException {
Connection con = tl.get();//获取当前线程的事务连接
if(connection != con) {//如果参数连接,与当前事务连接不同,说明这个连接不是当前事务,可以关闭!
if(connection != null &&!connection.isClosed()) {//如果参数连接没有关闭,关闭之!
connection.close();
}
}
}
}
package cn.hp.svse.jdbc;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
public class TxQueryRunner extends QueryRunner {
//批量操作
@Override
public int[] batch(String sql, Object[][] params) throws SQLException {
Connection con = JdbcUtils.getConnection();
int[] result = super.batch(con, sql, params);
JdbcUtils.releaseConnection(con);
return result;
}
//带多个参数的查询
@Override
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
throws SQLException {
Connection con = JdbcUtils.getConnection();
T result = super.query(con, sql, rsh, params);
JdbcUtils.releaseConnection(con);
return result;
}
//不带参数的查询
@Override
public <T> T query(String sql, ResultSetHandler<T> rsh) throws SQLException {
Connection con = JdbcUtils.getConnection();
T result = super.query(con, sql, rsh);
JdbcUtils.releaseConnection(con);
return result;
}
//不带参数的增,删,改的操作
@Override
public int update(String sql) throws SQLException {
Connection con = JdbcUtils.getConnection();
int result = super.update(con, sql);
JdbcUtils.releaseConnection(con);
return result;
}
//带一个参数的增,删,改的操作
@Override
public int update(String sql, Object param) throws SQLException {
Connection con = JdbcUtils.getConnection();
int result = super.update(con, sql, param);
JdbcUtils.releaseConnection(con);
return result;
}
//带多个参数的增,删,改的操作
@Override
public int update(String sql, Object... params) throws SQLException {
Connection con = JdbcUtils.getConnection();
int result = super.update(con, sql, params);
JdbcUtils.releaseConnection(con);
return result;
}
}
package com.wenjie;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import cn.itcast.jdbc.JdbcUtils;
import cn.itcast.jdbc.TxQueryRunner;
/**
* dao层要操作数据库
* 调用测试代码
* new一个 QueryRunner qr = new TxQueryRunner();
*
* qr.query(),qr.update()...所有的方法都是不需要获取连接的 因为在TxQueryRunner这个类中 每个方法都写了Connection con = JdbcUtils.getConnection();
* 获取连接所以调用方法时,无需再获取连接
* @author 00
*
*/
public class JdbcTest {
/**
* 添加
* 给stuinfo插入一条数据
* @throws Exception
*/
@Test
public void update1() throws Exception{
QueryRunner qr = new TxQueryRunner();
//sql语句
String sql = "insert into stuinfo(stuname,stuno,stuage,stuaddress,stuemail) values(?,?,?,?,?)";
//参数
Object[] params = {"aa","123","22","asdasd","asd@qq.com"};
qr.update(sql, params);
}
/**
* 修改
* 把stuid=10020的学生的名字改为关凤
* @throws SQLException
*/
@Test
public void update2() throws SQLException{
String sql = "update stuinfo set stuname=? where stuid=?";
QueryRunner qr = new TxQueryRunner();
Object[] params = {"关凤","10020"};
qr.update(sql, params);
}
/**
* 删除
* 将stuid=10021的学生删除掉
* @throws SQLException
*/
@Test
public void update3() throws SQLException{
String sql = "delete from stuinfo where stuid=?";
QueryRunner qr = new TxQueryRunner();
Object[] params = {"10021"};
qr.update(sql, params);
}
/**
* 查询
* 根据id查询 一个参数的查询 查询出stuid=10000的学生的信息 这里query的第二个参数要为BeanHandler<User>(User.class)
* 因为查询出来必是一个对象 最后加上参数param
* @throws SQLException
*/
@Test
public void query1() throws SQLException{
String sql = "select * from stuinfo where stuid=?";
QueryRunner qr = new TxQueryRunner();
Object param = 10000;
User user = qr.query(sql, new BeanHandler<User>(User.class),param);
System.out.println(user);
}
/**
* 查询所有
* query的第二个参数要为BeanListHandler<User>(User.class) 查询多月没有参数
* @throws SQLException
*/
@Test
public void query2() throws SQLException{
String sql = "select * from stuinfo";
QueryRunner qr = new TxQueryRunner();
List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
for (int i = 0; i < users.size(); i++) {
System.out.println(users.get(i));
}
}
/**
* 根据id查询 吧查询出来的结果映射成map对象 如果是单表操作的话 MapHandler和BeanHandler没有区别
* 但是如果你要操作的表 与其他表有外键关系的话 用BeanHandler那么外键就映射不到为空值
* 你必须先用MapHandler 然后得到所有的列的数据 然后再转换成实体 这个大家自己试试就知道了
* @throws SQLException
*/
@Test
public void query3() throws SQLException{
String sql = "select * from stuinfo where stuid=?";
QueryRunner qr = new TxQueryRunner();
Object param = 10001;
Map<String, Object> map = qr.query(sql, new MapHandler(),param);
System.out.println(map);
}
@Test
public void query4() throws SQLException{
String sql = "select * from stuinfo";
QueryRunner qr = new TxQueryRunner();
List<Map<String, Object>> mapList = qr.query(sql, new MapListHandler());
for (int i = 0; i < mapList.size(); i++) {
System.out.println(mapList.get(i));
}
}
/**
* 查询记录数
* 用ScalarHandler得到一个对象 转换成Number对象 再用number.intValue()返回int类型的值
* @throws SQLException
*/
@Test
public void query5() throws SQLException{
String sql = "select count(*) from stuinfo";
QueryRunner qr = new TxQueryRunner();
Number number = (Number) qr.query(sql, new ScalarHandler());
int i = number.intValue();
System.out.println(i);
}
/**
* 批量删除
* @throws SQLException
*/
@Test
public void query6() throws SQLException{
String sql = "delete from stuinfo where stuid=?";
Object params[][] = {{"10020"},{"10024"},{"10022"},{"10023"}};
QueryRunner qr = new TxQueryRunner();
qr.batch(sql, params);
}
/**
* 事物操作
* @throws SQLException
*/
@Test
public void query7() throws SQLException{
try {
//直接调用写好的jdbcUtils帮助类
JdbcUtils.beginTransaction();//开启事物
//修改第一个表的一条数据
//被事物包含的操作 如果有异常 事物就会回滚 量表的数据都没发生改变
//修改第二条表的数据
JdbcUtils.commitTransaction();//两条语句都执行成功后 提交事物
} catch (SQLException e) {
try {
JdbcUtils.rollbackTransaction();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}
//数据库连接的配置文件 必须放在src目录下面 而且名字必须为c3p0-config.xml 以下是以mysql为例 oracle sqlserver都可以 只要提供相应的驱动jar包即可
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>