DMS(Database Management System 数据库管理系统)
DAODAO(Data Access Object) 数据访问对象 是一个面向对象的数据库接口.DAO的设计原则是实现数据访问和业务逻辑的分离,封装最基本的增删改查方法(curd).
1.DMS DAO原型——ServiceDAO的findAll方法
案例一:如何使用Java代码连接数据库,实现查询全部的业务帐号信息。
SERVICE表结构介绍
字段名称 | 类型 | 备注 | 字段描述 |
---|---|---|---|
ID | NUMBER (11) | PRIMARY KEY NOT NULL | 业务账号ID |
ACCOUNT_ID | NUMBER(11) | FOREIGN KEY | 账务账号ID |
UNIX_HOST | VARCHAR2(15) | NOT NULL | 服务器地址 |
OS_USERNAME | VARCHAR2(50) | NOT NULL | 服务器上的OS账号 |
LOGIN_PASSWD | VARCHAR2(30) | NULL | 登录口令 |
STATUS | CHAR(1) | NOT NULL | 0:开通;1:暂停;2:删除 |
CREATE_DATE | DATE | NOT NULL | 创建日期,创建即开通 |
PAUSE_DATE | DATE | NULL | 暂停日期 |
CLOSE_DATE | DATE | BULL | 删除日期 |
COST_ID | NUMBER(11) | FOREIGN KEY NOT NULL | 资费编码 |
在创建表时不考虑外键约束,建表语句如下:
CREATE TABLE SERVICE(
ID NUMBER(11) CONSTRAINT SERVICE_ID_PK PRIMARY KEY NOT NULL,
ACCOUNT_ID NUMBER(11) NOT NULL,
ACCOUNT_ID NUMBER(11) NOT NULL,
UNIX_HOST VARCHAR2(15) NOT NULL,
OS_USERNAME VARCHAR2(50) NOT NULL,
LOGIN_PASSWD VARCHAR2(30) NOT NULL,
STATUS CHAR(1) NOT NULL,
CREATE_DATE DATE NOT NULL,
PAUSE_DATE DATE,
CLOSE_DATE DATE,
COST_ID NUMBER(11) NOT NULL
);
在插入测试数据之前修改默认的时间格式.
alter session set nls_date_format = 'yyyy mm dd hh24:mi:ss';
在SERVICE表中插入测试数据并提交。
INSERT INTO SERVICE VALUES (2001,1010,'192.168.0.26','guojing',
'12345',0,'2009 03 10 10:00:00',null,null,1);
INSERT INTO SERVICE VALUES (2002,1011,'192.168.0.26','huangrong',
'12345',0,'2009 03 01 15:30:05',null,null,1);
INSERT INTO SERVICE VALUES (2003,1011,'192.168.0.20','huangrong',
'12345',0,'2009 03 01 15:30:10',null,null,3);
INSERT INTO SERVICE VALUES (2004,1011,'192.168.0.23','huangrong',
'12345',0,'2009 03 01 15:30:15',null,null,6);
INSERT INTO SERVICE VALUES (2005,1019,'192.168.0.26','luwushuang',
'12345',0,'2012 02 10 23 :50:55',null,null,4);
INSERT INTO SERVICE VALUES (2006,1019,'192.168.0.20','luwushuang',
'12345',0,'2012 02 10 00 :00:00',null,null,5);
INSERT INTO SERVICE VALUES (2007,1020,'192.168.0.20','weixiaobao',
'12345',0,'2012 02 10 11:05:20',null,null,6);
INSERT INTO SERVICE VALUES (2008,1020,'192.168.0.20','guojing',
'12345',0,'2012 02 11 12:05:21',null,null,6);
INSERT INTO SERVICE VALUES (2009,1020,'192.168.0.20','tongxiangyu',
'12345',0,'2012 02 12 10:05:20',null,null,6);
INSERT INTO SERVICE VALUES (2010,1020,'192.168.0.20','baizhantang',
'12345',0,'2012 02 11 11:05:30',null,null,6);
INSERT INTO SERVICE VALUES (2011,1018,'192.168.0.20','moxiaobei',
'12345',0,'2012 02 11 12:05:31',null,null,6);
INSERT INTO SERVICE VALUES (2012,1018,'192.168.0.20','luxiucai',
'12345',0,'2012 02 12 12:06:30',null,null,6);
INSERT INTO SERVICE VALUES (2013,1018,'192.168.0.20','lidazhui',
'12345',0,'2012 02 13 13:07:31',null,null,6);
INSERT INTO SERVICE VALUES (2014,1015,'192.168.0.20','guofurong',
'12345',0,'2012 02 14 14:08:32',null,null,6);
INSERT INTO SERVICE VALUES (2015,1015,'192.168.0.20','xingbutou',
'12345',0,'2012 02 15 15:09:33',null,null,6);
COMMIT;
创建ServiceDAO类,在类中新建方法findAll,实现查询全部的业务帐号信息。
在findAll方法中,首先注册连接Oracle数据库的驱动程序。
Class.forName("oracle.jdbc.OracleDriver");
通过调用DriverManager的getConnection方法,获取Connection类的对象,建立连接。
getConnection方法有三个参数,第一参数表示连接数据库的字符串,包含了要连接数据库信息,
例如连接Oracle数据库的连接字符串格式为:
jdbc:oracle:thin:@<主机名>:<端口号(默认1521)>:<实例名>
第二参数表示连接数据库的用户名,第三个参数表示连接数据库的密码,可以根据连接数据库
的不同,用户名和密码的不同,相应的修改以上所述的三个参数。
con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:ORCL","scott", "tiger"
Connection表示应用程序与数据库的连接,通过调用它的createStatement()方法可以获取数
据库操作对象Statement。
stmt = con.createStatement();
Statement主要用于执行SQL语句并返回它所生成结果。通过调用它的executeQuery方法,该
方法有一个参数,表示要执行的SQL语句。
ResultSet rs = stmt.executeQuery("select ID, ACCOUNT_ID, UNIX_HOST, OS_USERNAME,
LOGIN_PASSWD, CREATE_DATE from SERVIC");
ResultSet表示数据库查询操作的结果集。它具有指向其当前数据行的光标。最初光标被置
于第一行之前,调用其next 方法将光标移动到下一行,该方法在 ResultSet 对象没有下一行时返回
false,因此可以在 while 循环中使用它来迭代结果集。
ResultSet提供了getXXX(String column)方法,例如:getInt(String column)等,获取当
前ResultSet 对象的当前行中指定列名的值,其中参数column表示数据库表中的列名字。推荐使用
根据列名去获取列的数据信息。
while (rs.next()) {
System.out.println(rs.getInt("ID") + ","
+ rs.getInt("ACCOUNT_ID") + ","
+ rs.getString("UNIX_HOST")
+ "," + rs.getString("OS_USERNAME") + ","
+ rs.getString("LOGIN_PASSWD") + ","
+ rs.getTimestamp("CREATE_DATE"));
}
ResultSet提供了getXXX(int columnIndex)方法,例如:getInt(int columnIndex)等,获
取当前ResultSet 对象的当前行中指定列索引的值,其中参数columnIndex表示要获取的列的数据
在表中是第几列,注意:列数从1开始。
while (rs.next()) { System.out.println(rs.getInt(1) + "," +
rs.getInt(2) + "," + rs.getString(3) + "," + rs.getString(4)
"," + rs.getString(5) + "," + rs.getTimestamp(6)); }
数据库的连接资源是有限的,使用完毕后需要及时释放。否则会因资源耗尽使应用程序瘫痪,
无法正常工作。 调用JDBC对象的close方法可以释放与该对象关联的系统资源。
rs.close();
stmt.close();
ServiceDAO类代码如下:
public class ServiceDAO {
public void findAll() {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL",
"scott", "tiger");
stmt = con.createStatement();
rs = stmt .executeQuery("select ID, ACCOUNT_ID, UNIX_HOST, OS_USERNAME,
LOGIN_PASSWD, CREATE_DATE from SERVICE");
while (rs.next()) {
System.out.println(rs.getInt("ID") + ","
+ rs.getInt("ACCOUNT_ID") + "," + rs.getString("UNIX_HOST")+ "," + rs.getString("OS_USERNAME") + ","
+ rs.getString("LOGIN_PASSWD") + ","+ rs.rs.getTimestamp("CREATE_DATE"));
}
rs.close();
stmt.close();
} catch (ClassNotFoundException e) {
System.out.println("驱动类无法找到!");
throw new RuntimeException(e);
} catch (SQLException e) {
System.out.println("数据库访问异常!");
throw new RuntimeException(e);
} finally {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
}
}
}
}
TestServiceDAO类代码如下:
public class TestServiceDAO {
@Test
public void testFindAll() {
ServiceDAO serviceDAO = new ServiceDAO();
serviceDAO.findAll();
}
}
实现根据服务器地址和服务器的OS账号查询业务帐号信息。
在ServiceDAO类中创建findByUsernameAndHost方法,实现根据服务器地址和服务器的OS
账号查询业务帐号信息。
设置要查询的服务器地址和服务器的OS帐号。
在SQL语句中,设置查询的条件,注意字符串的拼接方式。