Java程序设计课件:单元22 使用JDBC更新数据库_第1页
Java程序设计课件:单元22 使用JDBC更新数据库_第2页
Java程序设计课件:单元22 使用JDBC更新数据库_第3页
Java程序设计课件:单元22 使用JDBC更新数据库_第4页
Java程序设计课件:单元22 使用JDBC更新数据库_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单元员22 使用JDBC更新数据库员工数据管理程序设计单元目标u 掌握JDBC程序的结构及工作原理;u 掌握JDBC纯Java驱动方式;u 掌握如何使用JDBC获取数据库连接;u 掌握运用JDBC对数据进行增、删、改。学习任务1.任务描述在员工管理系统中,需要建立员工表emp,字段有员工编号(empno)、姓名(ename)、工作(job)、经理编号(mgr)、雇佣日期(hiredate)、工资(sal)、提成(comm)、部门编号(deptno),如图5-23所示。现要求使用JDBC连接数据库,能够根据员工编号查询、添加、修改、删除员工记录。图5-23 员工表emp数据示例2.运行结果员工数

2、据管理程序设计知识准备22.1 JDBC工作原理Sun公司提供的JDBC(Java Database Connectivity,Java数据库连接技术),是Java程序连接关系数据库的标准。JDBC让程序员通过统一接口与不同数据库打交道,不必为每一种数据库编写不同的代码。JDBC将数据库访问封装在类和接口中,程序员方便地对数据库进行增、删、改、查等操作。JDBC 框架结构包括四个组成部分,即Java 应用程序、JDBC API 、JDBC Driver Manager 和JDBC 驱动程序。应用程序调用统一的JDBC API,再由JDBC API通过JDBC Driver Manager装载数

3、据库驱动程序,建立与数据库的连接,向数据库提交SQL请求,并将数据库处理结果 返回给Java应用程序。图5-24 JDBC 框架结构JDBC驱动程序有四类:1JDBC-ODBC桥(JDBC-ODBC Bridge)将对JDBC API的调用,转为对ODBC API的调用,能够访问ODBC可以访问的所有数据库,但是,执行效率低、功能不够强大。Sun建议开发中不使用这种免费的JDBC-ODBC桥驱动程序。2部分Java、部分本机驱动程序(JDBC-Native API Bridge)同样是一种桥驱动程序。它将JDBC的调用转换成数据库厂商专用的API,效率低,服务器易死机。不建议使用。3中间数据访

4、问服务器(JDBC-Middleware)驱动程序独立于数据库,它只和一个中间层通信,由中间层实现多个数据库的访问。与前面两种不同的是,驱动程序不需要安装在客户端,而是安装在服务器端。4纯Java驱动程序(Pure JDBC Driver)纯Java驱动程序由数据库厂商提供,是最成熟的JDBC驱动程序,所有存取数据库的操作都直接由驱动程序完成,速度快,且又可跨平台。在开发中,推荐使用纯Java驱动程序。在JDBC框架结构中,供程序员编程调用的接口与类集成在java.sql和javax.sql包中,如java.sql包中常用的有DriverManager类、Connection接口、Statem

5、ent接口和ResultSet接口。DriverManager类根据数据库的不同,注册、载入相应的JDBC驱动程序, JDBC 驱动程序负责直接连接相应的数据库。 Connection接口负责连接数据库并完成传送数据的任务。Statement接口由 Connection接口 产生,负责执行SQL语句,包括增、删、改、查等操作。 ResultSet接口负责保存Statement执行后返回的查询结果。图5-25 常用接口与类执行的关系22.2 JDBC访问数据库JDBC API完成三件事,通过Connection接口建立与数据库连接,Statement接口执行SQL 语句,ResultSet接口处

6、理返回结果。22.2.1 准备环境要想连接不同数据库,需要下载相应驱动程序,然后添加到当前工程中。比如,连接SQL Server 2008数据库,需准备JDBC驱动程序包sqljdbc4.jar。然后,在Eclipse中,选中当前项目,单击右键,在菜单中选择属性(Properties),打开配置对话框,选择Java Build Path,选中Libraries标签,单击Add Jars按钮,选择添加sqljdbc4.jar文件,将驱动程序包引入工程中。如图5-26所示:图5-26 修改项目属性引入sqljdbc4.jar文件22.2.2 加载并注册驱动用Class.forName()方法显示装

7、载驱动程序。格式如下:tryClass.forName(JDBC驱动程序类); / 注册JDBC驱动 catch (ClassNotFoundException e) / 处理异常System.out.println("无法找到驱动类"); 注解:1Class类的forName()方法以完整的Java类名字符串为参数,装载此类。此时将自动创建一个驱动类的实例,并自动调用驱动器管理器DriverManager类中的RegisterDriver方法来注册它。2驱动类有可能不存在,使用此Class.forName()方法就可能会抛出ClassNotFoundException异常

8、,因此需要捕获这个异常。比如:SQL Server 2008数据库JDBC驱动程序类名为com.microsoft.sqlserver.jdbc.SQLServerDriver,则对应加载驱动的代码为:tryClass.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); / 注册驱动 catch (ClassNotFoundException e) / 处理异常System.out.println("无法找到驱动类"); 22.2.3 Connection对象Connection对象与特定数据

9、库的连接(会话)。在连接上下文中执行SQL语句并返回结果。标准方法是调用DriverManager.getConnection()方法。格式如下:try / 用JDBC URL标识数据库,建立数据库连接Connection con=DriverManager.getConnection(JDBC URL,数据库用户名,密码); catch (SQLException e) / 处理异常e.printStackTrace();注解:1JDBC URL格式为:jdbc:子协议:子名称jdbc表示协议,JDBC URL中的协议总是jdbc;子协议是驱动器名称;子名称是数据库的名称,如果是位于远程服务

10、器上的数据库,则还应该包括网络地址。例如:连接本机SQL Server2008数据库服务器中empmanage数据库的JDBC URL书写为:jdbc:sqlserver:/localhost:1433;DatabaseName=empmanage注解:jdbc表示协议,sqlserver是子协议,/localhost:1433;DatabaseName=empmanage称为子名称。2 getConnection()方法第二个参数是访问数据库所需的用户名,第三个参数是用户密码。3DriverManager.getConnection()方法在执行时可能会抛出SQLException异常,因此

11、需要捕获这个异常。22.2.4 Statement对象Statement对象用于执行静态SQL语句并返回所生成结果的对象。通过Connection接口的createStatement()方法可创建向数据库发送SQL语句的Statement对象。格式如下:try Statement stmt = con.createStatement(); / 发送SQL语句 catch (SQLException e) / 处理异常e.printStackTrace();executeUpdate()方法:用于执行insert、update或delete语句,以及SQL语言中的DDL语句,例如create t

12、able等。例如,删除编号为7369的员工信息stmt.executeUpdate("delete from emp where empno=7369");executeUpdate()的返回值是一个整数,表示受影响的行数(即更新计数),例如修改了多少行、删除了多少行等。对于create tabel等语句,因不涉及行的操作,所以executeUpdate()的返回值总为零。【注意】执行语句的所有方法都将关闭所调用的Statement对象当前打开的结果集(如果存在)。这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。在JDBC API编

13、写程序时,除使用Statement接口,还经常使用PreparedStatement接口编程。PreparedStatement接口继承了Statement接口。当执行PreparedStatement pstmt=con.prepareStatement(SQL语句);时,表示不仅创建一个PreparedStatement对象,而且还要把SQL语句提交到数据库进行预编译,作为提高性能的一条措施。PreparedStatement语句称为预编译语句。例如,现在要在emp表中增加一条记录,用PreparedStatement接口实现。员工数据管理程序设计/ 省略类的声明/ 准备 SQL 语句St

14、ring sql=" INSERT INTO emp(empno,ename,job,hiredate,sal,comm,deptno,mgr) VALUES(?,?,?,?,?,?,?,?)"PreparedStatement pstmt=con.prepareStatement(sql);/ 设置替代变量pstmt.setInt(1, emp.getEmpno();pstmt.setString(2, emp.getEname();pstmt.setString(3, emp.getJob();pstmt.setDate(4, new java.sql.Date(emp

15、.getHiredate().getTime();pstmt.setDouble(5, emp.getSalary();pstmt.setDouble(6, emp.getCommision();pstmt.setInt(7, emp.getDeptno();pstmt.setInt(8, emp.getManagerno();/ 执行SQL 语句num=pstmt.executeUpdate();/ 省略JDBC相关对象关闭操作经验:在应用中,根据具体情况选用PreparedStatement接口或Statement接口。但是,PreparedStatement接口与Statement接口相

16、比,有两个好处。一是,预编译语句是在执行SQL语句之前已编译好SQL语句,而Statement的SQL语句是当程序要执行时,才会去编译;二是,预编译语句中的SQL语句具有参数,每个参数用“?”替代。“?”的值在执行之前利用setXXX()方法设置。实际应用中,预编译提高SQL执行效率,建议尽量使用PreparedStatement接口。22.2.5 关闭数据库连接对象计算机资源是宝贵的,如果打开的资源太多,会造成内存缺失。虽然Java提供垃圾回收机制,但是当内存达到一定程度,即使有垃圾回收机制,程序的运行效率也是非常低的。因此,当对象使用完成后,要关闭相关对象,让其释放占用的内存空间。关闭打开

17、的各对象,该顺序与打开的顺序相反。需要依次关闭结果集对象、语句对象和连接对象。关闭语句对象,代码为:stmt.close();关闭连接对象,代码为:con.close();这些语句操作过程中会抛出异常SQLException,所以操作时需要进行异常处理。任务实施1.实现思路(1) 创建数据库以及数据表;(2) 编写实体类Employee实现员工数据的封装;(3) 编写BaseDAO类完成数据库连接、关闭等功能;(4) 编写EmployeeDAO类实现了员工表访问功能;(5) 编写EmployeeBiz模拟员工管理系统的业务操作。2.程序代码(1)创建数据库以及数据表本任务可采用不同数据库完成,

18、我们在此以SQL Server2008为例。您可以使用SQL Server的默认用户sa登录,先创建一个数据库empmanage,并使用以下SQL语句创建emp表并为其添加几行测试数据。员工数据管理程序设计CREATE TABLE EMP(EMPNO INT CONSTRAINT PK_EMP PRIMARY KEY,-员工编号ENAME VARCHAR(10) NOT NULL,-姓名JOB VARCHAR(9),-工作MGR INT,-经理编号HIREDATE DATE,-雇佣日期SAL NUMERIC(7, 2),-工资COMM NUMERIC(7, 2),-提成DEPTNO INT C

19、ONSTRAINT FK_DEPTNO REFERENCES DEPT(DEPTNO)-部门编号)GO INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);(2)编写实体类Employee实现员工数据的封装员工数据管理程序设计import java.util.Date;public class Employee private String ename; / 员工姓名private Str

20、ing job; / 员工工作private int manager_no; / 员工的经理编号private Date hiredate; / 员工参加工作的日期private double salary; / 员工的工资private double commision; / 员工的提成private int deptno; / 员工的部门编号private int empno; / 员工编号public Employee() public Employee(int empno, String ename, String job, int manager_no,Date hiredate,

21、double salary, double commision, int deptno) / 给成员变量赋值/省略成员变量的get方法、set方法void show() System.out.println(empno + " " + ename + " " + job + " " + manager_no+ " " + hiredate + " " + salary + " " + " " + commision + " "+ dep

22、tno);(3)编写BaseDAO类完成数据库连接、关闭等功能员工数据管理程序设计/省略相关类库的导入语句public class BaseDAO private static final String DRIVER_CLASS = "com.microsoft.sqlserver.jdbc.SQLServerDriver"private static final String DADABASE_URL = "jdbc:sqlserver:/127.0.0.1:1433;DatabaseName= empmanage"private static fin

23、al String DADABASE_USER = "sa"private static final String DADABASE_PASSWORD = "system"public static Connection getConnection()Connection con = null;tryClass.forName(DRIVER_CLASS);catch(ClassNotFoundException ce)ce.printStackTrace();trycon = DriverManager.getConnection(DADABASE_UR

24、L,DADABASE_USER,DADABASE_PASSWORD);catch(SQLException e)e.printStackTrace();return con;public static void closeConnection(Connection con)tryif(con != null | !con.isClosed()con.close();catch(Exception e)e.printStackTrace();public static void closeResultSet(ResultSet rs)try if(rs != null) rs.close();

25、catch(Exception e) e.printStackTrace();public static void closeStatement(Statement stmt)try if(stmt != null) stmt.close(); catch(Exception e) e.printStackTrace();(4)编写EmployeeDAO类实现了员工表访问功能public class EmployeeDAO /* 查询所有的员工信息*/public List getAllEmployees() List lEmployees = new ArrayList();Student

26、stu = null;Connection con = null;Statement stmt = null;员工数据管理程序设计try /省略创建Connection对象和Statement对象String sqlStr = "select * from emp"ResultSet rs = stmt.executeQuery(sqlStr);while (rs.next() Employee e = new Employee();e.setEmpno(rs.getInt("empno");/省略给员工其他成员变量赋值语句e.show();lEmplo

27、yees.add(e);BaseDAO.closeResultSet(rs);BaseDAO.closeStatement(stmt); catch (Exception e) e.printStackTrace(); finally BaseDAO.closeConnection(con);return lEmployees;/省略查询指定员工编号的员工信息/* 添加一个新的员工* param Employee 员工信息*/public int addEmployee(Employee emp) int num = 0;Connection con = null;PreparedStatem

28、ent pstmt = null;try con = BaseDAO.getConnection();String sqlStr = "INSERT INTO emp(empno,ename,job,hiredate,sal,comm,deptno,mgr) VALUES(?,?,?,?,?,?,?,?)"pstmt = con.prepareStatement(sqlStr);pstmt.setInt(1, emp.getEmpno();/省略给其他参数赋值num = pstmt.executeUpdate();BaseDAO.closeStatement(pstmt);

29、 catch (Exception e) e.printStackTrace(); finally BaseDAO.closeConnection(con);return num;/省略删除指定员工编号的员工信息/省略更新制定员工的员工信息(5)编写EmployeeBiz模拟员工管理系统的业务操作public class EmployeeBiz public static void main(String args) 员工数据管理程序设计EmployeeDAO dao = new EmployeeDAO();dao.getAllEmployees();Calendar d = Calendar

30、.getInstance();d.set(1973, 5, 29); / 设置日历为1973年6月29日Employee e = new Employee(1000, "zxg", "Manager", 7369, d.getTime(),2900, 300, 10);dao.addEmployee(e);e.setEname("zhuxg");dao.updateEmployee(e);dao.deleteEmployee(1000);任务拓展如果使用Oracle数据库并采用纯Java驱动程序连接数据库,方法和步骤同连接SQL Se

31、rver数据库基本相同。首先,准备好Oracle数据库JDBC驱动程序包ojdbc14_g.jar。可以通过互联网去下载,也可以到Oracle的安装目录下去找,例如OracleXE10g安装在C:oraclexe下,那么ojdbc14_g.jar文件可以在C:oraclexeapporacleproduct10.2.0serverjdbclib文件夹下找到。然后,在配置Build Path对话框中,选中Libraries标签,添加ojdbc14_g.jar文件,将驱动程序包引入工程中。最后,按照JDBC程序模板编写代码,通过纯Java驱动方式与数据库建立连接。Oracle数据库JDBC驱动程序类名为oracle.jdbc.driver.OracleDriver,数据库JDBC URL为jdbc:oracle:thin:127.0.0.1:1521:xe,其中127.0.0.1是数据库服

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论