一. 在java工程的src目录下建立一个配置文件 info.properties (注意:1.后缀名不要写错;2.文件放在src目录下,不要弄错),在这个文件中写入如下代码。
//info.properties
driverClass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=scott
password=tiger
oracle.jdbc.driver.OracleDriver:Oracle为开发人员提供的注册的驱动类,不会加载的朋友请看我上一篇或上上篇文章。
jdbc: oracle:thin: @localhost:1521: orcl
协议 子协议 IP :端口号 数据库
写这个文件的时候,我犯的错误是:url是凭我记忆赋值的,其中少写了端口号,导致一开始就连接不上数据库。
二:1.建立一个jdbcUtil类,在这个类里将连接数据库的参数从info.properties 文件数据在静态块中加载进来,然后通过Class.forName()将DriverManager类加载到内存,然后通过getConnection()函数生成连接对象并返回,这里的ResourceBundle类对于加载property类型的数据非常方便,建议使用。
2.然后写一个closeAll()函数,用于将资源进行回收释放。注意:这个函数首先判断各参数是否为null,然后再调用其自身的close()函数并抛出异常。
package jdbcCRUD;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
public class jdbcUtil {
private static String driverClass;
private static String url;
private static String user;
private static String password;
static{
ResourceBundle rb=ResourceBundle.getBundle("info");
driverClass=rb.getString("driverClass");
url=rb.getString("url");
user=rb.getString("user");
password=rb.getString("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws Exception{
Connection conn=DriverManager.getConnection(url,user,password);
return conn;
}
public static void closeAll(ResultSet rs,PreparedStatement ps,Connection conn){
if(rs!=null)
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(ps!=null)
{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(conn!=null)
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
三. 由于这里一个类对应于Oracle中的一张表,其参数名跟参数数量要保持一致,不易出错。为简单期间,这里创建一个Department 类,对应于scott用户下的dept表,因为其列只有三个,比较简单。
这里定义了三个变量,分别对应于表中的一列,并设置其get和set方法,方便赋值,并生成了toString()方法,方便打印。
package jdbcCRUD;
public class Department {
private int deptno;
private String dname;
private String loc;
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Department [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
+ "]";
}
}
四.最后创建jdbcDao类,dao的意思是数据库访问对象(database access object) 。在这个类里,首先利用jdbcUtil类的静态函数获得connection接口,然后获得操作数据库的PreparedStatement接口,然后利用ResultSet接口接收查询到的记录。
这里最好不要用Statement接口,因为会有sql反射注入的问题,与之相比,PreparedStatement接口就不会有这个问题,而且更安全。 最后一定要记得关闭释放资源,因为如果不关闭释放资源,数据库将一直处于连接状态,别的用户将无法访问数据库。
写这个程序的时候,我忘记调用ResultSet 的next()方法了,失误。
package jdbcCRUD;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
public class jdbcDao {
public static void main(String[] args) throws Exception {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
conn=jdbcUtil.getConnection();
ps=conn.prepareStatement("select DEPTNO,DNAME,LOC from dept where DNAME=? ");
ps.setString(1, "SALES");
rs=ps.executeQuery();
rs.next();
Department dept=new Department();
dept.setDeptno(rs.getInt("deptno"));
dept.setDname(rs.getString("dname"));
dept.setLoc(rs.getString("loc"));
System.out.println(dept);
jdbcUtil.closeAll(rs, ps, conn);
}
}