前些日子,公司经过需求调研后决定开一个新项目。我新入不久,目测原来的工程都是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