在当前的应用程序开发中,几乎所有的大型软件都要用到数据库,而且数据库的设计和开发几乎关系到整个软件项目的成功与否。为了保证Java应用程序与数据库的正常连接,Sun公司开发了JDBC(Java DataBase Connectivity,Java数据库连接),为各种常用数据库提供无缝连接技术。JDBC是Java程序使用的与数据库进行通信的应用程序接口,通过它,开发人员可以方便的将SQL语句传送给几乎任何一种数据库。
概括而言,JDBC能实现三种功能:与数据库建立连接(Connection)、向数据库发送SQL语句(Statement、PreparedStatement)、操作数据库及数据表(Statement、PreparedStatement)、接收及处理数据库执行的结果(ResultSet)。
通过上面的讲解相信大家对于JDBC有了一个大概的认识,下面我们就针对具体的实例来开始我们的JDBC编程吧!
操作环境说明:
1. 操作系统:Windows XP 专业版
2. 数据库:Microsoft SQL Server2000
3. JDK:1.5
4. 集成开发环境:eclipse3.4
5. 数据库名称:tcim,内有一用户自定义表plans,包括字段:plan_id(设置为自增1)和plan_desc(varchar类型)。
第一, 建立数据库连接
任何一个对数据库的操作都需要与数据库建立连接,为了提高代码的性能和可重用性,我们将到数据库的连接单独拿出来,写在一个类中(暂且称为 DBTools),代码如下:
public class DBTools {
// 使用的数据库的url,包括数据库类型、IP、端口、数据库名称等信息。
private static String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=tcim";
//访问数据库需要提供的用户名
private static String username = "sa";
//访问数据库需要提供的密码
private static String password = "sa";
// 该方法返回一个Connection类的对象,接下来,我们就可以利用这个Connection对
//象与数据库进行沟通。
public static Connection getConnection(){
Connection conn = null;
try {
//利用Class类中的静态方法 forName,加载要使用的驱动Driver
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//成功加载Driver类之后,Class.forName会向DriverManager注册这个
//类,我们就可以通过DriverManager中的静态方法getConnection与数据
//库建立连接。
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
第二, 创建实体类
这儿的实体类是指被存储的对象,一般与数据库中某一个表相对应,内部主要包括一些set和get方法,代码如下:
public class Plan implements IPlan {
private String plan_id;// 计划编号
private String plan_desc;// 计划描述
// getPlan_id()
public String getPlan_id() {
return plan_id;
}
// setPlan_id(String plan_id)
public void setPlan_id(String plan_id) {
this.plan_id = plan_id;
}
// getPlan_desc()
public String getPlan_desc() {
return plan_desc;
}
// setPlan_desc(String plan_desc)
public void setPlan_desc(String plan_desc) {
this.plan_desc = plan_desc;
}
}
第三, 创建plans的DAO类
所谓DAO类,就是指底层对数据库进行存取操作的类,包括增加、修改、删除、查询等操作。代码如下:
public class PlanDAO {
//声明一个StringBuffer的引用,用来存储要执行的SQL语句
private StringBuffer sql;
//用于存储到数据库的连接
private Connection conn;
//用于执行预编译的SQL语句
private PreparedStatement ps;
//用于接收查询返回的结果集
private ResultSet rs;
//该方法将返回数据库表plans中的所有记录。
public List<Plan> getAllPlans() throws Exception {
sql = new StringBuffer();
List<Plan> list = new ArrayList<Plan>();
sql.append("select * from plans");
//调用DBTools.getConnection()方法,返回一个到数据库的连接
conn = DBTools.getConnection();
//调用conn对象的prepareStatement(String str)方法来创建
//PreparedStatement的对象
ps = conn.prepareStatement(sql.toString());
//调用PreparedStatement对象的executeQuery()方法,这个调用将返回一个查
//询结果集对象ResultSet
rs = ps.executeQuery();
//将结果集对象中的数据转存到List中,以便于传输。
list = changeResultSetToList(rs);
// 记得及时关闭连接,以便于系统资源的释放
closeCon();
return list;
}
//该方法接收一个Plan的对象,并将其存储到数据库中。
public void save(Plan plan) throws SQLException {
sql = new StringBuffer();
sql.append("insert into plans(plan_desc) values(?)");
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql.toString());
ps.setString(1, plan.getPlan_desc());
//executeUpdate()方法用于执行那些不需要返回结果集的SQL语句,
//如insert、delete、update、create、drop等,其返回值是一个整数,表示受影响的行数。
ps.executeUpdate();
closeCon();
}
//根据传入的数据表名称,清空该数据表
public void clearTable(String tableName) throws SQLException {
sql = new StringBuffer();
sql.append("truncate table ");
sql.append(tableName);
conn = DBTools.getConnection();
ps = conn.prepareStatement(sql.toString());
ps.executeUpdate();
closeCon();
}
//将结果集对象中的数据转存到List中,以便于传输。
private List<Plan> changeResultSetToList(ResultSet rs) {
List<Plan> list = new ArrayList<Plan>();
Plan plan = null;
if (rs == null) {
return list;
}
try {
while (rs.next()) {
plan = new Plan();
plan.setPlan_id(rs.getString("plan_id"));
plan.setPlan_desc(rs.getString("plan_desc"));
list.add(plan);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
//执行操作完,关闭所有连接,注意先后顺序,先关闭ResultSet、
//其次PrepareStatement最后关闭Connection
public void closeCon() {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
ps = null;
rs = null;
}
}
}
第四, 为PlanDAO编写测试用例
对于数据库表的操作代码已编写完,下面就要用到我们的Junit了,编写测试用例,验证一下上面的代码有没有问题,测试脚本如下:
public class PlanDAOTest extends TestCase {
//=====创建一个PlanDAO的对象======
PlanDAO dao=new PlanDAO();
//===初始化数据,向数据库表中插入2条记录=========
protected void setUp() throws Exception {
Plan plan=new Plan();
plan.setPlan_desc("年度计划");
dao.save(plan);
plan.setPlan_desc("月度计划");
dao.save(plan);
}
//====还原数据库表,将其还原到原始状态======
protected void tearDown() throws Exception {
dao.clearTable("plans");
}
//=====测试getAllPlans()方法=======
public void testGetAllPlans(){
List<Plan> list;
try {
list = dao.getAllPlans();
assertEquals(2, list.size());//验证记录条数
//验证第一条记录是否“年度计划”
assertEquals("年度计划", list.get(0).getPlan_desc());
//验证第二条记录是否“月度计划”
assertEquals("月度计划", list.get(1).getPlan_desc()); } catch (Exception e) {
e.printStackTrace();
}
}
}
第五, 执行测试用例
选择测试文件PlanDAOTest.java,右击选择【Run As】——【Junit Test】,运行结果如下图所示:
绿色的横条告诉我们,测试通过了!到此我们成功完成了对数据库表的插入、查询、清空操作。
第六, 总结
本文由浅入深的介绍了Java数据库编程的基本操作,并兼顾了代码的可重用性和规范性,希望能够对大家的工作和学习提供一定的参考。