通常真正实际开发时,dao层虽然会涉及很多实体,但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法,下面介绍两种方法
第一种:借助元数据类ResultSetMetaData来实现方法的封装,使用Map或者List集合来实现数据的封装(自己感觉使用Map封装数据比实体好),代码如下:
public class BaseDao {private Connection connection;public BaseDao() {connection = getConnection();}/*** 获取数据连接*/public Connection getConnection() {Connection connection = null;try {//获取数据源对象ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");//通过数据源获取连接connection = dataSource.getConnection();System.out.println(connection);} catch (SQLException e) {e.printStackTrace();System.out.println("获取数据库连接失败!");}return connection;}/*** 添、改、删操作* @param sql sql语句* @param objects 占位符需传递的参数* @return*/public int update(String sql, Object ...objects) {int flag = 0;PreparedStatement pst = null;try {pst = connection.prepareStatement(sql);for (int i = 0 ; i <objects.length ; i++){pst.setObject(i+1, objects[i]);}flag = pst.executeUpdate();} catch (SQLException e) {e.printStackTrace();System.out.println("更新操作失败!");}finally{if (pst != null) {try {pst.close();} catch (SQLException e) {e.printStackTrace();}}}return flag;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public List<Map> getResultMapList(String sql , Object ...objects) {PreparedStatement pst = null;ResultSet result = null;List<Map> list = new ArrayList<>();try {pst = connection.prepareStatement(sql);for (int i = 0 ; i <objects.length ; i++){pst.setObject(i+1, objects[i]);}result = pst.executeQuery();while(result.next()){Map<String, Object> map = new HashMap<>();ResultSetMetaData metaData = result.getMetaData();int count = metaData.getColumnCount();for (int i = 0; i < count; i++) {String label = metaData.getColumnLabel(i+1);map.put(label, result.getObject(i+1));}list.add(map);}} catch (SQLException e) {e.printStackTrace();System.out.println("查询操作失败!");}finally{try {if (pst != null) {pst.close();}if (result != null) {result.close();}}catch (SQLException e) {e.printStackTrace();}}return list;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public Map getResultMap(String sql , Object ...objects) {List<Map> list = getResultMapList(sql, objects);return list != null ? list.get(0) : null;}public static void main(String[] args) {BaseDao dao = new BaseDao();String sql = "UPDATE USER SET UNAME = ? WHERE ID = ?";dao.update(sql, "zhangsan" , 6);String sql2 = "DELETE FROM USER WHERE ID > ?";dao.update(sql2 , 4);String sql3 = "INSERT INTO USER (UNAME , PASSWORD) VALUES (? ,?)";dao.update(sql3 , "樊少皇" , "123456");String sql4 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER WHERE ID = ?";Map map = dao.getResultMap( sql4, 20007);String sql5 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER LIMIT ?";List<Map> resultMapList = dao.getResultMapList(sql5, 10);System.out.println(resultMapList);}
}
第二种:直接借助工具类dbutils实现封装,代码如下:
public class BaseDao {private Connection connection;private QueryRunner queryRunner;public BaseDao() {connection = getConnection();queryRunner = new QueryRunner();}/*** 获取数据连接*/public Connection getConnection() {Connection connection = null;try {//获取数据源对象ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");//通过数据源获取连接connection = dataSource.getConnection();System.out.println(connection);} catch (SQLException e) {e.printStackTrace();System.out.println("获取数据库连接失败!");}return connection;}/*** 添、改、删操作* @param sql sql语句* @param objects 占位符需传递的参数* @return*/public int update(String sql, Object ...objects) {int flag = 0;try {flag = queryRunner.execute(connection, sql, objects);} catch (SQLException e1) {e1.printStackTrace();}return flag;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public List<Map<String, Object>> getResultMapList(String sql , Object ...objects) {List<Map<String, Object>> list = null;try {list = queryRunner.query(connection, sql, new MapListHandler(), objects);} catch (SQLException e1) {e1.printStackTrace();}return list;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public Map<String, Object> getResultMap(String sql , Object ...objects) {Map<String, Object> map = null;try {map = queryRunner.query(connection, sql, new MapHandler(), objects);} catch (SQLException e) {e.printStackTrace();}return map;}public static void main(String[] args) {BaseDao dao = new BaseDao();String sql = "UPDATE USER SET UNAME = ? WHERE ID = ?";dao.update(sql, "zhangsan" , 1);String sql2 = "DELETE FROM USER WHERE ID > ?";dao.update(sql2 , 4);String sql3 = "INSERT INTO USER (UNAME , PASSWORD) VALUES (? ,?)";dao.update(sql3 , "刘德华" , "123456");String sql4 = "SELECT count(1) count FROM USER ";Map map = dao.getResultMap( sql4);System.out.println(map);String sql5 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER LIMIT ?";List<Map<String, Object>> resultMapList = dao.getResultMapList(sql5, 10);System.out.println(resultMapList);}
}