Java JDBC 学习

摘要:一些大型程序免不了要连接数据库,很多网络程序更是如此,因此掌握数据库的连接手段非常必要,本文以Oracle和mysql数据库为例,介绍Java程序通过jdbc连接并操作数据库的示例。

JDBC连接数据库

Java通过JDBC连接和操作数据库,每个数据库厂商都定制了一套可以通过Java连接的JDBC接口,以jar包的形式发布。要实现Java程序连接数据库,受限需要下载相应的数据库可支持的JDBC jar包.

Oracle安装目录下提供了与jdbc操作相关的很多jar文件,可直接使用,而mysql需要自己在网上下载,但是本人发现,通过classpath设置数据库驱动(即jar包),本地Java程序还是操作不了,因此,本文在eclipse环境下进行。

Eclipse 程序

准备

首先,新建连接数据库的程序项目,设置项目属性,java build path,选择add external jar,上传项目需要的两个jar文件(oracle和mysql分别需要使用的驱动).

add jdbc jar to eclipse

代码编写

下面正式开始代码的编写。我们新建DbConnectionDbHelper类,DbConnection负责通过制定连接数据库类型和配置文件路径打开和关闭与指定数据库的连接,将该连接作为参数设置到DbHelper实例,并由此类完成与指定数据库相关的增删改查操作。

DbConnection类:建立数据库连接有以下一般步骤:

  1. 加载驱动程序,已知驱动程序类名,不知其结构,利用Java反射加载驱动,Class.forName(“驱动程序包名.类名”)
  2. 准备连接url,针对不同的数据库有不同的url,但无一例外,都需要提供指定的数据库实例名
  3. 准备连接数据库实例的用户名和密码
  4. 利用java.sql包下DriverManager类打开指定数据库连接(以连接url,用户名,密码作为参数)

本程序,以properties文件组织数据库连接各参数,Properties类提供了Java属性文件操作的支持,实际上是一个HashTale,不过它的键值都必须是String类型。调用Properties实例对象的load方法可以将属性文件加载到程序中,并利用getProperty读取指定key的值。properties文件的内容如下所示:

#Oracle
oracleDriver=oracle.jdbc.driver.OracleDriver
oracleUrl=jdbc:oracle:thin:@127.0.0.1:1521:test
oracleUsername=scott
oraclePassword=123456
#mysql
mysqlDriver=com.mysql.jdbc.Driver
mysqlUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk
mysqlUsername=root
mysqlPassword=123456

DbConnection类通过制定数据库类型和配置文件路径作为构造函数参数,负责建立和制定数据库的连接:

class DbConnection{
	private String sqlType = null;
	private String proPath = null;
	private Connection conn = null;
	
	public DbConnection(String sqlType,String proPath){
		this.sqlType = sqlType;
		this.proPath = proPath;
	}

	public Connection openConnection(){
		Properties pro = new Properties();
		InputStream in = null;
		try{
			in = new FileInputStream(proPath);
			pro.load(in);
		}catch(Exception e){

		}

		String driverName = pro.getProperty(sqlType+"Driver");
		String connUrl = pro.getProperty(sqlType+"Url");
		String userName = pro.getProperty(sqlType+"Username");
		String passWord = pro.getProperty(sqlType+"Password");

		try{
			Class.forName(driverName);
			conn = DriverManager.getConnection(connUrl,userName,passWord);
		}catch(Exception e){
			System.out.println("Database connect error");
			e.printStackTrace();
		}
		return conn;
	}
	
	public void closeConnection(){
		try{
			this.conn.close();
		}catch(Exception e){
			
		}
	}
}

得到连接之后,便可以利用此连接来进行数据库的增删改查操作了,DbHelper类则提供了相关执行函数,doQuery查询函数和doUpdate更新函数,以指定sql语句作为函数参数,在函数中,创建PreparedStatement(预编译的,对于批量处理可以大大提高效率)来封装sql语句,并调用相应的executeQuery和executeUpdate函数执行数据库操作。

class DbHelper{
	private Connection conn = null;

	public DbHelper(Connection conn){
		this.conn = conn;
	}

	public void doQuery(String queryStr,String... wheres){
		ResultSet rs = null;
		PreparedStatement pst = null;
		try{
			pst = this.conn.prepareStatement(queryStr);
			if(wheres != null && wheres.length > 0){
				for(int i=0;i<wheres.length;i++){
					pst.setString(i+1, wheres[i]);
				}
			}
			rs = pst.executeQuery();
			while(rs.next()){
				System.out.println(rs.getString(2));
			}
		}catch(Exception e){

		}finally{
			try{
				rs.close();
				pst.close();
			}catch(Exception e){
				
			}
		}
	}
	
	
	public void doUpdate(String updateStr,String... wheres){
		PreparedStatement pst = null;
		int count = 0;
		try{
			pst = this.conn.prepareStatement(updateStr);
			if(wheres != null && wheres.length > 0){
				for(int i=0;i<wheres.length;i++){
					pst.setString(i+1, wheres[i]);
				}
			}
			count = pst.executeUpdate();
			System.out.println(count+" lines have been updated");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				pst.close();
			}catch(Exception e){
				
			}
		}
	}
}

从以上代码中也可以发现,PreparedStatement还可以设置sql语句中的参数。executeQuery返回的是ResultSet类型的结果集,该结果集以游标形式访问,并通过指定字段号(从1开始)或字段名,获取数据库表中查询得到的内容。executeUpdate返回更新影响的条目数,大于0表示有更新。主程序如下:

public class TestJDBC{
	public static void main(String[] args) {
		String sqlType = "mysql";
		String proPath = "./connection.properties";

		DbConnection dbConnection = new DbConnection(sqlType,proPath);

		Connection conn = dbConnection.openConnection();
		DbHelper dbHelper = new DbHelper(conn);
		
		/*
		String queryStr = "select * from event where type=? and happen>?";
		dbHelper.doQuery(queryStr,"litter","1995");
		
		String updateStr = "insert into event values(?,?,?,?)";
		dbHelper.doUpdate(updateStr,"Sufa","1997-07-01","vet","headache");
		*/
		String queryStr = "select * from emp";
		dbHelper.doQuery(queryStr);
		
		dbConnection.closeConnection();
	}
}

程序成功查询到内容,也成功更新,输出如下:

Fluffy 1 lines have been updated

可以根据上述代码自行调整sql语句以及连接的数据库类型,需要注意的是,查询或更新结束,需要及时关闭与数据库相关的各个资源,如ResultSet对象,PreparedStatement对象,Connection对象。