29、jdbc操作数据库(6)

版权声明:chaizepeng https://blog.csdn.net/chaizepeng/article/details/86693828

通常真正实际开发时,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);
	}
}

猜你喜欢

转载自blog.csdn.net/chaizepeng/article/details/86693828
今日推荐