一.实验目的:
理解并掌握利用.net和Delphi、Java(JBuilder或Eclipse)等编程平台进行数据库访问的基本过程,熟悉数据库访问方法。
二.实验属性:
设计性。
三.实验仪器设备及器材:
装有.net和Delphi 7、.net或JDK编译器及SQL Server的计算机。
四.实验要求
1. 调用Driver.forName方法加载驱动程序。
2. 调用DriverManager对象的getConnection()方法,获得一个Connection对象。
3. 创建一个Statement对象,准备一个SQL语句,这个SQL语句是Statement对象(立即执行的语句)、PreparedStatement语句(预编译的语句)或CallableStatement(存储过程中调用的语句)。
4. 调用executeUpdate()等方法执行SQL语句,不返回ResultSet对象的结果。
5. 对返回的ResultSet对象进行显示等相应的处理。
c)对于Java(JBuilder或Eclipse)编译环境利用JDBC进行数据库连接。数据库连接后使用Database、QueryDataSet、TableDataSet、DataSetView等类进行数据库操作。
2 实验中要求完成如下步骤:
b. 复合查询。
给定一定的查询字段,有用户进行选择进行查询。注意使用模糊匹配。
c. 动态查询。
给出数据库的所有字段,有用户选择后进行查询。对于不同的字段类型,由程序自动给出操作运算符,如果用户选择了一个数据类型是char型的字段,操作运算符只能是“=”,“< >”。注意使用模糊匹配。
五.实验步骤:
采用java语言借助于eclipse来连接数据库sqlserve 2005.(由于利用java语言其界面设计的代码较为繁琐就不涉及其相关代码,只列述与数据库相关的代码)
1 连接数据库:
在建立工程后,需要为驱动包构建路径,然后获得一个连接对象:
public Connection getConn() { String url="jdbc:sqlserver://localhost:1433;DatabaseName=Demo;"; String userName="root"; String password="root"; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn=DriverManager.getConnection(url,userName,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } return conn; }
|
2 。设计登录(利用数据库)
* 登录时得到通过用户的登录名strUser去查找数据库的密码 */ public ResultSet getUserName(String strUser) { conn=getConn(); ResultSet rs; if(conn!=null) { String StrSql="select * from login where sno=?"; try { PreparedStatement psmt=conn.prepareStatement(StrSql); psmt.setString(1, strUser); rs = psmt.executeQuery();
} catch (SQLException e) { e.printStackTrace(); return null; } return rs; } else return null; } |
以上是连接数据库,通过在UI界面输入的用户账号,通过连接数据库获得密码与UI界面上的密码进行对照。 在向sql语句传递参数时,利用的是PreparedStatement预编译处理的形式能够动态的添加相关变量。
设计的是一个combox控件对象上显示各个阶段的年龄(调用数据库中的学生年龄),
当选择一个时,会将这个年龄的所有学生信息显示在一个table控件对象上。
运行界面:
(1) combox控件对象上的数据绑定
/* * 查找数据库中的学生的年龄阶段,存放在一个vector里面 */ public Vector getAges() throws SQLException { Vector items= new Vector(); conn=getConn(); String strSql="select distinct sage from student order by Sage asc "; PreparedStatement psmt=conn.prepareStatement(strSql); ResultSet rs = psmt.executeQuery(); while(rs.next()) { String age=String.valueOf(rs.getInt("Sage"));//将int类型转换成string items.addElement(age); } return items; } |
将返回的数据在进一步放到combox控件上就可以了。在不知道数据的长度时,我们需要将返回的数据信息放到一个向量对象里面去,最后只需将这个向量对象在作为combox的一个参数就可以将数据显示到空间对象上。
(2) 为table控件对象绑定数据:
public ResultSet getTableset(int age) {
conn=getConn(); PreparedStatement psmt; try { psmt = conn.prepareStatement("select sno as '学号',sname as '姓名',sdept as '院系' from student where sage =?"); psmt.setInt(1, age); return psmt.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } |
对于已经获取的ResultSet(结果集)它是一条一条的记录,需要为这个结果集设置一个TableModel。
DBconnect db = new DBconnect(); ResultSet rs =db.getTableset(age);
try { table.repaint(); rsTableModel.SetResultSet(rs);
table.setModel(rsTableModel);
} catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
|
注:rsTableModel是一个继承了AbstractTableModel类的一个对象这样就可以将返回的结果集的数据显示在table的一个控件对象上。
为了的操作方便,也可以在一个文本框内输入一句sql语句来将返回的数据返回到一个表内:
这个实现和上述的实现是一样的,就是先将ResultSet经过TableModel显示在table的控件对象上了。
条件式查询就是为查询语句设置一定的条件,在可视化操作中还要根据不同的条件来设置进行不同的处理
先截取运行后的界面:
按照学号的模糊查询
按照姓名的模糊查询
执行结果
至于其相应的代码实现:
当点击执行按钮是就会响应一下函数
else if(e.getActionCommand().equals("执行")) { String strConditions=textConditions.getText(); String strSql=null; if(strConditions.equals("")) JOptionPane.showMessageDialog(null, "输入的条件为空"); else { DB ss = new DB(); { switch (SelectedType) { case 1: strSql="select sno '学号',sname as '姓名',sdept '学院',sage '年龄'from student where sno"+cbxOperater.getSelectedItem().toString()+textConditions.getText(); System.out.println(strSql); break; case 2: strSql="select sno '学号',sname as '姓名',sdept '学院',sage '年龄'from student where sage"+cbxOperater.getSelectedItem().toString()+textConditions.getText(); System.out.println(strSql); break; case 3: strSql="select sno '学号',sname as '姓名',sdept '学院',sage '年龄'from student where sname like"+"'"+textConditions.getText().trim()+"%'"; break; } }
// strSql="select * from student"; ResultSet rs =ss.excuteQurre(strSql); try { rsModel.SetResultSet(rs); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } table.repaint(); table.setModel(rsModel); }
|
设计思路是先对选择查询的进行选择,如当选择以姓名进行查找时就将selectionType设置为1,就再将查询的要求设置为> < = 这三种选择,这样就可以进行相关的数据处理。
(六)实验心得:
Jdbc连接数据库是java学习的一个提升,同时也是将数据库学习的实践化。
通过这个实验(虽然有点简单),我一方面加强了我对java语言的理解和深化,以前我从未用过Jtable控件,但这次我不仅用了,而且是在table控件上显示数据库的信息,另一方面我也从中理解了sql语句在高级语言的嵌套,这样就可以实现真正的sql的操作。
但在收获成功的同时我也遇到很多问题:
1 java语言不想C#中可以及将查询的数据结果放到DateSet里面,在里面又可以将表分离,java返回的是ResultSet需要在经过TableModel这一设置,经过一番在网上的查找我实现这项功能。
2 sql语言的嵌套在高级语言中,刚开始时除了问题,如textUserName(textBox控件对象)的text返回的用户的姓名,在嵌套时应该有“’”+textUserName+“’”,错误虽小,但要谨记。