第1章进销存管理系统(Swing+SQLServer2000实现)ifs.remove(frameName):13);if (if.getDesktopPane()== null) (desktopPane.add(if)://将窗体添加到主窗体中jf.setVisible(true);//显示窗体1try (I/使窗体处于被选择状态jf.setSelected(true):)catch (PropertyVetoException e1)e1.printStackTrace0):1(4)编写getIFrameO方法,该方法负责创建指定名称的窗体对象,在方法中使用了Java的反射技术,调用不同窗体类的默认构造方法创建窗体对象。关键代码如下:例程08代码位置:光盘\TM\oIUXCManagerlsrclcom\zwUXCFrame.javaprivateJInternalFramegetiFrame(StringframeName)(//获取内部窗体的唯一实例对象JInternalFrame jf = null;if(lifs.containsKey(frameName)(try (Class fClass=Class.forName("internalFrame."+frameName);Constructorconstructor=fClass.getConstructor(null)jf=(JInternalFrame)constructor.newlnstance(null):ifs.put(frameName, jf); catch (Exception e)(e.printStackTrace():1Jelsejf=ifs.get(frameName);return jf:1.6公共模块设计在本系统的项目空间中,有部分模块是公用的,或者是多个模块甚至整个系统的配置信息,它们被多个模块重复调用完成指定的业务逻辑,本节将这些公共模块提出来作单独介绍。1.6.1编写Dao公共类Dao类主要负责有关数据库的操作,该类在静态代码段中驱动并连接数据库,然后将所有的数据库访问方法定义为静态的。本节将介绍Dao类中有关数据库操作的关键方法。Dao类的定义代码如下:L
第 1 章 进销存管理系统(Swing+SQL Server 2000 实现) 19 ifs.remove(frameName); } }); if (jf.getDesktopPane() == null) { desktopPane.add(jf); //将窗体添加到主窗体中 jf.setVisible(true); //显示窗体 } try { jf.setSelected(true); //使窗体处于被选择状态 } catch (PropertyVetoException e1) { e1.printStackTrace(); } } } (4)编写 getIFrame()方法,该方法负责创建指定名称的窗体对象,在方法中使用了 Java 的反射 技术,调用不同窗体类的默认构造方法创建窗体对象。关键代码如下: 例程 08 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java private JInternalFrame getIFrame(String frameName) { //获取内部窗体的唯一实例对象 JInternalFrame jf = null; if (!ifs.containsKey(frameName)) { try { Class fClass = Class.forName("internalFrame." + frameName); Constructor constructor = fClass.getConstructor(null); jf = (JInternalFrame) constructor.newInstance(null); ifs.put(frameName, jf); } catch (Exception e) { e.printStackTrace(); } } else jf = ifs.get(frameName); return jf; } 1.6 公共模块设计 在本系统的项目空间中,有部分模块是公用的,或者是多个模块甚至整个系统的配置信息,它们 被多个模块重复调用完成指定的业务逻辑,本节将这些公共模块提出来作单独介绍。 1.6.1 编写 Dao 公共类 Dao 类主要负责有关数据库的操作,该类在静态代码段中驱动并连接数据库,然后将所有的数据库 访问方法定义为静态的。本节将介绍 Dao 类中有关数据库操作的关键方法。Dao 类的定义代码如下:
Java项目开发全程实录(第3版)例程09代码位置:光盘\TMo1VXCManagerlsrclcomzwldaolDao.javapublicclassDaof0protectedstaticStringdbClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver":?protected static StringdbUrl="jdbc:microsoft:sqlserver:/localhost:1433;"+"DatabaseName=db_JXC;SelectMethod=Cursor";?protected static String dbUser="sa";0protected static StringdbPwd="";protected static Stringsecond =null;?publicstaticConnectionconn=null;static (try (if (conn==null)(Class.forName(dbClassName).newinstanceO:I/加载数据库驱动类conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);/获取数据库连接)catch(Exceptionee)(ee.printStackTrace();M代码贴士0dbClassName:该成员变量用于定义数据库驱动类的名称。②dbUrl:该成员变量用于定义访问数据库的URL路径。③dbUser:该成员变量用于定义访问数据库的用户名称。③dbPwd:该成员变量用于定义访问数据库的用户密码。③conn:该成员变量用于定义连接数据库的对象。1.addGys()方法该方法用于添加供应商的基础信息,它接收供应商的实体类TbGysinfo作方法参数,然后把实体对象中的所有属性存入供应商数据表中。关键代码如下:例程10代码位置:光盘\TM\oIVXCManagerlsrclcomllzwldaolDao.javaI/添加供应商信息的方法public static boolean addGys(TbGysinfo gyslnfo) (I如果供应商实体对象为空if (gyslnfo ==null)1/则返回falsereturn false;return insert("inserttb_gysinfovalues("+gyslnfo.getld)+",I/执行供应商添加+gyslnfo.getName()+""+gysinfo.getJco)+"."+ gyslnfo.getAddress() +"" + gyslnfo.getBianma() +""+gyslnfo.getTel) +""+gyslnfo.getFax()+""+ gyslnfo.getLian() +"" + gyslnfo.getLtelO +","+ gyslnfo.getMail() +"," + gyslnfo.getYh() +")"):120
Java 项目开发全程实录(第 3 版) 20 例程 09 代码位置:光盘\TM\01\JXCManager\src\com\lzw\dao\Dao.java public class Dao { protected static String dbClassName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; protected static String dbUrl = "jdbc:microsoft:sqlserver://localhost:1433;" + "DatabaseName=db_JXC;SelectMethod=Cursor"; protected static String dbUser = "sa"; protected static String dbPwd = ""; protected static String second = null; public static Connection conn = null; static { try { if (conn == null) { Class.forName(dbClassName).newInstance(); //加载数据库驱动类 conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd); //获取数据库连接 } } catch (Exception ee) { ee.printStackTrace(); } } } 代码贴士 dbClassName:该成员变量用于定义数据库驱动类的名称。 dbUrl:该成员变量用于定义访问数据库的 URL 路径。 dbUser:该成员变量用于定义访问数据库的用户名称。 dbPwd:该成员变量用于定义访问数据库的用户密码。 conn:该成员变量用于定义连接数据库的对象。 1.addGys()方法 该方法用于添加供应商的基础信息,它接收供应商的实体类 TbGysinfo 作方法参数,然后把实体 对象中的所有属性存入供应商数据表中。关键代码如下: 例程 10 代码位置:光盘\TM\01\JXCManager\src\com\lzw\dao\Dao.java //添加供应商信息的方法 public static boolean addGys(TbGysinfo gysInfo) { if (gysInfo == null) //如果供应商实体对象为空 return false; //则返回 false return insert("insert tb_gysinfo values('" + gysInfo.getId() + "','" //执行供应商添加 + gysInfo.getName() + "','" + gysInfo.getJc() + "','" + gysInfo.getAddress() + "','" + gysInfo.getBianma() + "','" + gysInfo.getTel() + "','" + gysInfo.getFax() + "','" + gysInfo.getLian() + "','" + gysInfo.getLtel() + "','" + gysInfo.getMail() + "','" + gysInfo.getYh() + "')"); }
第1章进销存管理系统(Swing+SQLServer2000实现)白食2.getGyslnfo()方法该方法将根据Item对象中封装的供应商ID编号和供应商名称获取指定供应商的数据,并将该供应商的数据封装到实体对象中,然后返回该实体对象。关键代码如下:例程11代码位置:光盘\TM\o1UXCManagerlsrclcom\IzwldaolDao.java//读取指定供应商信息public static TbGysinfo getGysInfo(Item item)//默认的查询条件以供应商名称为主Stringwhere="name="+item.getName()+if (item.getld != null)I/如果Item对象中存有ID编号where ="id=" + item.getld() +"";//则以ID编号为查询条件TbGysinfoinfo=newTbGysinfo()ResultSet set=findForResultSet("select*fromtb_gysinfowhere"+where);tryif (set.next() (info.setld(set.getString("id").trim();//封装供应商数据到实体对象中info.setAddress(set.getString("address").trim();info.setBianma(set.getString("bianma").trim();info.setFax(set.getString("fax").trim();:info.setJc(set.getString("jc").trim():info.setLian(set.getString("lian").trim():info.setLtel(set.getString(ltel").trim()info.setMail(set.getString("mail").trim(0)info.setName(set.getString("name").trim();info.setTel(set.getString("tel").trim();info.setYh(set.getString("yh").trim()):1) catch (SQLException e)(e.printStackTrace();return info;返回供应商实体对象13.updateGys()方法该方法用于更新供应商的基础信息,它接收供应商的实体类TbGysinfo作方法参数,在方法中直接解析供应商实体对象中的属性,并将这些属性更新到数据表中。关键代码如下:例程12代码位置:光盘\TM\O1VXCManagerlsrclcom\lzwldaolDao.java1修改供应商信息的方法public static int updateGys(TbGysinfo gyslnfo) (returnupdate("updatetb_gysinfoset jc=""+gyslnfo.getJc()+",address="+gyslnfo.getAddress()+",bianma="+gyslnfo.getBianma() +",tel=" + gyslnfo.getTel0+"fax="+gyslnfo.getFax0 +",lian="+gyslnfo.getLian()+"Itel="+gyslnfo.getLtel()+",mail="+ gyslnfo.getMail() +",yh=" + gyslnfo.getYh()+"where id=" + gyslnfo.getld() +"");1
第 1 章 进销存管理系统(Swing+SQL Server 2000 实现) 21 2.getGysInfo()方法 该方法将根据 Item 对象中封装的供应商 ID 编号和供应商名称获取指定供应商的数据,并将该供 应商的数据封装到实体对象中,然后返回该实体对象。关键代码如下: 例程 11 代码位置:光盘\TM\01\JXCManager\src\com\lzw\dao\Dao.java //读取指定供应商信息 public static TbGysinfo getGysInfo(Item item) { String where = "name='" + item.getName() + "' "; //默认的查询条件以供应商名称为主 if (item.getId() != null) //如果 Item 对象中存有 ID 编号 where = "id='" + item.getId() + "' "; //则以 ID 编号为查询条件 TbGysinfo info = new TbGysinfo(); ResultSet set = findForResultSet("select * from tb_gysinfo where "+ where); try { if (set.next()) { info.setId(set.getString("id").trim()); //封装供应商数据到实体对象中 info.setAddress(set.getString("address").trim()); info.setBianma(set.getString("bianma").trim()); info.setFax(set.getString("fax").trim()); info.setJc(set.getString("jc").trim()); info.setLian(set.getString("lian").trim()); info.setLtel(set.getString("ltel").trim()); info.setMail(set.getString("mail").trim()); info.setName(set.getString("name").trim()); info.setTel(set.getString("tel").trim()); info.setYh(set.getString("yh").trim()); } } catch (SQLException e) { e.printStackTrace(); } return info; //返回供应商实体对象 } 3.updateGys()方法 该方法用于更新供应商的基础信息,它接收供应商的实体类 TbGysinfo 作方法参数,在方法中直 接解析供应商实体对象中的属性,并将这些属性更新到数据表中。关键代码如下: 例程 12 代码位置:光盘\TM\01\JXCManager\src\com\lzw\dao\Dao.java //修改供应商信息的方法 public static int updateGys(TbGysinfo gysInfo) { return update("update tb_gysinfo set jc='" + gysInfo.getJc() + "',address='" + gysInfo.getAddress() + "',bianma='" + gysInfo.getBianma() + "',tel='" + gysInfo.getTel() + "',fax='" + gysInfo.getFax() + "',lian='" + gysInfo.getLian() + "',ltel='" + gysInfo.getLtel() + "',mail='" + gysInfo.getMail() + "',yh='" + gysInfo.getYh() + "' where id='" + gysInfo.getId() + "'"); }
Java项目开发全程实录(第3版)4.insertRukulnfo()方法该方法负责完成入库单信息的添加,它涉及库存表、入库主表和入库详细表等多个数据表的操作。为保证数据的完整性,该方法将入库信息的添加操作放在事务中完成,方法将接收入库主表的实体类TbRukuMain作参数,该实体类中包含了入库详细表的引用。关键代码如下:例程13代码位置:光盘\TMoIVXCManagerlsrclcom\Izwldao\Dao.javapublic static boolean insertRukulnfo(TbRukuMain ruMain)(I在事务中添加入库信息try(0booleanautoCommit=conn.getAutoCommit();?I/取消自动提交模式conn.setAutoCommit(false);insert("insert into tb_ruku_main values(" + ruMain.getRkld()I添加入库主表记录+""+ruMain.getPzs()+""+ruMain.getJe()+""+ ruMain.getYsjlO) +"," + ruMain.getGysname() +",+ ruMain.getRkdate() +"," + ruMain.getCzyO) +""+ruMain.getJsrO+""+ruMain.getJsfs(+")");Set<TbRukuDetail>rkDetails=ruMain.getTabRukuDetails();for (Iterator<TbRukuDetail> iter=rkDetails.iterator(): iter.hasNext():)(TbRukuDetail details=iter.next():insert("insert intotb_ruku_detail values(+ruMain.getRkld()添加入库详细表记录+""+ details.getTabSpinfo( +""+ details.getDjo)+""+details.getSIO +")");Itemitem=newItem();item.setld(details.getTabSpinfo(O);TbSpinfosplnfo=getSplnfo(item);if (splnfo.getldO) != null && Isplnfo.getld().isEmpty() TbKucunkucun=getKucun(item):if (kucun.getld()==nulllkucun.getld().isEmptyO)(/添加或修改库存表记录insert("insertintotb kucunvalues("+splnfo.getld()+""+splnfo.getSpname()+""+splnfo.getJcO+""+splnfo.getCd()+""+splnfo.getGgO+""+splnfo.getBzO+""+splnfo.getDwo)+""+ details.getDjO +""+ details.getSlO +")"):Jelse (int sl=kucun.getKcslO)+details.getSIOupdate("update tb_kucun set kcsl=" + sl +",dj="+ details.getDjo) + " where id="+ kucun.getldo + "");11conn.commit();I/提交事务conn.setAutoCommit(autoCommit):I/恢复自动提交模式) catch(SQLExceptione)(try (Oconn.rollback():I如果出错,回退事务)catch(SQLExceptione1)e1.printStackTrace();1e.printStackTrace():1return true;122
Java 项目开发全程实录(第 3 版) 22 4.insertRukuInfo()方法 该方法负责完成入库单信息的添加,它涉及库存表、入库主表和入库详细表等多个数据表的操作。 为保证数据的完整性,该方法将入库信息的添加操作放在事务中完成,方法将接收入库主表的实体类 TbRukuMain 作参数,该实体类中包含了入库详细表的引用。关键代码如下: 例程 13 代码位置:光盘\TM\01\JXCManager\src\com\lzw\dao\Dao.java public static boolean insertRukuInfo(TbRukuMain ruMain) { //在事务中添加入库信息 try { boolean autoCommit = conn.getAutoCommit(); conn.setAutoCommit(false); //取消自动提交模式 insert("insert into tb_ruku_main values('" + ruMain.getRkId() //添加入库主表记录 + "','" + ruMain.getPzs() + "'," + ruMain.getJe() + ",'" + ruMain.getYsjl() + "','" + ruMain.getGysname() + "','" + ruMain.getRkdate() + "','" + ruMain.getCzy() + "','" + ruMain.getJsr() + "','" + ruMain.getJsfs() + "')"); Set<TbRukuDetail> rkDetails = ruMain.getTabRukuDetails(); for (Iterator<TbRukuDetail> iter = rkDetails.iterator(); iter.hasNext();) { TbRukuDetail details = iter.next(); insert("insert into tb_ruku_detail values('" + ruMain.getRkId() //添加入库详细表记录 + "','" + details.getTabSpinfo() + "'," + details.getDj() + "," + details.getSl() + ")"); Item item = new Item(); item.setId(details.getTabSpinfo()); TbSpinfo spInfo = getSpInfo(item); if (spInfo.getId() != null && !spInfo.getId().isEmpty()) { TbKucun kucun = getKucun(item); if (kucun.getId() == null || kucun.getId().isEmpty()) { //添加或修改库存表记录 insert("insert into tb_kucun values('" + spInfo.getId() + "','" + spInfo.getSpname() + "','"+ spInfo.getJc() + "','" + spInfo. getCd() + "','" + spInfo.getGg() + "','"+ spInfo.getBz() + "','" + spInfo.getDw() + "'," + details.getDj() + ","+ details.getSl() + ")"); } else { int sl = kucun.getKcsl() + details.getSl(); update("update tb_kucun set kcsl=" + sl + ",dj="+ details.getDj() + " where id='"+ kucun. getId() + "'"); } } } conn.commit(); //提交事务 conn.setAutoCommit(autoCommit); //恢复自动提交模式 } catch (SQLException e) { try { conn.rollback(); //如果出错,回退事务 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } return true; }
第1章进销存管理系统(Swing+SQLServer2000实现)代码贴士0getAutoCommitO:该方法用于获取事务的自动提交模式。②setAutoCommitO:该方法用于设置事务的自动提交模式。③commitO:该方法用于执行事务提交。rollbackO:该方法在事务执行失败时,执行回退操作。5.getKucun()方法该方法用于获取指定商品ID编号或名称的库存信息。方法接收一个Item对象作参数,该对象中封装了商品的ID编号和商品名称信息,如果库存表中存在该商品的库存记录,就获取该记录并将记录中的数据封装到库存表的实体对象中,然后将该实体对象作为方法的返回值。关键代码如下:例程14代码位置:光盘\TM\o1VXCManagerlsrclcom\lzwldao\Dao.javaI/获取库存商品信息public staticTbKucungetKucun(Item item)(Stringwhere="spname=""+item.getName()+"if (item.getld() != null)where ="id=" + item.getld() +";ResultSetrs=findForResultSet("select*fromtb_kucun where"+where);TbKucunkucun=newTbKucun();trytif (rs.next())(kucun.setld(rs.getString(id");kucun.setSpname(rs.getString("spname");kucun.setJc(rs.getString("jc"):kucun.setBz(rs.getString("bz"):kucun.setCd(rs.getString(cd");kucun.setDj(rs.getDouble("dj");kucun.setDw(rs.getString("dw");kucun.setGg(rs.getString("gg"):kucun.setKcsl(rs.getint("kcsl"):}catch(SQLExceptione)(e.printStackTrace():1returnkucun;11.6.2编写ltem类Item类是系统的公共类之一,主要用于封装和传递参数信息,这是典型命令模式的实现。在Dao类中经常使用该类作为方法参数,另外,在各个窗体界面中也经常使用该类作组件数据,其toStringO方法将返回name属性值,所以显示到各个组件上的内容就是Item类的对象所代表的商品、供应商或者客户等信息中的名称。定义该类的关键代码如下:
第 1 章 进销存管理系统(Swing+SQL Server 2000 实现) 23 代码贴士 getAutoCommit():该方法用于获取事务的自动提交模式。 setAutoCommit():该方法用于设置事务的自动提交模式。 commit():该方法用于执行事务提交。 rollback ():该方法在事务执行失败时,执行回退操作。 5.getKucun()方法 该方法用于获取指定商品 ID 编号或名称的库存信息。方法接收一个 Item 对象作参数,该对象中 封装了商品的 ID 编号和商品名称信息,如果库存表中存在该商品的库存记录,就获取该记录并将记 录中的数据封装到库存表的实体对象中,然后将该实体对象作为方法的返回值。关键代码如下: 例程 14 代码位置:光盘\TM\01\JXCManager\src\com\lzw\dao\Dao.java //获取库存商品信息 public static TbKucun getKucun(Item item) { String where = "spname='" + item.getName() + "'"; if (item.getId() != null) where = "id='" + item.getId() + "'"; ResultSet rs = findForResultSet("select * from tb_kucun where " + where); TbKucun kucun = new TbKucun(); try { if (rs.next()) { kucun.setId(rs.getString("id")); kucun.setSpname(rs.getString("spname")); kucun.setJc(rs.getString("jc")); kucun.setBz(rs.getString("bz")); kucun.setCd(rs.getString("cd")); kucun.setDj(rs.getDouble("dj")); kucun.setDw(rs.getString("dw")); kucun.setGg(rs.getString("gg")); kucun.setKcsl(rs.getInt("kcsl")); } } catch (SQLException e) { e.printStackTrace(); } return kucun; } 1.6.2 编写 Item 类 Item 类是系统的公共类之一,主要用于封装和传递参数信息,这是典型命令模式的实现。在 Dao 类中经常使用该类作为方法参数,另外,在各个窗体界面中也经常使用该类作组件数据,其 toString() 方法将返回 name 属性值,所以显示到各个组件上的内容就是 Item 类的对象所代表的商品、供应商或 者客户等信息中的名称。定义该类的关键代码如下: