java的jdbc连接数据库封装

java的jdbc连接数据库封装

  • jdbc的驱动、获取连接、释放资源 进行了封装
  • 我们把JDBC用的一些代码进行整合复用,形成JDBC工具类。主要是资源释放工作的整合,
  • 以及驱动的防二次注册,还把建立连接的过程封装起来,并使用properties读取属性,方便以后的维护。
  • DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  • Driver这个类里面有静态代码块,一上来就执行了驱动的注册,执行到这行又执行一遍,所以等同于我们注册了两次驱动,其实没这个必要。

注意问题:

1.当使用 InputStream is = new FileInputStream("jdbc.properties");  读取配置文件时,文件放在项目中
2. 当使用 InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");  读取配置文件时,文件放在项目src的目录下,不然会出现异常

准备工作:

1.导入mysql-connector数据库的jar包
2.创建jdbc.properties配置文件,里面是driveClass、url、name、password的值

jdbc.properties文件的内容,务必确保数据存在,用户名和密码正确

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

class JDBCUtil {
	static String driverClass = null;
	static String url = null;
	static String name = null;
	static String password = null;

	// 静态代码块,随着类的加载而加载,将配置文件的内容加载到这个类

	static {
		try {
			// 1. 创建一个属性配置对象
			Properties properties = new Properties();

			// 2. 把properties文件转化为inputstream流

			// 方法一:如果把properties文件放在工程的根目录下,可以使用下面的语句读取这个文件
			// InputStream is = new FileInputStream("jdbc.properties");

			// 方法二:使用类加载器,去读取src目录下的资源文件
			InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");

			// 3. 导入输入流。
			properties.load(is);

			// 4. 读取属性
			driverClass = properties.getProperty("driverClass");
			url = properties.getProperty("url");
			name = properties.getProperty("name");
			password = properties.getProperty("password");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * 对获取连接进行封装获取连接对象 加载驱动获取连接 这个地方用的不是DriverManager.registerDriver();
	 * 所以驱动就在这加载了一遍 Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
	 * Class.forName是一个静态方法,同样可以用来加载类。 该方法有两种形式:Class.forName(String name,
	 * boolean initialize, ClassLoader loader)和 Class.forName(String className)。
	 * 第一种形式的参数 name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。
	 * 第二种形式则相当于设置了参数 initialize的值为 true,loader的值为当前类的类加载器。
	 * 
	 * @return
	 */
	static Connection getConn() {
		Connection conn = null;
		try {
			Class.forName(driverClass); // 4.0版本之后不需要使用Class.forName();语句注册了,它会自动帮我们注册驱动。
			// 静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new
			// Driver());
			// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			// DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");

			// 2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
			// 这是getConnection()的另外一种写法 上面的是直接写String的参数
			conn = DriverManager.getConnection(url, name, password); // 获取连接
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	/*
	 * 对释放资源进行封装
	 * 
	 * @param conn
	 * 
	 * @param st
	 * 
	 * @param rs
	 */
	public static void release(Connection conn, Statement ps, ResultSet rs) {
		closeRs(rs);
		closeSt(ps);
		closeConn(conn);
	}

	public static void release(Connection conn, Statement ps) {
		closeSt(ps);
		closeConn(conn);
	}

	private static void closeRs(ResultSet rs) {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			rs = null;
		}
	}

	private static void closeSt(Statement st) {
		try {
			if (st != null) {
				st.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			st = null;
		}
	}

	private static void closeConn(Connection conn) {
		try {
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			conn = null;
		}
	}
}

MainTest类:测试一下封装的jdbc能否使用

/*
* 添加junit4的jar包
* /
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;

public class MainTest {
	@Test
	public void testDelete(){
		
		// 查询
		Connection conn = null;
		Statement st = null;
		try {
			// 1. 获取连接对象
			conn = JDBCUtil.getConn();
			// 2. 根据连接对象,得到statement
			st = conn.createStatement();
			
			//3. 执行添加
			String sql = "delete from t_stu where name='aobama'";
			//影响的行数, ,如果大于0 表明操作成功。 否则失败
			int result = st.executeUpdate(sql);
			
			if(result >0 ){
				System.out.println("删除成功");
			}else{
				System.out.println("删除失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, st);
		}

	}
	@Test
	public void testUpdate(){
		
		// 查询
		Connection conn = null;
		Statement st = null;
		try {
			// 1. 获取连接对象
			conn = JDBCUtil.getConn();
			// 2. 根据连接对象,得到statement
			st = conn.createStatement();
			
			//3. 执行添加
			String sql = "update t_stu set age = 26 where name ='qyq'";
			//影响的行数, ,如果大于0 表明操作成功。 否则失败
			int result = st.executeUpdate(sql);
			
			if(result >0 ){
				System.out.println("更新成功");
			}else{
				System.out.println("更新失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, st);
		}
		
	}
}

结果: 使用junit4方法运行测试类

张三   20
李四   18
klz   19
klz   19
klz   19
klz   19
klz   19
aaobama   59
删除失败
添加成功
更新成功

发布了54 篇原创文章 · 获赞 0 · 访问量 329

猜你喜欢

转载自blog.csdn.net/qq_42977003/article/details/103056699
今日推荐