Java数据库编程教材_第1页
Java数据库编程教材_第2页
Java数据库编程教材_第3页
Java数据库编程教材_第4页
Java数据库编程教材_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章Java数据库编程建立学生管理数据库/* 学生管理数据库 */CREATE DATABASE xsgl ON( NAME = xsgl_Data,FILENAME = c: start新xsgl.mdf ,SIZE = 2,FILEGROWTH = 10 %) LOG ON( NAME = xsgl_Log, FILENAME = c: start新xsgl_log.ldf,SIZE = 2,FILEGROWTH = 10%) use xsgl GO /*创建专业表 */ CREATE TABLE speciality(specialityID int IDENTITY(l,1) PRI

2、MARY KEY, specialityname char(10)NOT NULL) GO / *创建用户表* / CREATE TABLE usertable (uid int IDENTITY (1, 1) PRIMARY KEY, uname char (10) NOT NULL, upwd char(10) NULL) GO /*创建班级分类表*/ CREATE TABLE classclass(id int IDENTITY(1,1) PRIMARY KEY, parent int NOT NULL, name nchar(10) NOT NULL UNIQUE) GO /*创建课程

3、表 */ CREATE TABLE course (courseID int IDENTITY (1,1) PRIMARY KEY, courseName nchar(20) NOT NULL UNIQUE, teacher nchar( 10 ) NULL) GO / * 创建学生档案表* / CREATE TABLE xsda(no int IDENTITY(1,1)PRIMARY KEY, classID int REFERENCES classclass (ID), name char (10) NOT NULL, sex nchar (1) NOT NULL, birthDate c

4、har (10) NULL, speciality int NULL, address char(30) NULL, isMember char (1) NULL, resume ntext NULL, picture image NULL) GO / *创建学生成绩表*/ CREATE TABLE grade (no int REFERENCES xsda (no), courseId int REFERENCES course (courseID), grade float NOT NULL, PRIMARY KEY(no, courseID) ) GO1 数据库的连接 数据库的连接一般使

5、用两种方法:使用JDBC-ODBC桥实现数据库的连接和使用纯Java JDBC驱动程序实现数据的连接。1. JDBC JDBC(Java DataBase Connection,Java数据库连接)由一组用Java语言编写的类和接口组成。JDBC为使用数据库 及其工具的开发人员提供了一个标准的API,使他们能够用Java API来编写数据库应用程序。通过使用JDBC,开发人员 可以很方便地将SQL语句传送给几乎任何一种数据库。 JDBC的作用概括起来有如下3个方面: (1)建立与数据库的连接 (2)向数据库发起查询请求 (3)处理数据库返回结果 这些作用是通过一系列API实现的,其中的几个重要

6、类或接口如表4-1所示。 表 与数据库有关的几个重要类或接口接口作用处理驱动程序的加载和建立新数据库连接处理与特定数据库的连接在指定连接中处理SQL语句处理数据库操作结果集2DrverManager DriverManager类是Java.sql包中用于数据库驱动程序管理的类,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接,也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。一般的应用程序只使用它的getConnection()方法。这个方法用来建立与数据库的连接。 static Connection getConnection(String u

7、rl, String username, String password):通过指定的数据的URL及用户 名、密码创建数据库连接。 3Connection Connection是用来表示数据库连接的对象,对数据库的一切操作都是在这个连接基础上进行的。Connection类的主 要方法有: void clearWarning( ):清除连接的所有警告信息。 Statement createStatement( ):创建一个Statement对象。Statement CreateStatement(int resultSetType, int resultSetConcurrency):创建一个S

8、tatement对象,它将生成具有特定类型和并发性的结果集。 void commit( ):提交对数据库的改动并释放当前持有的数据库的锁。void rollback( ):回滚当前事务中的所有改动并释放当前连接持有的数据库的锁。String getCatalog( ):获取连接对象的当前目录。 boolean isClose( ):判断连接是否已关闭。 boolean isReadOnly():判断连接是否为只读模式。 void setReadOnly():设置连接的只读模式。 void close():立即释放连接对象的数据库和JDBC资源。 4. Statement Java所有SQL语句

9、都是通过陈述(Statement)对象实现的。Statement用于在已经建立的连接的基础上向数据库发送SQL语句的对象。 Statement对象的建立 通过Connection对象的createStatement方法建立Statement对象:Statement stmt=con.createStatement(); 如果要建立可滚动的记录集,需要使用如下格式的方法: public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException resultSetType可取

10、下列常量:ResultSet.TYPE_FORWARD_ONL:只能向前,默认值。 ResultSet.TYPE_SCROLL_INSENSITIVE:可操作数据集的游标,但不反映数据的变化。ResultSet.TYPE_SCROLL_SENSITIVE:可操作数据集的游标,反映数据的变化。 resultSetConcurrency的取值: ResultSet.CONCUR_READ_ONLY:不可进行更新操作。 ResultSet.CONCUR_UPDATABLE:可以进行更新操作,默认值。 Statement对象的方法 Statement对象提供了三种执行SQL语句的方法: ResultS

11、et executeQuery(String sql):执行SELECT语句,返回一个结果集。int executeUpdate(String sql):执行update、insert、delete 等不需要返回结果集的SQL语句。它返回一个整数,表示执行SQL语句影响的数据行数。boolean execute(String sql):用于执行多个结果集、多个更新结果(或者两者都有)的SQL语句。它返回一个boolean值。如果第一个结果是ResultSet对象,返回true;如果是整数,就返回false。取结果集时可以与getMoreResultSet、getResultSet和getUpd

12、ateCount结合来对结果进行处理。 5ResultSet ResultSet对象实际上是一个由查询结果数据构成的表。在ResultSet中隐含着一个指针,利用这个指针移动数据行,可以取得所要的数据,或对数据进行简单的操作。其主要的方法有:boolean absolute(int row):将指针移动到结果集对象的某一行。 void afterLast():将指针移动到结果集对象的末尾。 void beforeFrist():将指针移动到结果集对象的头部。 boolean first():将指针移动到结果集对象的第一行。 boolean next():将指针移动到当前行的下一行。 boole

13、an previous():将指针移动到当前行的前一行。 boolean last():将指针移动到当前行的最后一行。 此外还可以使用一组getXXX()方法,读取指定列的数据。XXX是JDBC中Java语言的数据类型。这些方法的参数有两种格式,一是用int指定列的索引,二是用列的字段名(可能是别名)来指定列。如: String strName=rs.getString(2); String strName=rs.getString(name);案例 使用纯Java JDBC驱动程序实现数据库的连接在相关网站下载驱动程序,通过Class.forName()方法加载驱动程序,再通过驱动程序管理器

14、(DriverManager)的方法getConnection()建立连接。【代码与注释】import java.sql.*;import javax.swing.*;class ConnectServer2/连接数据类static Connection con=null;/连接对象public static boolean conn(String url,String username,String password)tryClass.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);catch(Exception e)e.print

15、StackTrace();return false;trycon=DriverManager.getConnection(url,username,password);/连接数据库catch(SQLException e)e.printStackTrace();return false;return true;/成功public static boolean close()trycon.close();/关闭数据库con=null;catch(SQLException e)return false;return true;public static void main(String args)

16、/连接SQL Server数据库if(conn(jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=xs gl,sa,)JOptionPane.showMessageDialog(null,数据库连接成功!);close();/关闭数据库else JOptionPane.showMessageDialog(null,数据库连接失败!);学习利用纯Java JDBC驱动程序实现数据库连接。【应用扩展】连接其他类型的数据库使用的驱动程序,可参考表4-2。表4-2 常用的数据库驱动程序数据库驱动类URL下载地址MySQLjdbc:mysql:/

17、localhost:3306/xsglOracleriver.OracleDriverjdbc:oracle:thin:127.0.0.1:1521:xsgl 【相关知识】1. 纯Java JDBC驱动程序 纯Java JDBC驱动程序是独立的连接驱动程序,不需要中间服务器,与数据库实现通信的整个过程均由Java语言 实现。这种方法目前应用较广泛,缺点是需要下载相应的类包,不同数据库的连接代码可能不同。连接SQL Server可 以在网站下载。有三个类包:msbase.jar、mssqlserver.jar、msutil.jar。使用时要将这三个包放在 jdkjrelibext目录下,或者所放

18、的位置设置到CLASSPATH中即可。 2使用纯Java JDBC驱动程序连接数据库 (1)加载驱动程序 在JDBC中,通常有两种加载驱动程序的方式。 一种是将驱动程序添加到java.lang.System的属性jdc.drivers中。这是一个由DriverManager类加载驱动程序类名的列表,用冒号分隔。在JDBC的java.sql.DrvierManager类初始化时,JVM的系统属性中搜索jdbc.drivers字段的内容。如果存在以冒号分隔的驱动程序名称,则 DriverManager类加载相应的驱动程序。 另一种方式是在程序中利用Class.forName()方法加载指定的驱动程

19、序,如: Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); 需要注意的是,连接不同的数据库,加载的驱动程序有所不同。 (2)创建指定数据库的URL 要建立与数据库的连接,首先要创建指定数据库的URL。数据库的URL对象类似网络资源的统一定位。其构成格 式如下:jdbc:subProtocol:subName:/hostname:port;DatabaseName=XXX 其中:jdbc表示当前通过Java的数据库连接进行数据库访问。 subProtocal表示通过某种驱动程序支持的数据库连接机制。 subName表示在当前

20、连接机制下的具体名称。hostName表示主机名。port表示相应的连接端口。 DatabaseName是要连接的数据库的名称。 按照上述构造规则,可以构造如下类型的数据库URL: jdbc.microsoft:sqlserver:/localhost:1433;DatabaseName=xsgl 该数据库URL表示利用Microsoft提供的机制,选择名称为sqlserver的驱动,通过1433端口访问本机上的xsgl数据库。 数据的基本操作数据的基本操作主要是指对数据的查看、添加、修改、删除、查询等操作,利用Java的Statement对象所提供的成员方法,可以方便地实现这些操作。案例 3

21、 读取数据利用Connection对象的createStatement方法建立Statement对象,在利用Statement对象的executeQuery()的方法执行SQL语句进行查询,返回结果集。再利用形如getXXX()的方法从结果集中读取数据。 【案例说明】利用上面定义的ConnectServer类建立连接,读取学生档案(xsda)表中的数据,显示在如图4-1所示的窗体中,并且能够前后移动记录。学习数据库的基本操作方法。为了方便,案例中的组件采用的都是文本组件。在实际应用中,也经常使用其他组件。例如,性别用单选钮。如果改成单选钮,男和女两个单选钮要建立成组,并根据数据库中读出的数据,

22、设置其选中状态。读者可参考下一案例。import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.sql.*;public class StudentDataWindow extends JFrame implements ActionListenerString title=班级:,学号:,姓名:,性别:,出生日期:,团员否:,家庭地址:,简历:;JTextField txtClassID=new JTextField(2);JTextField txtNo=new

23、JTextField(2);JTextField txtName=new JTextField(10);JTextField txtSex=new JTextField(3);JTextField txtBirthDate=new JTextField(10);JTextField txtIsMember=new JTextField(2);JTextField txtAddress=new JTextField(30);JTextArea txtResume=new JTextArea();JButton next=new JButton(下一页);JButton prev=new JBut

24、ton(上一页);JButton first=new JButton(首页);JButton last=new JButton(尾页);Statement stmt;ResultSet rs;StudentDataWindow()super(学生档案信息查看窗口);setSize(450,395);trystmt=ConnectServer.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);/创建Statment对象,指定记录集可滚动,但只读rs=stmt.executeQuery(

25、select * from xsda); /执行查询,返回结果集Container con=getContentPane();con.setLayout(new BorderLayout(0,8);JPanel p=new JPanel7;for(int i=0;i7;i+)pi=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0);pi.add(new JLabel(titlei);p0.add(txtClassID);p1.add(txtNo);p2.add(txtName);p3.add(txtSex);p4.add(txtBirthDate);

26、p5.add(txtIsMember);p6.add(txtAddress);JPanel p1=new JPanel(new GridLayout(7,1,0,8);JScrollPane jp=new JScrollPane(txtResume, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);jp.setPreferredSize(new Dimension(380,80);for(int i=0;i7;i+) p1.add(pi);JPanel p2=new JPanel(ne

27、w FlowLayout(FlowLayout.LEFT,10,0);p2.add(new JLabel(title7);p2.add(jp);JPanel p3=new JPanel();p3.add(prev);p3.add(next);p3.add(first);p3.add(last);con.add(p1,North);con.add(p2,Center);con.add(p3,South);next.addActionListener(this);prev.addActionListener(this);first.addActionListener(this);last.addA

28、ctionListener(this);rs.first();loadData();catch(Exception e)e.printStackTrace();setVisible(true);boolean loadData() /读结果集中数据,并设置到相应的组件trytxtNo.setText(rs.getString(no);txtClassID.setText(rs.getString(classID);txtName.setText(rs.getString(name);txtSex.setText(rs.getString(sex);txtBirthDate.setText(rs

29、.getString(birthDate);txtAddress.setText(rs.getString(address);txtIsMember.setText(rs.getString(isMember);txtResume.setText(rs.getString(resume);catch(SQLException e)e.printStackTrace();return false; return true;public void actionPerformed(ActionEvent e)tryif(e.getSource()=next)rs.next(); /下一记录else

30、if(e.getSource()=prev)rs.previous(); /前一记录else if(e.getSource()=first)rs.first(); /首记录else if(e.getSource()=last)rs.last(); /尾记录loadData(); /重新读取数据catch(Exception ee)public static void main(String args)JFrame.setDefaultLookAndFeelDecorated(true);Font font = new Font(JFrame, Font.PLAIN, 14);Enumerati

31、on keys = UIManager.getLookAndFeelDefaults().keys();while (keys.hasMoreElements()Object key = keys.nextElement();if(UIManager.get(key)instanceof Font) UIManager.put(key, font);if(!ConnectServer.conn(jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=xsgl,sa,)JOptionPane.showMessageDialog(null,数据库

32、连接不成功!);System.exit(0);StudentDataWindow mainFrame = new StudentDataWindow();【应用扩展】为了方便,案例中的组件采用的都是文本组件。在实际应用中,也经常使用其他组件。例如,性别用单选钮。如果改成单选钮,男和女两个单选钮要建立成组,并根据数据库中读出的数据,设置其选中状态。读者可参考下一案例。案例4 数据更新【案例说明】数据的更新包括表的创建、删除及记录的增、删、改操作。本案例实现了对数据的更新操作,界面上的组件更加丰富。运行界面如图 所示。【技术要点】利用Connection对象的createStatement方法建立

33、Statement对象,再利用Statement对象的executeUpdate()的方法执行update语句,实现数据修改;执行insert语句,实现数据添加。import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.sql.*;class StudentDataUpdate extends JFrame implements ActionListenerString title=班级,学号,姓名,性别,出生日期,团员否,家庭地址,简历;JComboBox com

34、bClassID=new JComboBox();JTextField txtNo=new JTextField(2);JTextField txtName=new JTextField(10);JTextField txtBirthDate=new JTextField(10);JTextField txtAddress=new JTextField(30);JTextArea txtResume=new JTextArea();JRadioButton radioSexM=new JRadioButton(男,true);JRadioButton radioSexF=new JRadioB

35、utton(女,false);JCheckBox checkIsMember=new JCheckBox(,false);JButton ok=new JButton(保存);JButton cancel=new JButton(取消);Statement stmt;ResultSet rs;int No;StudentDataUpdate(int No)this.No=No;if(No=-1)setTitle(添加学生档案窗口);else setTitle(修改学生档案窗口);tryContainer con=getContentPane();con.setLayout(new Border

36、Layout(0,5); /设置边界布局stmt=ConnectServer.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); /建立可滚动并且可更新的结果集rs=stmt.executeQuery(select name from classclass order by ID asc);while(rs.next()/将班级信息添入到下拉列表中combClassID.addItem(rs.getString(1);ButtonGroup bgp=new ButtonGroup();

37、 /为单选钮分组bgp.add(radioSexM);bgp.add(radioSexF); setSize(450,410); JPanel p=new JPanel7; for(int i=0;i7;i+)pi=new JPanel(new FlowLayout(FlowLayout.LEFT,10,0); pi.add(new JLabel(titlei); p0.add(combClassID); p1.add(txtNo); p2.add(txtName); p3.add(radioSexM);p3.add(radioSexF); p4.add(txtBirthDate); p5.a

38、dd(checkIsMember); p6.add(txtAddress); JPanel p1=new JPanel(new GridLayout(7,1,0,5); for(int i=0;i0)System.out.println(成功删除记录);【应用扩展】案例中对数据的操作均使用SQL完成。在构造SQL语句时十分麻烦,实际上对数据的更新还有其他方法。例如,使用预处理(PreparedStatement)对象不仅可以提高操作的速度,而且书写也会简单。在后面的内容中将介绍几种更新数据的方法。【相关知识】1数据表记录增加操作(1)数据表记录增加的SQL语法insert into 表名(字段

39、名1,字段名2) values(字段值1,字段值2,) 例如: insert into xsda(classID,name,sex,birthDate,isMember,address,resume) values(12,张磊,男, 1988-9-8,1, 北京, ) (2)使用Statement对象增加数据表记录 首先创建一个SQL语句。然后调用Statement对象的executeUpdate()方法。 stmt.executeUpdate(sql); 上述方法可以返回一个整数,表明成功插入的记录数。(3)使用moveToInsertRow 和insertRow方法增加数据表记录 Stri

40、ng sql=select * from xsda; ResultSet rs=stmt.executeQuery(sql); /获取数据表的全部结果集 rs.moveToInsertRow(); /将数据表指针移到插入记录位置 rs.updateInt(2, 13); /向classID字段输入数据rs.updateString(3, 黄红); /向name字段输入数据 rs.updateString(4, 女); /向sex字段输入数据rs.updateString(5, 1997-9-12); /向birthDate字段输入数据 rs.updateString(6, 大连); /向address字段输入数据 rs.updateInt(7, 1); /向isMember字段输入数据rs.updateString(8, 无); /向resume字段输入数据 try rs.insertRow(); catch(Exception e) (4)使用PrepareStatement对象增加数据表记录 与使用Statement类似,只是创建SQL语

温馨提示

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

评论

0/150

提交评论