`
yuanmengchong
  • 浏览: 6138 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

dbutils +dbcp 连接池构建dao层

阅读更多

前些日子,公司经过需求调研后决定开一个新项目。我新入不久,目测原来的工程都是servlet+jdbc构建。以前那种痛苦的感觉顿时回忆起来,经过商讨决定引入框架,费了点时间把mybatis引入后大伙说jar包太大(精简后加了2.5m,泪奔!还不让用spring,白衣老大我好想跟你混啊)而且仍然感觉繁琐。于是决定用dbutils 搭建一套。无spring。增删改查只需要传递model,也可自己定义sql。dbcp 我打印了datasource 的hasecode  销毁后code相同,这里claose 就是dbcp里的伪关闭啦。下面是代码

 

package com.navitek.yq.dao;

import java.util.List;
import java.util.Map;

public interface Dao {
	/**
	 * @param <T>
	 *            查询list<entry>
	 * @param clazz
	 * @return
	 */
	public <T> List<T> findAll(Class<T> clazz,String where);

	/**
	 * @param <T>
	 *            根据主键查找entry
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T> T findById(Class<T> clazz, int id);

	/**
	 * @param <T>
	 *            仅仅适合存在一个主键,且主键递增的情况
	 * @param clazz
	 * @param map
	 * @return
	 */
	public  boolean insert(Object obj);

	/**
	 * @param <T>
	 *            根据条件更新entry
	 * @param clazz
	 * @param map
	 * @return
	 */
	public <T> int update(Object obj, String where);

	/**
	 * @param <T>
	 *            根据条件更新entry
	 * @param clazz
	 * @param map
	 * @return
	 */
	public <T> int delete(Class<T> clazz, String where);

	// 以下为自定义
	public int insertSql(String sql, Object... args);

	public int updateSql(String sql, Object... args);

	public void deleteSql(String sql, Object... args);

	public List<Map<String, Object>> executeQuerySql(String sql, Object... args);

	/**
	 * @param sql
	 *            批量更新
	 * @param objs
	 * @return
	 */
	public void batchUpdateSql(String sql, Object[][] objs);
}

 

 dao的实现 利用泛型判断

 

package com.navitek.yq.dao;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

import com.mysql.jdbc.JDBC4Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

/**
 */
public class DaoImpl implements Dao {

	private MysqlDataSource dataSource = new MysqlDataSource();

	private QueryRunner qryRun = null;

	private java.sql.DatabaseMetaData dbmb;

	public DaoImpl() {
		dataSource.setUrl("jdbc:mysql://localhost:3306/gdyh");
		dataSource.setUser("root");
		dataSource.setPassword("root");
		// qryRun = new QueryRunner(dataSource);
		qryRun = DbHelper.getQueryRunner();
		dbmb = getDatabaseMetaData();
	}

	private java.sql.DatabaseMetaData getDatabaseMetaData() {
		Properties info = new Properties();
		info.setProperty("user", "root");
		info.setProperty("password", "root");
		java.sql.DatabaseMetaData metaData = null;
		try {
			metaData = new JDBC4Connection("localhost", 3306, info, "gdyh",
					null).getMetaData();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return metaData;
	}

	public <T extends Object> List<T> findAll(Class<T> clazz, String where) {
		if (where == null) {
			where = "";
		}
		ResultSetHandler<List<T>> rsh = new BeanListHandler<T>(clazz);
		List<T> result = null;
		try {
			result = qryRun.query("select * from " + clazz.getSimpleName()
					+ " " + where, rsh);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return result;
	}

	public <T> T findById(Class<T> clazz, int id) {
		ResultSetHandler<T> rsh = new BeanHandler<T>(clazz);
		T result = null;
		try {
			ResultSet rs = dbmb.getPrimaryKeys(null, null, clazz
					.getSimpleName());

			String primary_key = null;
			while (rs.next()) {
				primary_key = rs.getString("Column_name");
			}
			if (!"".equals(primary_key) || null != primary_key) {
				result = qryRun.query("select * from " + clazz.getSimpleName()
						+ " where " + primary_key + "=?", rsh,
						new Object[] { id });

			} else {
				throw new SQLException("This table has not primary key");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return result;
	}

	public List<Map<String, Object>> executeQuery(String sql, Object... args) {
		MapListHandler rsh = new MapListHandler();
		List<Map<String, Object>> result = null;
		try {
			result = qryRun.query(sql, rsh, args);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return result;
	}

	public int insertSql(String sql, Object... args) {
		return executeUpdateSql(sql, args);
	}

	public int updateSql(String sql, Object... args) {
		return executeUpdateSql(sql, args);
	}

	public void deleteSql(String sql, Object... args) {
		executeUpdateSql(sql, args);
	}

	public int executeUpdateSql(String sql, Object... args) {
		int id = 0;
		try {
			id = qryRun.update(sql, args);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return id;
	}

	public void batchUpdateSql(String sql, Object[][] objs) {
		try {
			qryRun.batch(sql, objs);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
	}

	public boolean insert(Object obj) {
		try {
			Map<String, Object> map = new HashMap<String, Object>();
			Field[] field = obj.getClass().getDeclaredFields();
			Field.setAccessible(field, true);
			for (Field f : field) {
				Object o = f.get(obj);
				map.put(f.getName(), o);
			}
			Class clazz = obj.getClass();
			String table = clazz.getSimpleName();
			ResultSet rs1;
			// 得到主键
			ResultSet rs = dbmb.getPrimaryKeys(null, null, table);
			String primary_key = null;
			while (rs.next()) {
				primary_key = rs.getString("Column_name");
			}
			rs1 = dbmb.getColumns(null, null, table, null);
			StringBuffer s = new StringBuffer("insert into " + table + "(");
			StringBuffer sv = new StringBuffer(" values(");
			rs1.last();
			int m = rs1.getRow();
			Object[] objs = new Object[m - 1];
			int count = 0;
			rs1.first();
			while (rs1.next()) {
				String column = rs1.getString("Column_name");
				if (!column.equals(primary_key)) {
					boolean b = rs1.isLast();
					if (b) {
						s.append(column + ")");
						sv.append("?)");
					} else {
						s.append(column + ",");
						sv.append("?,");
					}
					objs[count] = map.get(column);
					count++;
				}
			}
			String sql = s.append(sv).toString();
			int mount = qryRun.update(sql, objs);
			if (mount > 0) {
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return false;
	}

	public int update(Object obj, String where) {
		if (where == null) {
			where = "";
		}
		Class clazz = obj.getClass();
		String table = clazz.getSimpleName();
		ResultSet rs1;
		try {
			Map<String, Object> map = new HashMap<String, Object>();
			Field[] field = obj.getClass().getDeclaredFields();
			Field.setAccessible(field, true);
			for (Field f : field) {
				Object o = f.get(obj);
				map.put(f.getName(), o);
			}
			// 得到主键
			ResultSet rs = dbmb.getPrimaryKeys(null, null, clazz
					.getSimpleName());
			String primary_key = null;
			while (rs.next()) {
				primary_key = rs.getString("Column_name");
			}
			rs1 = dbmb.getColumns(null, null, clazz.getSimpleName(), null);
			StringBuffer s = new StringBuffer("update " + table + " set ");
			rs1.last();
			int m = rs1.getRow();
			Object[] objs = new Object[m - 1];
			int count = 0;
			rs1.first();
			while (rs1.next()) {
				String column = rs1.getString("Column_name");
				if (!column.equals(primary_key)) {
					boolean b = rs1.isLast();

					if (!b) {
						s.append(column + "=?, ");
					} else {
						s.append(column + "=? ");
					}
					objs[count] = map.get(column);
					count++;
				}
			}
			String sql = s.append(where).toString();
			System.out.println("=======" + sql);
			return qryRun.update(sql, objs);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	public <T> int delete(Class<T> clazz, String where) {
		String table = clazz.getSimpleName();
		try {
			StringBuffer s = new StringBuffer("delete  " + table + " " + where);
			String sql = s.toString();
			System.out.println("=======" + sql);
			return qryRun.update(sql);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return 0;
	}

	public List<Map<String, Object>> executeQuerySql(String sql, Object... args) {
		MapListHandler rsh = new MapListHandler();
		List<Map<String, Object>> result = null;
		try {
			result = qryRun.query(sql, rsh, args);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbHelper.closeDataSource();
		}
		return result;
	}

}

 

 下面是测试类 

 

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {
	/**
	 * @param args
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 */
	public static void main(String[] args) throws IllegalArgumentException,
			IllegalAccessException {
		Dao dao = new DaoImpl();
		// 查找list<model>
		List<Story> result = dao.findAll(Story.class, null);
		// 查找model
		// Story s = dao.findById(Story.class, 1);
		// 测试
		Man man = new Man();
		man.setAge(11);
		man.setId(1);
		man.setName("ymc11");
		// dao.insert(man);
		dao.update(man, null);

		// dao.insert(Man.class,m1);
		// m1.put("name","hh");
		// dao.update(Man.class,m1,"");

		// dao.insert(Story.class,map);
		// Story ss=new Story();
		// Story s2 = dao.findById(Story.class, 1);
		// 自己传入sql 返还list<map> 字段是表中字段不是实体的属性
		List<Map<String, Object>> m = dao.executeQuerySql(
				"select * from story where id=?", new Object[] { 1 });

		// for (Map<String, Object> list : m) {
		// Set<Map.Entry<String, Object>> set = m1.entrySet();
		// for (Iterator<Map.Entry<String, Object>> it = set.iterator(); it
		// .hasNext();) {
		// Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it
		// .next();
		// System.out.println(entry.getKey() + "--->" + entry.getValue());
		// }
		
	}

	// 插入数据
	// long id = dao.insertSql("insert into man (n1ame) values (?)",
	// new Object[] { "男" });
	// System.out.println(id);
	// 批量插入
	Object[][] objs = new Object[][] { { "man" }, { "women" }, { "man" } };
	// dao.batchUpdateSql("insert into man (name) values(?)", objs);

}

 

 可以选择是否使用连接池

 

package com.navitek.yq.dao;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.QueryRunner;

public class DbHelper {
	private static DataSource dataSource;

	private DbHelper() {
	}

	public static QueryRunner getQueryRunner() {
		if (DbHelper.dataSource == null) {
			BasicDataSource dbcpDataSource = new BasicDataSource();
			dbcpDataSource
					.setUrl("jdbc:mysql://localhost:3306/gdyh?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull");
			dbcpDataSource.setDriverClassName("com.mysql.jdbc.Driver");
			dbcpDataSource.setUsername("root");
			dbcpDataSource.setPassword("root");
			dbcpDataSource.setDefaultAutoCommit(true);
			dbcpDataSource.setMaxActive(100);
			dbcpDataSource.setMaxIdle(30);
			dbcpDataSource.setMaxWait(500);
			
			DbHelper.dataSource = (DataSource) dbcpDataSource;
			
			System.out.println("Initialize dbcp...");
		}
		return new QueryRunner(DbHelper.dataSource);
	}

	public final static void closeDataSource() {
		try {
			System.out.println(dataSource.hashCode());
			System.out.println(dataSource.getClass().getName());
			dataSource.getClass().getMethod("close").invoke(dataSource);
			System.out.println(" dbcp has closed...");
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

见附件 所需jar

分享到:
评论
2 楼 yuanmengchong 2014-01-06  
ninthbar 写道
事务如何处理?

事务你可以弄一个service层,然后调用基层。
1 楼 ninthbar 2013-12-06  
事务如何处理?

相关推荐

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    dbutils

    4. **连接池集成**:虽然`dbutils` 不自带连接池,但它可以很好地与第三方连接池(如C3P0、DBCP、HikariCP等)配合使用,提高数据库连接的管理效率。 **使用示例** 以下是一个基本的使用`dbutils` 查询数据库的...

    DButils使用实例

    DButils支持多种数据库连接池,如C3P0、DBCP、HikariCP等。连接池是数据库管理的关键组件,它能够有效地重用数据库连接,减少创建和销毁连接的开销,提高系统性能。通过DButils,开发者可以轻松配置和使用这些连接...

    开发类库DButils

    5. **连接池支持**:DButils 可以与多种流行的数据库连接池(如 C3P0、DBCP、HikariCP 等)无缝集成,提高了应用程序的性能和资源管理。 6. **线程安全**:DButils 的设计是线程安全的,可以在多线程环境中放心使用...

    使用dbutils操作数据库入门

    以下是一个使用DBCP连接池的示例配置: ```java Properties props = new Properties(); props.setProperty("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver"); props.setProperty("url", "jdbc:sqlserver...

    关于JDBC与数据库连接池,你了解多少?

    文章目录1 JDBC1.1 使用JDBC的基本步骤1.2 JDBC工具类构建1.3 数据库的CRUD1.4 Dao模式1.5 Statement安全问题1.6 PrepareStatement2 数据库连接池2.1 自定义数据库连接池2.2 解决自定义数据库连接池出现的问题。...

    struts demo

    因此,使用连接池(如C3P0、Apache DBCP或HikariCP)是常见的优化策略。连接池可以预先创建一定数量的连接并保持空闲状态,当需要时快速提供,从而提高性能。 **6. DBUtils包** Apache的DBUtils是一个实用工具库,...

    commons-utils简化JDBC使用(文档+示例)

    1. **连接池集成**:DBUtils支持与多种流行的连接池如C3P0、DBCP、HikariCP等无缝集成,使得数据库连接的管理和释放更加高效。在实际项目中,使用连接池可以显著提高系统性能。 2. **异常处理**:DBUtils使用try-...

    atguigu的JDBC资料

    总结,JDBC是Java访问数据库的基础,提供了统一的接口与多种数据库进行交互,而PreparedStatement、事务管理、DAO模式、数据库连接池和辅助工具如Apache DBUtils则是提高效率和安全性的关键。通过学习和熟练运用这些...

    JSP项目(新闻管理系统)开发实训报告

    - `dbcp.jar`: DBCP连接池。 - `commons-dbutils.jar`: Dbutils工具包。 #### 四、通用功能的实现 **4.1 Model模式介绍** - **Model模式**:一种设计模式,用于分离业务逻辑和表示逻辑,使得系统更易于维护和扩展...

    JDBCUtils_JDBCutils_

    - **连接池支持**:集成第三方连接池库如C3P0、HikariCP或Apache DBCP,提高数据库操作的效率和并发性能。 - **事务支持**:提供开始、提交和回滚事务的方法,方便在多条SQL操作中进行原子性控制。 - **SQL执行**:...

    queryrunner的全部

    1. 数据源(DataSource):这是连接数据库的入口,可以理解为数据库连接池。QueryRunner需要DataSource实例来获取数据库连接。你可以使用Apache Commons DBCP、C3P0、HikariCP等第三方库来实现数据源。 2. SQL语句...

    Java_JDBC学习教程 由浅入深.doc

    - 介绍了为什么使用连接池、连接池的基本实现、优化技巧以及常用的连接池组件如 DBCP、C3P0 等。 #### 十五、JDBC 轻量级封装 - 通过封装结果集为 Map、对象或 List 来简化数据处理。 - 使用设计模式(如策略模式和...

Global site tag (gtag.js) - Google Analytics