当前位置:文档之家› 小型仓库管理系统的详细设计实现

小型仓库管理系统的详细设计实现

小型仓库管理系统的详细设计及实现1.系统设计概述(1)问题域部分,设计构造一组为底层应用建立模型的类和对象,细化分析结果;由建立数据对象部分实现。

(2)人机交互部分,设计一组有关类接口视图的用户模型的类和对象,设计用户界面;由建立商品数据维护界面部分实现。

(3)任务管理部分,确定系统资源的分配,设计用于系统中类的行为控制的对象/类;由建立商品类别显示模型和商品类型模型部分以及建立商品数据维护界面部分共同实现。

(4)数据管理部分,确定持久对象的存储,将对象转换成数据库记录或表格;由连接数据库和建立商品数据访问对象部分实现。

2.连接数据库要通过Java访问数据库,必须要使用JDBC(Java Data Base Connectivity,java数据库连接),访问不同的数据库,采用的JDBC驱动程序也不同。

连接Access采用Jdbc-odbc 桥的方式比较方便,不需要引入额外的驱动程序包。

主流的数据库都提供了专门的JDBC驱动,如ORCALE、Sql Server、Sybase等等,对于微软的Access和Excel以及其他的一些小型的桌面数据库,可以通过JDBC-ODBC桥接的方式来访问。

通过编码,我们不需要在环境中配置ODBC数据源,就可以直接访问这些小型桌面数据库。

在应用系统中,数据库的连接参数一般都是写在配置文件当中,以防止数据库的属性的变化导致程序的修改。

对于本任务来说,Access是桌面数据库,我们需要知道的只是Access 数据库文件的路径,因此我们可以将Access数据库文件拷贝到发布路径下,从而可以通过编码获得数据库文件路径,而不需要使用配置文件。

package test.sample.dao;import .URL;import java.sql.Connection;import java.sql.DriverManager;public class DaoFactory {static public Connection getConnection() throws Exception{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载数据库驱动URL dbUrl =DaoFactory.class.getClassLoader().getResource("Mystock.mdb");String dbPath=dbUrl.getPath(); //通过Java的类加载机制,获得数据库文件路径if (dbPath.charAt(0)=='/'){ //去掉路径的第一个字符/dbPath=dbPath.substring(1);}String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+dbPath;Connection con = DriverManager.getConnection(url, "sa", "");return con;}}Class.forName方法的作用是通过类的完整路径名获得一个类的实例,在本例子中的作用是加载我们要使用的数据库驱动。

在使用DriverManager获得数据库连接前,必须通过此语句加载数据库驱动。

ClassLoader类负责管理Java编译后代码的加载,因此能够获取class文件的加载路径,也就是应用的发布路径。

我们把数据库文件放到发布路径下(即class文件所在路径),即可以通过ClassLoader类的getResource方法获得该文件的绝对路径。

由于获得的绝对路径的第一个字符是“/”,这是为了兼容不同的操作系统而导致的,这个符号在Access的数据库路径上是不合法的,需要去掉。

通过数据库url,提供数据库的驱动描述,以及数据库的路径,就可以使用DriverManager类来获得数据库连接。

3.建立商品数据访问对象从数据库中提取数据,以及向数据库中插入记录和删除数据,都必须使用SQL语句来完成。

因此数据访问对象的方法,实际上就是通过Java数据访问对象,在数据库数据和数据对象之间进行转换。

在数据库的访问中,我们需要用到几个数据访问对象:1.java.sql.Connection:用来获得数据库连接。

2.java.sql.PreparedStatement和java.sql.Statement:都可以用来执行SQL语句。

其中PreparedStatement的功能较强,SQL 语句被预编译并且存储在 PreparedStatement对象中。

然后可以使用此对象高效地多次执行该语句。

PreparedStatement可以设置set方法设置参数。

以下是一个设置参数的示例中,con 表示一个活动连接:PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEESSET SALARY = ? WHERE ID = ?");pstmt.setBigDecimal(1, 2000.00) ;pstmt.setInt(2, 100) ;pstmt.excuteUpdate();SQL语句中需要赋值的部分可以用?代替,然后通过set方法来设置参数。

由于设计参数时不同的类型方法也不同,能够很好的处理不同的类型。

例如在设置日期型的参数时,可以直接通过setDate方法设置参数,而如果通过SQL语句的字符串拼写,则必须对日期进行格式化。

对于复杂的Insert、update和delete的SQL语句,以及需要多次执行而参数不同的SQL语句,使用PreparedStatement具有明显优势。

3.java.sql.ResultSet:从数据库库提取后的数据保存在ResultSet中,ResultSet 提供的getter方法能够方便的返回记录集中的数据。

程序代码设计如下:package test.sample.dao;import java.sql.*;import java.util.ArrayList;import java.util.List;import test.sample.bean.Product;import test.sample.bean.ProductType;public class ProductDao {//提取商品数据,并转换为商品对象,存储到列表中public static List getProductList() throws Exception{Connection conn=DaoFactory.getConnection();try{Statement st = conn.createStatement();String sql="select * from Product";ResultSet rs = st.executeQuery(sql);List list=new ArrayList();while(rs.next()){Product p=new Product();p.setId(rs.getInt("ID"));p.setName(rs.getString("NAME"));p.setType(rs.getInt("TYPE"));p.setCountInBox(rs.getString("COUNT_IN_BOX"));p.setPrice(rs.getFloat("PRICE"));p.setStock(rs.getInt("STOCK"));list.add(p);}rs.close();st.close();return list;}finally{conn.close();}}//将一个商品对象插入到数据库public static Product InsertProduct(Product p) throws Exception{Connection conn=DaoFactory.getConnection();try{String sql="INSERT INTO Product(NAME,TYPE,COUNT_IN_BOX,PRICE,STOCK) VALUES(?,?,?,?,?)";PreparedStatement ps=conn.prepareStatement(sql);ps.setString(1,p.getName());ps.setInt(2,p.getType());ps.setString(3,p.getCountInBox());ps.setFloat(4,p.getPrice());ps.setInt(5,p.getStock());ps.executeUpdate();Statement st=conn.createStatement();ResultSet rs=st.executeQuery("select max(ID) from Product");rs.next();int id = rs.getInt(1);p.setId(id);rs.close();st.close();ps.close();return p;}finally{conn.close();}}//将一个商品对象插入到数据库public static Product updateProduct(Product p) throws Exception{Connection conn=DaoFactory.getConnection();try{String sql="UPDATE Product setNAME=?,TYPE=?,COUNT_IN_BOX=?,PRICE=?,STOCK=? where ID=?";PreparedStatement ps=conn.prepareStatement(sql);ps.setString(1,p.getName());ps.setInt(2,p.getType());ps.setString(3,p.getCountInBox());ps.setFloat(4,p.getPrice());ps.setInt(5,p.getStock());ps.setInt(6,p.getId());ps.executeUpdate();ps.close();return p;}finally{conn.close();}}//删除一个商品记录public static boolean deleteProduct(int id) throws Exception{Connection conn=DaoFactory.getConnection();try{String sql="delete from Product where ID="+id;Statement ps=conn.createStatement();boolean b = ps.execute(sql);ps.close();return b;}finally{conn.close();}}//获取商品类型数据,并转换为商品类型对象,存储到列表public static List getProductTypeList() throws Exception{Connection conn=DaoFactory.getConnection();try{Statement st = conn.createStatement();String sql="select * from ProductType";ResultSet rs = st.executeQuery(sql);List list=new ArrayList();while(rs.next()){ProductType pt=new ProductType();pt.setId(rs.getInt("TYPE_ID"));pt.setName(rs.getString("TYPE_NAME"));pt.setRemark(rs.getString("REMARK"));list.add(pt);}rs.close();st.close();return list;}finally{conn.close();}}}通过上面的代码我们可以看到,从ProductDao调用方法的对象不需要关系数据库,而只需要知道Product对象即可,无论我们如何修改“商品”数据的存储方法,都不会影响访问对象。

相关主题