关闭

JDBC数据库连接工具代码与测试简例

标签: jdbcmysql
1410人阅读 评论(1) 收藏 举报

</pre>本人学习jdbc时的一点笔记,如有问题,请指点。</h3><p>1.配置文件</p><p></p><pre name="code" class="html">src/jdbc.properties
#Config for MySQL Driver
mysql.url=jdbc:mysql:@192.168.80.150:3306/dbname
mysql.driver=com.mysql.jdbc.Driver
mysql.username=root
mysql.password=null

2.DBUtil工具类代码

DBUtil作为一个工具类,用于封装数据库的连接和关闭过程
  使用properties文件配置数据库连接参数
  利用配置文件保存数据库连接参数,存放位置有两种:
    1:存放在操作系统文件系统路径中(调用类包以外的位置,即使在工程内),使用文件流读取
     2:保存在包中(调用类所在包),使用ClassLoader读取 path="jdbc/jdbc.properties"

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

public class DBUtil {
	//静态方法只能调用静态变量
	private static Properties prop;
	private static String url;
	private static String driverName;
	private static String username;
	private static String password;
	private static BasicDataSource dataSource;
	
	/*
	 * 建立静态代码块,用于读取properties文件,
	 * 在类加载期间执行,保证在静态方法前执行
	 */
	static{
		try {
			//获取ClassLoader对象---类名.class.getClassLoader()
			//调用classLoader.getResourceAsStream(path)方法把文件中的资源打开为一个流

			InputStream in=DBUtil.class.getClassLoader().getResourceAsStream("CloudNote/jdbc.properties");
			prop.load(in);
			driverName=prop.getProperty("mysql.driver");
			url=prop.getProperty("mysql.url");
			username=prop.getProperty("mysql.username");
			password=prop.getProperty("mysql.password");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 封装数据库的连接过程
	 */
	public Connection createConnection()throws SQLException{
		Connection conn=null;
		/*
		 * 用DriverMagager作为工厂创建connection接口的实例
		 * Class.forName手动的将类名对应的.class文件加载到内存的方法区,而且
		 * com.mysql.jdbc.Driver类中有一个静态代码块会被执行,会将
		 * com.mysql.jdbc.Driver自动注册到DriverManager内部,注册以后,
		 * 就可以用DriverManager调用Oracle驱动了
		 * Class.forName(driver);
	 	 * conn=DriverManager.getConnection(url,username,password);
	 	 */
		/*下面用连接池管理数据库连接
		*接口:javax.sql.DataSource
		*主要方法:Connection getConnection()
		* 得到的Connection对象是可以重复使用的,当调用close方法时,不释放实际的数据库连接,而是归还到连接池,以便再次使用
	 	* DriverManager也提供了Connection getConnection()方法
		*其返回的Connection对象是一次性的,调用close方法的时候,就释放不再使用
		*区别:DataSource是连接池,连接可以被重用,适用于多线程并发访问数据库情况,使数据库连接总数可控,避免了服务器连接过载的情况。
		*                     作为接口,必须使用实现类,必须由第三方达到通用的目的:
		* 			DataSource的常用第三方实现:1 DBCP 是由Apache.org提供
	 	* 											  2 C3P0也是常用的连接池
	 	* 	DriverManager是一次性连接,连接不能被重用,适用于单线程或者线程数很少等很少并发访问数据库的情况下使用。
		*/ 
		try {
			/*
			 * 数据库驱动注册,注册一次即可,如果已经注册,则不起作用
			 */
			Class.forName(driverName);
			//数据完整性检查
			if(dataSource==null){
				dataSource=new BasicDataSource();
			//使用连接池之前必须先初始化数据库连接参数:
				//1 数据库连接参数,将数据库连接的创建功能交给连接池完成
				dataSource.setDriverClassName(driverName);
				dataSource.setUrl(url);
				dataSource.setUsername(username);
				dataSource.setPassword(password);
				// 2 连接池的管理策略参数:连接总数,初始化连接数,最小活动连接数,
				dataSource.setMaxActive(10);
				dataSource.setInitialSize(4);
				dataSource.setMaxIdle(6);
				//得到DBCP连接池提供的连接
				conn=dataSource.getConnection();
			}
			return conn;
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException("驱动错误",e);
		}
	}
	
	/**
	 * 封装关闭连接的方法
	 */
	public static void close(Connection conn){
		if(conn==null){
			return;
		}
		try {
			if(conn.isClosed()){
				return;
			}
			conn.close();
		} catch (SQLException e) {
			// 关闭期间的异常,无法处理,忽略
			e.printStackTrace();
		}
	}
}
3.测试代码

@Test
public void testSql(){
		Connection conn=null;
		/*
		 * 当需要折行书写时,注意要在ename后加一个空格
		 * (不加的话字符串连接后会出现sql语句的书写错误),并使用字符串连接符+
		 */
		String sql="select empno,ename " +
				"from emp_todd ";
		try {
			conn=DBUtil.getConnection();
			/*
			 * 创建Statement对象
		 	* createStatement()创建语句对象
		 	* 实际调用的是mysql驱动的实现的createStatement()方法
		 	* 返回的对象也是mysql驱动实现的对象
		 	*/
			Statement st=conn.createStatement();
			//execueQuery用于执行DQL语句,返回结果ResultSet,内部是一个表格
			//ResultSet的是按照while循环设计的,其内部有一个游标,初始指向第一套记录之前
			ResultSet rs=st.executeQuery(sql);
			while(rs.next()){//调用next()方法会使得游标向后移动,如果记录不为空则返回true
				int empno=rs.getInt("empno");
				String ename=rs.getString("ename");
				System.out.println(empno+"      "+ename);
			}
			rs.close();
			st.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//必须关闭连接,释放资源
			DBUtil.close(conn);
		}
	}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3390次
    • 积分:61
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论