Java通过JDBC连接和操作数据库,每个数据库厂商都定制了一套可以通过Java连接的JDBC接口,以jar包的形式发布。要实现Java程序连接数据库,受限需要下载相应的数据库可支持的JDBC jar包,Oracle安装目录下提供了与jdbc操作相关的很多jar文件,可直接使用,而mysql需要自己在网上下载,但是本人发现,通过classpath设置数据库驱动(即jar包),本地Java程序还是操作不了,因此,本文在eclipse环境下进行。
首先,新建连接数据库的程序项目,设置项目属性,java build path,选择external jar,上传项目需要的两个jar文件(oracle和mysql分别需要使用的驱动).
下面正式开始代码的编写。我们新建DbConnection和DbHelper类,DbConnection负责建立和关闭与指定数据库的连接,将该连接作为参数设置到DbHelper实例,并由此类完成与指定数据库相关的增删改查操作。
DbConnection类:建立数据库连接有以下一般步骤:
1)加载驱动程序,已知驱动程序类名,不知其结构,利用Java反射加载驱动,Class.forName("驱动程序报名.类名")
2)准备连接url,针对不同的数据有不同的url,但无一例外,都需要提供指定的数据库实例名
3)准备连接数据库实例的用户名和密码
4)利用java.sql包下DriverManager类打开指定数据库连接(以连接url,用户名,密码作为参数)
class DbConnection{
private String driverName = null;
private String connUrl = null;
private String userName = null;
private String passWord = null;
private Connection conn = null;
public DbConnection(String driverName,String connUrl,String userName,String passWord){
this.driverName = driverName;
this.connUrl = connUrl;
this.userName = userName;
this.passWord = passWord;
}
public Connection openConnection(){
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 sqlStr,String... wheres){
ResultSet rs = null;
PreparedStatement pst = null;
try{
pst = this.conn.prepareStatement(sqlStr);
if(wheres != null && wheres.length > 0){
for(int i=0;i
pst.setString(i+1, wheres[i]);
}
}
rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1));
}
}catch(Exception e){
}finally{
try{
rs.close();
pst.close();
}catch(Exception e){
}
}
}
public void doUpdate(String sqlStr,String... wheres){
PreparedStatement pst = null;
int count = 0;
try{
pst = this.conn.prepareStatement(sqlStr);
if(wheres != null && wheres.length > 0){
for(int i=0;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语句中的参数。exxcuteQuery返回的是ResultSet类型的结果集,该结果集以游标形式访问,并通过制定字段号(从1开始)或字段名,获取数据库表中查询得到的内容。executeUpdate返回更新影响的条目数,大于0表示有更新。
本程序,以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
首先通过properties文件读取得到数据库各参数,然后设置到DbConnection构造函数里,Properties类提供了Java属性文件操作的支持,实际上是一个HashTale,不过它的键值都必须是String类型。调用Properties实例对象的load方法可以将属性文件加载到程序中,并利用getProperty读取指定key的值。程序main函数如下:
public class TestJDBC{
public static void main(String[] args) {
Properties pro = new Properties();
InputStream in = null;
try{
in = new FileInputStream("./connection.properties");
pro.load(in);
}catch(Exception e){
}
String sqlType = "mysql";
String driverName = pro.getProperty(sqlType+"Driver");
String connUrl = pro.getProperty(sqlType+"Url");
String userName = pro.getProperty(sqlType+"Username");
String passWord = pro.getProperty(sqlType+"Password");
DbConnection dbConnection = new DbConnection(driverName, connUrl, userName, passWord);
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");
dbConnection.closeConnection();
}
}
程序执行结果如下:
Fluffy
1 lines have been updated
可以根据上述代码自行调整sql语句以及连接的数据库类型,需要注意的是,查询或更新结束,需要及时关闭与数据库相关的各个资源,如ResultSet对象,PreparedStatement对象,Connection对象。