DBUtils

新学了一个jdbc的工具类

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

l  QueryRunner中提供对sql语句操作的API.

l  ResultSetHandler接口,用于定义select操作后,怎样封装结果集.

l  DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner的两个方法 

l update(Connection conn, Stringsql, Object... params) ,用来完成表数据的增加、删除、更新操作

l  query(Connection conn, Stringsql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

//连接可以new QueryRunner时赋值 之后调用uadate和qury


1.1.1   ResultSetHandler结果集处理类




运用新学的这个工具类重新写了BaseDao这个工具类  但是感觉这样有点画蛇添足的感觉,应用QueryRunner已经觉得很方便了。如果加上反射的haunt 感觉会让这个类变得很奇葩。写了半天觉得这样还是很糟糕的感觉 。虽然解决了之前的查询之后的赋值问题。

package dao;

import java.lang.reflect.Field;
import java.nio.channels.SelectableChannel;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.DbUtils;
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.MapListHandler;

import annotation.ID;
import annotation.Table;
import entity.Emp;
import tools.ConnectionTool;
import tools.JDBCUtils;
import tools.SqlTool;

public class BaseDao {

	
	private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());


	/**
	 * 得到表名
	 * 
	 * @param obj
	 * @return
	 */
	private static <T> String getTableName(T obj) {
		Class<?> clazz = obj.getClass();
		Table table = clazz.getAnnotation(Table.class);// 根据注解类型获得注解
		if (table == null) {
			return clazz.getSimpleName();
		} else {
			return table.value();// 根据注解值设置表名
		}
	}

	/**
	 * 得到主键
	 * 
	 * @param obj
	 * @return
	 */
	private static <T> Field getKey(T obj) {
		Class<?> clazz = obj.getClass();
		Field[] fs = clazz.getDeclaredFields();
		Field id = null;
		for (int i = 0; i < fs.length; i++) {
			fs[i].setAccessible(true);
			if (fs[i].getDeclaredAnnotation(ID.class) != null) {
				id = fs[i];
				break;
			}
		}
		if (id == null) {
			id = fs[0];
		}
		return id;
	}

	/**
	 * 插入一个记录
	 * 
	 * @param obj
	 * @throws SQLException
	 */
	protected int insertObject(Object obj) throws SQLException {
		// QueryRunner qr=new QueryRunner();
		Class<?> clazz = obj.getClass();
		String sql = SqlTool.makeSqlNew(clazz);
		// System.out.println(sql);

		Field[] fs = clazz.getDeclaredFields();
		Object[] params = new Object[fs.length];
		for (int i = 0; i < fs.length; i++) {
			fs[i].setAccessible(true);
			try {
				params[i] = fs[i].get(obj);
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return qr.update(sql, params);
	}

	/**
	 * 查找全部
	 * 
	 * @param t
	 * @return List
	 */
	@SuppressWarnings("unchecked")
	protected <T> List<T> selectAll(T t) {
		// QueryRunner qr=new QueryRunner();
		Class<?> clazz = t.getClass();
		List<T> list = new ArrayList<>();
		String sql = "select * from " + clazz.getSimpleName();
		try {
			list = qr.query(sql, new BeanListHandler<T>((Class<T>) t.getClass()));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 通过主键查找记录
	 * 
	 * @param obj
	 * @return
	 */
	@SuppressWarnings("unchecked")
	protected <T> T selectObjectByID(T obj) {
		// QueryRunner qr=new QueryRunner();
		StringBuilder sb = new StringBuilder("select * from ");
		T t = null;
		sb.append(getTableName(obj));
		// 获得所有属性 在里面找的有ID注解的属性
		sb.append("  where  " + getKey(obj).getName() + " =  ?");
		System.out.println(sb.toString());
		try {
			t = qr.query(sb.toString(), new BeanHandler<T>((Class<T>) obj.getClass()), getKey(obj).get(obj));
		} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return t;

	}

	/**
	 * 给定ids主键查询
	 * 
	 * @param obj
	 * @param ids
	 * @return
	 */
	@SuppressWarnings("unchecked")
	protected <T> List<T> selectObjectByIDs(T obj, int ids[]) {
		List<T> list = new ArrayList<>();
		StringBuilder sb = new StringBuilder("select * from ");
		T t = null;
		sb.append(getTableName(obj));
		Field id = getKey(obj);
		sb.append("  where  " + id.getName().toString() + " in ");
		String s = "(";
		for (int a : ids) {
			s = s + a + ",";
		}
		s = s.substring(0, s.length() - 1) + ")";
		sb.append(s);
		// System.out.println(sb.toString());
		// QueryRunner qr=new QueryRunner();
		try {
			list = qr.query(sb.toString(), new BeanListHandler<T>((Class<T>) obj.getClass()));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;

	}

	/**
	 * 根据sql语句查询 返回map
	 * 
	 * @param sql
	 * @return
	 */
	protected List<Map<String, Object>> selectBySql(String sql) {
		List<Map<String, Object>> list = new ArrayList<>();
		try {
			list = qr.query(sql, new MapListHandler());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 通过主键修改
	 * 
	 * @param obj
	 * @return
	 */
	protected <T> int updateById(T obj) {
		int flag = 0;
		Class<?> clazz = obj.getClass();
		String sql = SqlTool.makeSqlUpdate(clazz);
		// System.out.println(sql);
		Field[] fs = clazz.getDeclaredFields();
		Object[] params = new Object[fs.length + 1];
		int i;
		for (i = 0; i < fs.length; i++) {
			fs[i].setAccessible(true);
			try {
				params[i] = fs[i].get(obj);
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		try {
			params[i] = getKey(obj).get(obj);
			flag = qr.update(sql, params);
		} catch (SQLException | IllegalArgumentException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return flag;
	}

	/**
	 * 通过sql语句修改
	 * 
	 * @param obj
	 * @param sql
	 * @return
	 */
	protected <T> int updateBySql(String sql) {
		int flag = 0;
		try {
			flag = qr.update(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return flag;
	}

	/**
	 * 根据指定的id删除
	 * 
	 * @param obj
	 * @return
	 */
	protected <T> int deleteById(T obj) {
		Field id = getKey(obj);
		try {
			String sql = "delete from " + getTableName(obj) + " where " + id.getName() + " = ?";
			System.out.println(sql);
			return qr.update(sql, id.get(obj));
		} catch (IllegalArgumentException | IllegalAccessException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;

	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值