21.4.2 如何操作数据库
既然连接上了数据库,本节将介绍如何操作数据库。操作数据库主要是查询,下面学习如何进行查询。
查询操作是数据库中最基本的语句。通过如下的语句,可以对数据库执行查询,查询的结果是以结果集ResultSet的形式返回。有关ResultSet集,可以参考API文档。
String sql="select*from表名"
ResultSet result=st.executeQuery(sql);
在表中,提取数据可以使用结果集ResultSet中的方法来提取。如果表中的列都是字符型数据,那么可以使用getString()方法。具体的可以查询相关的API,而在getString()中的参数则可以是这个表中的列名,也可以是表中的列的序号。
【实例21.2】下面举一个有关操作数据库的实例,这个实例的前提是在前面已经建立ODBC数据源。
01 import java.sql.*;
02 public class sqltest
03 {
04 private Connection con;
05 public static void main(String[]args)
06 {
07 sqltest test=new sqltest();
08 Connection con=test.getConnection();///定义一个数据连接
09 String sql="select*from teacherinfo";///定义一个SQL查询语句
10 test.getStudent(con, sql);
11 }
12 public void getStudent(Connection con, String sql)
13 {
14 try
15 {
16 Statement st=con.createStatement();///定义一个结果集
17 ResultSet rs=st.executeQuery(sql);
18 while(rs.next())
19 {
20 String name1=rs.getString(1);
21 String code1=rs.getString(2);
22 String sexy1=rs.getString(3);
23 String age1=rs.getString(4);
24 System.out.println("\n姓名:"+name1+"\t 学号:"+code1+"\t 性别:"+sexy1+"\t 年龄:"+age1);
25 }
26 st.close();
27 con.close();
28 }
29 catch(Exception e){e.printStackTrace();}
30 }
31 public Connection getConnection() ///连接数据库
32 {
33 String url1="jdbc:odbc:schoolmanage";///定义数据库的URL
34 String username="";///用户名
35 String password="";///密码
36 try
37 {
38 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
39 ///登录到建立的数据源上去,也可以说登录到数据库上去
40 con=DriverManager.getConnection(url1,username, password);
41 }
42 catch(SQLException e)
43 {e.printStackTrace();
44 }
45 catch(ClassNotFoundException ex)
46 {ex.printStackTrace();}
47 return con;
48 }
49 }
【代码说明】第33行是指向前面创建的ODBC数据源,第38~40行是通过ODBC登录到数据库。第31~48行用来获取数据库连接,第12~30行用来获取所有的数据库数据。
【运行效果】
姓名:王鹏 学号:2001 性别:男 年龄:23
姓名:宋江 学号:2001 性别:男 年龄:23
姓名:李丽 学号:2001 性别:女 年龄:23
姓名:钱敏 学号:2001 性别:女 年龄:23
姓名:朱庭 学号:2001 性别:男 年龄:23
姓名:祖海 学号:2001 性别:女 年龄:23
姓名:周浩 学号:2001 性别:男 年龄:23
姓名:张平 学号:2001 性别:男 年龄:23
姓名:孙军 学号:2001 性别:男 年龄:23
姓名:王俊 学号:2001 性别:男 年龄:23
姓名:李鹏 学号:2001 性别:男 年龄:23
姓名:孙鹏 学号:2001 性别:男 年龄:23
姓名:王海 学号:2001 性别:男 年龄:23
姓名:周洁 学号:2001 性别:女 年龄:23
姓名:宋平 学号:2001 性别:女 年龄:23
姓名:吴浩 学号:2001 性别:男 年龄:23
姓名:武芬 学号:2001 性别:女 年龄:23
以上的实例将前面所有讲过的数据库方面的知识联系起来了。
【实例21.3】下面结合前面的数据结构举一个实例。在这个实例中存在数据结构的知识和数据库的知识。为了能够让读者看懂这个实例,下面将分步骤来讲述这个程序。
(1)构造一个学生类,代码如下所示。
01 import java.sql.*;
02 import java.util.Vector;
03 ///创建一个学生类
04 ///stname1是指学生 姓名
05 ///stcode1是指 学号
06 ///stsexy1是指 性别
07 ///stmajor1是指专业
08 ///stbirthday是指出 生年月
09 ///staddress1是指 家庭地址
10 ///set是设置器
11 ///get是访问器
12 ///tostring是让对象以字符串形式输出的方法
13 class student1 //创建一个学生类
14 {
15 private String stname1;
16 private String stcode1;
17 private String stsexy1;
18 private String stmajor1;
19 private String stbirthday1;
20 private String staddress1;
21 public student1(String name, String code)
22 {
23 stname1=name;
24 stcode1=code;
25 }
26 public String getstudentname()
27 {
28 return stname1;
29 }
30 public String getstudentcode()
31 {
32 return stcode1;
33 }
34 public void setstudentsex(String sexy)
35 {
36 stsexy1=sexy;
37 }
38 public String getstudentsex()
39 {
40 return stsexy1;
41 }
42 public void setstudentmajor(String major)
43 {
44 stmajor1=major;
45 }
46 public String getstudentmajor()
47 {
48 return stmajor1;
49 }
50 public void setstudentbirthday(String birthday)
51 {
52 stbirthday1=birthday;
53 }
54 public String getstudentbirthday()
55 {
56 return stbirthday1;
57 }
58 public void setstudentaddress(String address)
59 {
60 staddress1=address;
61 }
62 public String getstudentaddress()
63 {
64 return staddress1;
65 }
66 public String toString()
67 {
68 String information="学生 姓名:"+stname1+" 学号:"+stcode1+" 性别:"+stsexy1+"出 生年月:
69"+stbirthday1+"专业:"+stmajor1+"\n";
70 return information;
71 }
72 }
(2)构造一个连接数据库的类。在这个类中,有连接数据库的方法,也有查询数据库的方法。详细代码如下所示。
73 ///这是一个对象的存储类
74 ///getstudent方法是将数据库中的字段数据提取出来赋值给Vector数据结构中的对象
75 ///st是用来返回数据库结果的对象
76 ///rs是指结果集对象
77 ///rs.getString方法是从数据库表中提取字段值
78 ///v是指vector的对象
79 ///sql是指用来查询的一个sql查询语句
80 class querytable
81 {
82 public Vector getstudent(Connection con)
83 {
84 Vector v=new Vector();
85 try
86 {
87 Statement st=con.createStatement();
88 String sql="select*from studentinfo";
89 ResultSet rs=st.executeQuery(sql);
90 while(rs.next())
91 {
92 ///通过结果集将数据库中的字段赋值给字符串。再将字符串赋值给学生对象
93 String name=rs.getString(1);
94 String code=rs.getString(2);
95 String sexy=rs.getString(3);
96 String major1=rs.getString(4);
97 String birthday=rs.getString(5);
98 student1 ss=new student1(name, code);
99 ss.setstudentsex(sexy);
100 ss.setstudentmajor(major1);
101 ss.setstudentbirthday(birthday);
102 //ss.setstudentaddress(address);
103 v.add(ss);///再将对象存储到Vector数据结构中去
104 }
105 st.close();
106 con.close();
107 }
108 catch(Exception e)
109 {
110 e.printStackTrace();
111 }
112 return v;
113 }
114 }
115 ///用来连接数据库的类
116 ///con是指定用来连接数据库的连接类
117 ///username是进入数据库的用户名
118 ///password是指进入数据库的密码
119 ///url1是连接数据库的URL
120 class dbconnection ///创建一个连接数据库的类
121 {
122 private Connection con;
123 public Connection getConnection()
124 {
125 String url1="jdbc:odbc:schoolmanage";
126 String username="";
127 String password="";
128 try
129 {
130 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
131 con=DriverManager.getConnection(url1,username, password);
132 }
133 catch(SQLException e){e.printStackTrace();
134 }
135 catch(ClassNotFoundException ex){ex.printStackTrace();
136 }
137 return con;
138 }
139 }
(3)在主运行类中,将数据库中的表数据输出。详细代码如下所示。
140 ///主运行类
141 ///db是一个连接数据库的类的对象
142 ///v1是一个vector数据结构的对象
143 ///query是一个连接数据库并将数据导入的一个类的对象
144 public class studentsql
145 {
146 public static void main(String[]args)
147 {
148 try
149 {
150 dbconnection db=new dbconnection();///创建一个数据库连接
151 Connection con1=db.getConnection();
152 querytable query=new querytable();
153 Vector v1=query.getstudent(con1);///将所有数据库中数据存储到Vector数据结构中
154 System.out.println("目前vector中的学生个数为:"+v1.size());
155 for(int i=0;i<(v1.size());i++)
156 {
157 System.out.println((student1)v1.get(i));///输出所有的学生对象
158 }
159 }catch(Exception e){e.printStackTrace();}
160 }
161 }
【代码说明】上述代码是先建立一个学生类,然后,将学生类对象放入数据结构Vector中,再连接数据库,从数据库中取数据,放入到Vector中,这样就可以从Vector中直接取数据了。这个实例也是一个比较通用的实例,希望读者能好好地分析它,因为在后面还要用到。
说明
本例读取的是数据库中的studentinfo表,如果没有,需要自己创建一个,可以根据前面介绍的teacherinfo表的插入语句直接改变。
【运行效果】
目前vector中的学生个数为:17
学生 姓名:王鹏 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:宋江 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:李丽 学号:2001 性别:女出 生年月:1975-9-1专业:计算机
学生 姓名:钱敏 学号:2001 性别:女出 生年月:1975-9-1专业:计算机
学生 姓名:朱庭 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:祖海 学号:2001 性别:女出 生年月:1975-9-1专业:计算机
学生 姓名:周浩 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:张平 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:孙军 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:王俊 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:李鹏 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:孙鹏 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:王海 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:周洁 学号:2001 性别:女出 生年月:1975-9-1专业:计算机
学生 姓名:宋平 学号:2001 性别:女出 生年月:1975-9-1专业:计算机
学生 姓名:吴浩 学号:2001 性别:男出 生年月:1975-9-1专业:计算机
学生 姓名:武芬 学号:2001 性别:女出 生年月:1975-9-1专业:计算机