Java数据库编程

在当前的应用程序开发中,几乎所有的大型软件都要用到数据库,而且数据库的设计和开发几乎关系到整个软件项目的成功与否。为了保证Java应用程序与数据库的正常连接,Sun公司开发了JDBCJava DataBase ConnectivityJava数据库连接),为各种常用数据库提供无缝连接技术。JDBCJava程序使用的与数据库进行通信的应用程序接口,通过它,开发人员可以方便的将SQL语句传送给几乎任何一种数据库。

概括而言,JDBC能实现三种功能:与数据库建立连接(Connection)、向数据库发送SQL语句(StatementPreparedStatement)、操作数据库及数据表(StatementPreparedStatement)、接收及处理数据库执行的结果(ResultSet)。

通过上面的讲解相信大家对于JDBC有了一个大概的认识,下面我们就针对具体的实例来开始我们的JDBC编程吧!

操作环境说明:

1.       操作系统:Windows XP 专业版

2.       数据库:Microsoft SQL Server2000

3.       JDK1.5

4.       集成开发环境:eclipse3.4

5.       数据库名称:tcim,内有一用户自定义表plans,包括字段:plan_id(设置为自增1)和plan_descvarchar类型)。

 

第一,  建立数据库连接

任何一个对数据库的操作都需要与数据库建立连接,为了提高代码的性能和可重用性,我们将到数据库的连接单独拿出来,写在一个类中(暂且称为 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; 

    }  

}

 

第二,  创建实体类

这儿的实体类是指被存储的对象,一般与数据库中某一个表相对应,内部主要包括一些setget方法,代码如下:

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;

    }

}

第三,  创建plansDAO

所谓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语句,

       //insertdeleteupdatecreatedrop等,其返回值是一个整数,表示受影响的行数。

       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数据库编程
 

绿色的横条告诉我们,测试通过了!到此我们成功完成了对数据库表的插入、查询、清空操作。

第六,  总结

本文由浅入深的介绍了Java数据库编程的基本操作,并兼顾了代码的可重用性和规范性,希望能够对大家的工作和学习提供一定的参考。

你可能感兴趣的:(java)