日期:2014-05-16  浏览次数:20481 次

使用JDBC访问MySql的一个公共方法的解决方案

本来项目都是用到例如Hibernate这些工具的,可是因为现在项目要求现在又丫的回到基于JDK的解决方案了。

这个方法很简单,但是对于数据的连接使用连接池,连接池也是直接初始化的。

package com;
import java.sql.*;
import java.util.*;
import org.apache.commons.dbcp.BasicDataSource;
/**
 * @说明 数据库连接管理
 * @author cuisuqiang
 */
public class ConnectionManager {
	/**
	 * @说明 执行一条SQL
	 */
	@SuppressWarnings("unchecked")
	public static List<Object[]> excuteQuery(String sql) {
		Connection conn = null;
		PreparedStatement psta = null;
		ResultSet resultSet = null;
		List<Object[]> relist = new ArrayList<Object[]>(); // 总数据
		Object[] objects = null; // 每行数据
		try {
			conn = ConnectionManager.getConn(); // 得到链接
			if(null != conn){
				psta = conn.prepareStatement(sql);
				resultSet = psta.executeQuery(); // 执行查询,返回结果接集合
				int count = resultSet.getMetaData().getColumnCount(); // 一共有多少列数据
				// 循环行
				while (resultSet.next()) {
					objects = new Object[count];
					// 数据集索引从 1 开始,而数组存放时是从 0 开始
					for (int i = 1; i <= count; i++) {
						objects[i - 1] = resultSet.getObject(i);
					}
					relist.add(objects);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			relist = null;
		} finally {
			try {
				if(null != resultSet)
					resultSet.close();
				if(null != psta)
					psta.close();
				if(null != conn)
					conn.close();
			} catch (Exception e2) {
				
			}
		}
		return relist;
	}
	private static org.apache.commons.dbcp.BasicDataSource ds = null;
	static {
		ds = new BasicDataSource(); // 组建数据源对象
		int initialSize = 1; // 连接池启动时的初始值
		int maxActive = 10;  // 连接池的最大值
		int maxIdle = 1;     // 最大空闲值
		int minIdle = 1;     // 最小空闲值
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://192.168.154.128:3306/t2?useUnicode=true&characterEncoding=gbk");
		ds.setUsername("root");
		ds.setPassword("123456");
		ds.setInitialSize(initialSize);
		ds.setMaxActive(maxActive);
		ds.setMaxIdle(maxIdle);
		ds.setMinIdle(minIdle);
	}
	/**
	 * 从数据源中取得数据库连接
	 */
	public static Connection getConn() {
		try {
			return ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}

?

我使用的是BasicDataSource,你可能需要两个Jar包,commons-pool.jar,commons-dbcp.jar,连接mysql的话需要mysql-connector-java-3.1.13-bin.jar。

写一个mian方法直接测试:

package com;
import java.util.List;
public class T {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		try {
			List<Object[]> list = ConnectionManager.excuteQuery("select * from t");
			for (int i = 0; i < list.size(); i++) {
				Object[] os = list.get(i);
				for(Object o : os){
					if (o instanceof String) {
						String s = (String) o;
						String newStr = new String(s.getBytes("ISO-8859-1"),"GBK");
						System.out.print("字符串:" + newStr + "\t\t");
					}else if(o instanceof Long){
						Long s = (Long) o;
						System.out.print("浮点值:" + s + "\t\t");
					}else if(o instanceof Integer){
						Integer s = (Integer) o;
						System.out.print("整形值:" + s + "\t\t");
					}else{
						System.out.print("未知型:" + o + "\t\t");
					}
				}
				System.out.println();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}

我返回的是一个List集合,里面包含了一个Object数组。调用者在收到这个返回集合后可以根据实际情况进行解析,公共方法只是执行SQL,然后得到数据连接进行数据访问。

1 楼 cuisuqiang 2012-03-20  
忘了写打印结果了:
整形值:1		字符串:崔素强		整形值:11		
整形值:2		字符串:su		整形值:22		
整形值:3		字符串:qiang		整形值:33		
整形值:4		字符串:望着		整形值:44