dbutil 案例


    1.DAO层

                                                 dao层处理增删改查

    AccountDao 

package cn.itcast.dbutils.demo;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import cn.itcast.domain.Account;
import cn.itcast.utils.JdbcUtils;

public class AccountDao {
	
	
	
	public AccountDao() {
		super();
		// TODO Auto-generated constructor stub
	}



	private Connection conn;
	public AccountDao(Connection conn){
		this.conn = conn;
	}
	
	
	public void update(Account a){
		try{
			QueryRunner runner = new QueryRunner();
			String sql = "update account set money=? where id=?";
			Object params[] = {a.getMoney(),a.getId()};
			runner.update(JdbcUtils.getConnection(),sql, params);
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public Account find(int id){
		try{
			QueryRunner runner = new QueryRunner();
			String sql = "select * from account where id=?";
			return (Account) runner.query(JdbcUtils.getConnection(),sql, id, new BeanHandler(Account.class));
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	
	
	//从a--->b帐户转100元
	public void transfer() throws SQLException{
		Connection conn = null;
		try{
			conn = JdbcUtils.getConnection();
			conn.setAutoCommit(false);
			
			QueryRunner runner = new QueryRunner();
			String sql1 = "update account set money=money-100 where name='aaa'";
			runner.update(conn,sql1);
			
			String sql2 = "update account set money=money+100 where name='bbb'";
			runner.update(conn,sql2);
			
			conn.commit();
		}finally{
			if(conn!=null){
				conn.close();
			}
		}
	}
	
}

Demo1

package cn.itcast.dbutils.demo;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;

import cn.itcast.domain.User;
import cn.itcast.utils.JdbcUtils;

public class Demo1 {

	/*
	 create database day17;
	 use day17;
	 create table users(
		id int primary key,
		name varchar(40),
		password varchar(40),
		email varchar(60),
		birthday date
	);
	 */
	
	//使用dbutils完成数据库的crud
	
	@Test
	public void insert() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
		Object params[] = {2,"bbb","123","aa@sina.com",new Date()};
		runner.update(sql, params);
	}
	
	@Test
	public void update() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "update users set email=? where id=?";
		Object params[] = {"aaaaaa@sina.com",1};
		runner.update(sql, params);
	}
	
	@Test
	public void delete() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "delete from users where id=?";
		runner.update(sql, 1);
	}
	
	@Test
	public void find() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select * from users where id=?";
		User user = (User) runner.query(sql, 1, new BeanHandler(User.class));
		System.out.println(user.getEmail());
	}
	
	
	@Test
	public void getAll() throws Exception{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select * from users";
		List list = (List) runner.query(sql, new BeanListHandler(User.class));
		System.out.println(list);
	}
	
	@Test
	public void batch() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql =  "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
		Object params[][] = new Object[3][5];
		for(int i=0;i<params.length;i++){  //3
			params[i] = new Object[]{i+1,"aa"+i,"123",i + "@sina.com",new Date()};
		}
		runner.batch(sql, params);
	}
}

Demo2

package cn.itcast.dbutils.demo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import cn.itcast.utils.JdbcUtils;

public class Demo2 {
	//测试dbutils的各个结果集处理器
	
	@Test
	public void test1() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select * from users";
		Object result[] = (Object[]) runner.query(sql, new ArrayHandler());
		System.out.println(result[0]);
		System.out.println(result[1]);
	}
	
	
	@Test
	public void test2() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select * from users";
		List list = (List) runner.query(sql, new ArrayListHandler());
		System.out.println(list);
	}
	
	@Test
	public void test3() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select * from users";
		List list = (List) runner.query(sql, new ColumnListHandler1("name"));
		System.out.println(list);
	}
	
	
	@Test
	public void test4() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select * from users";
		Map<Integer,Map<String,Object>> map = (Map) runner.query(sql, new KeyedHandler("id"));
		for(Map.Entry<Integer,Map<String,Object>> me : map.entrySet()){
			int id = me.getKey();
			for(Map.Entry<String, Object> entry : me.getValue().entrySet()){
				String name = entry.getKey();
				Object value = entry.getValue();
				System.out.println(name + "=" + value);
			}
		}
	}
	
	@Test
	public void test5() throws SQLException{
		QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
		String sql = "select count(*) from users";
		//Object result[] = (Object[]) runner.query(sql, new ArrayHandler());
		/*long totalrecord = (Long)result[0];
		int num = (int)totalrecord;
		System.out.println(num);
		int totalrecord = ((Long)result[0]).intValue();
		*/
		
		int totalrecord = ((Long)runner.query(sql, new ScalarHandler(1))).intValue();
		System.out.println(totalrecord);
	}
	
	
}


class ColumnListHandler1 implements ResultSetHandler{

	private String columnName;
	public ColumnListHandler1(String columnName){
		this.columnName = columnName;
	}
	public Object handle(ResultSet rs) throws SQLException {
		List list = new ArrayList();
		while(rs.next()){
			list.add(rs.getObject(columnName));
		}
		return list;
	}
}


   2.SERVER层

   BusinessService 

  

package cn.itcast.service;

import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import cn.itcast.dbutils.demo.AccountDao;
import cn.itcast.domain.Account;
import cn.itcast.utils.JdbcUtils;

public class BusinessService {
	
	/*
	
	
	create table account(
		id int primary key auto_increment,
		name varchar(40),
		money float
	)character set utf8 collate utf8_general_ci;
	
	insert into account(name,money) values('aaa',1000);
	insert into account(name,money) values('bbb',1000);
	insert into account(name,money) values('ccc',1000); 
	*/
	
	@Test
	public void test() throws SQLException{
		transfer2(1, 2, 100);
	}
	
	
	public void transfer1(int sourceid,int targetid,double money) throws SQLException{
		
		Connection conn = null;
		try{
			conn = JdbcUtils.getConnection();
			conn.setAutoCommit(false);
			
			AccountDao dao = new AccountDao(conn);
			
			Account a = dao.find(sourceid);   //select
			Account b = dao.find(targetid);   //select
			
			a.setMoney(a.getMoney()-money);  
			b.setMoney(b.getMoney()+money);   
			
			dao.update(a); //update
			
			dao.update(b);//update
			
			conn.commit();
		}finally{
			if(conn!=null) conn.close();
		}
	}
	
	
	//用上ThreadLocal的事务管理
	public void transfer2(int sourceid,int targetid,double money) throws SQLException{
		
		try{
			JdbcUtils.startTransaction();
			AccountDao dao = new AccountDao();
			Account a = dao.find(sourceid);   //select
			Account b = dao.find(targetid);   //select
			a.setMoney(a.getMoney()-money);  
			b.setMoney(b.getMoney()+money);   
			dao.update(a); //update
			dao.update(b);//update
			JdbcUtils.commitTransaction();
		}finally{
			JdbcUtils.closeConnection();
		}
	}
}

   3.Servlet 层

 

   4.工具层 Util层

    JdbcUtils 

package cn.itcast.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class JdbcUtils {
	private static DataSource ds;
	
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();  //map
	static{
		try{
			Properties prop = new Properties();
			InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
			prop.load(in);
			BasicDataSourceFactory factory = new BasicDataSourceFactory();
			ds = factory.createDataSource(prop);
		}catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	
	public static DataSource getDataSource(){
		return ds;
	}
	
	public static Connection getConnection() throws SQLException{
		try{
			//得到当前线程上绑定的连接
			Connection conn = tl.get();
			if(conn==null){  //代表线程上没有绑定连接
				conn = ds.getConnection();
				tl.set(conn);
			}
			return conn;
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	
	public static void startTransaction(){
		try{
			//得到当前线程上绑定连接开启事务
			Connection conn = tl.get();
			if(conn==null){  //代表线程上没有绑定连接
				conn = ds.getConnection();
				tl.set(conn);
			}
			conn.setAutoCommit(false);
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	
	public static void commitTransaction(){
		try{
			Connection conn = tl.get();
			if(conn!=null){
				conn.commit();
			}
		}catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public static void closeConnection(){
		try{
			Connection conn = tl.get();
			if(conn!=null){
				conn.close();
			}
		}catch (Exception e) {
			throw new RuntimeException(e);
		}finally{
			tl.remove();   //千万注意,解除当前线程上绑定的链接(从threadlocal容器中移除对应当前线程的链接)
		}
	}
}

5.Domain 层

    

  

package cn.itcast.domain;

import java.util.Date;

public class User {
	private int id;
	private String name;
	private String password;
	private String email;
	private Date birthday;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
	
}	

 Account层

package cn.itcast.domain;

public class Account {
	private int id;
	private String name;
	private double money;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	
	
}


dbcpconfig.properties


#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day17
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED




package com.parddu.dao; import java.io.IOException; import java.sql.*; import java.util.Properties; /** * 数据库功能类 * @author parddu * @version Sep 29, 2010 9:49:31 AM */ class DButil { private String driver=null; //驱动 private String dbName=null; //数据库名 private String host=null; //主机名 private String point=null; //端口 private String userName=null; //登录帐号 private String userPass=null; //登录密码 private static DButil info = null; private DButil(){} /** * 初始化方法,加载数据库连接信息 * @throws IOException */ private static void init() throws IOException{ Properties prop = new Properties(); prop.load(DButil.class.getResourceAsStream("/db_config.properties")); info = new DButil(); info.driver = prop.getProperty("driver"); info.dbName = prop.getProperty("dbName"); info.host = prop.getProperty("host"); info.point = prop.getProperty("point"); info.userName = prop.getProperty("userName"); info.userPass = prop.getProperty("userPass"); } /** * 得到数据库连接对象 * @return 数据库连接对象 */ static Connection getConn(){ Connection conn=null; if(info == null){ try { init(); } catch (IOException e) { throw new RuntimeException(e.getMessage()); } } if(info!=null){ try { Class.forName(info.driver); String url="jdbc:sqlserver://" + info.host + ":" + info.point + ";databaseName=" + info.dbName; conn=DriverManager.getConnection(url,info.userName,info.userPass); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } else{ throw new RuntimeException("读取数据库配置信息异常!"); } return conn; } /** * 关闭查询数据库访问对象 * @param rs 结果集 * @param st 上下文 * @param conn 连接对象 */ static void closeConn(ResultSet rs, Statement st,Connection conn){ try { rs.close(); } catch (Exception e) {} try { st.close(); } catch (Exception e) {} try { conn.close(); } catch (Exception e) {} } /** * 关闭增、删、该数据库访问对象 * @param st 上下文对象 * @param conn 连接对象 */ static void closeConn(Statement st ,Connection conn){ try{ st.close(); conn.close(); }catch(Exception e){} } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值