资源描述
1. 三层架构是指哪三层界面(视图)层业务层数据访问(持久层)2. 为什么使用三层职责划分清楚,各司其职,各层配合例如:发现sql语句写错了,sql语句的定义一定在dao层上层如何将数据传递给下层例如:数据从界面如何传给业务数据如何从业务传给dao方法:要将数据传给谁,就new谁的对象,然后用new出来的对象调用方法,数据作为方法参数传递下层如何将数据传递给上层下层通过返回值将数据传递给上层各层中都写什么代码2.1. 界面层界面层主要职责是输入和输出2.2. 业务层是核心层是核心层编写控制业务流程的代码,通常是很多if语句来控制业务流程,例如:业务:用银行卡取钱业务流程1:判断卡是否是银行卡2:验证卡号和密码是否正确3:验证卡是否被冻结4:判断余额是否够用5:是否跨行6:是否跨地区7:开始取钱数据访问层2.2.1. Dao拼写sql语句1. 为sql语句的参数准备值发送sql和值到dbheleprDao程序编写的模板publicintsave(Useruser)throwsExceptionTry拼写sql准备值调用dbhelpoer执行sqlcatcha(Exceptione)异常处理,将异常抛出FinallyDbheleper.close()2.2.2. dbHelper执行sql语句3. 三层示例需求1:实现添加商品2:商品的列表显示3.1. 准备开发环境6.2.1.数据库环境CREATEDATABASEthreelayer;USEthreelayer;CREATETABLEproduct(idINTAUTO_INCREMENTPRIMARYKEYproductNameVARCHAR(30),priceDOUBLE);6.2.2. Java环境同一个项目中,每个开发人员的各个环境的版本必须一致1. Jdk的版本:1.8Eclipse的版本:Kepler2. Jar包:a) Mysql数据库的驱动jarb) Junit的jarJlib色hamcuwt-匸.junit-4.11jar刍mysqI-ccrinector-java-5.1.6-binjar创建java项目项目命名为threelayer1126分包:界面层:业务层:数据访问层:实体类6.2.5.准备DBHelper(其实你可以拷贝)packageedu.xbmu.threelayer.dao;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.Properties;*该类的作用是执行sql语句*该类必须通用,通用是指对所有的表的sql语句都能够执行*/publicclassDBHelper/定义属性privateConnectionconnection=null;privatePreparedStatementstatement=null;privateResultSetrs=null;privatestaticStringURL=jdbc:mysql:/localhost:3306/threelayer;privatestaticStringUSER=root;privatestaticStringPASS=root;硬编码/静态块加载驱动,只加载一次statictryClass.forName(com.mysql.jdbc.Driver);catch(ClassNotFoundExceptione)e.printStackTrace();加载数据库的配置文件statictryFilefile=newFile(c:/db.properties);FileInputStreaminStream=newFileInputStream(file);/Properties是键值对的集合类,父接口是MapPropertiesprop=newProperties();prop.load(inStream);URL=(String)prop.get(url);USER=(String)prop.get(user);PASS=(String)prop.get(pass);catch(IOExceptione)(”数据库配置文件加载失败,请停止所有的操作,检查数据库配置文件);*初始化连接对象*/privatevoidinitConnection()tryif(connection=null|connection.isClosed()=true)connection=DriverManager.getConnection(URL,USER,PASS);catch(SQLExceptione)e.printStackTrace();sql=insertintouser(username,userpass)values(?,?)/values=admin,123/*执行添加,删除,修改的语句* paramsql被执行的sql语句* paramvaluessql语句中占位符的值* return返回影响的行数* throwsSQLException*/publicintexecuteUpdate(Stringsql,Object.values)throwsSQLException/创建连接对象initConnection();/创建执行sql语句的对象statement=connection.prepareStatement(sql);/为sql语句占位符赋值setParameter(values);/执行sql语句returnstatement.executeUpdate();publicResultSetexecuteQuery(Stringsql,Object.values)throwsSQLException/连接数据库initConnection();/创建执行sql语句对象statement=connection.prepareStatement(sql);/为占位符赋值setParameter(values);rs=statement.executeQuery();*/returnrs;为占位符赋值privatevoidsetParameter(Object.values)throwsSQLExceptionif(values!=null&values.length0)for(inti=0;ivalues.length;i+)statement.setObject(i+1,values);/*/*/关闭数据库publicvoidclose()/关闭库if(rs!=null)tryrs.close();catch(SQLExceptione)e.printStackTrace();rs=null;if(statement!=null)trystatement.close();catch(SQLExceptione)e.printStackTrace();if(connection!=null)tryconnection.close();catch(SQLExceptione)e.printStackTrace();6.3.需求1:添加商品6.3.1.开发实体类3 importo.Serializable;44 pubileclassProductModelimplementsSerializablefprivateintid;privateStrinRprodu匚tNarne;privatedoubleprice;632开发界面层在view包中创建表示界面的类,命名为Productviewprivatestaticvoidsave()1:界面输入数据System.out.println(”请输入商品名称”);StringproductName=in.next();System.out.println(”请输入商品价格”);doubleprice=in.nextDouble();2:对数据进行验证if(price0)System.out.println(elseSystem.out.println(6.3.3.开发业务层publicclassProductServicenewProductDao();privateProductDaoproductDaoII定义添加商品业务的方法publicintsave(ProductModelproductModel)throwsExceptionII保存商品没有业务流程,因此直接使用dao调用了save方法returnproductDao.save(productModel);6.3.4. 开发dao层publicclassProductDaoprivateDBHelperhelper=newDBHelper();/添加商品的daopublicintsave(ProductModelproductModel)throwsExceptionintcount=0;try1:拼写sqlStringsql=INSERTINTOproduct(productName,price)VALUES(?,?);2:准备值Objectvalues=newObjectproductModel.getProductName(),productModel.getPrice();3:调用dbhelper执行count=helper.executeUpdate(sql,values);catch(Exceptionex)ex.printStackTrace();throwex;finallyhelper.close();returncount;6.3.5.单元测试publicclassProductTestProductServiceproductService=null;BeforepublicvoidtearDown()productService=newProductService();TestpublicvoidtestSave()throwsExceptionProductModelproductModel=newProductModel();productModel.setProductName(农夫”);productModel.setPrice(3);inti=productservice.save(productModel);Assert.assertEquals(1,i);需求2:查看所有的商品6.4.1. 开发daopublicListfindAll()throwsExceptionListlist=newArrayList();try1:拼写sqlStringsql=select*fromproduct;2:准备值3:执行ResultSetrs=helper.executeQuery(sql);while(rs.next()ProductModelproductModel=newProductModel();productModel.setld(rs.getlnt(id);productModel.setProductName(rs.getString(productName);productModel.setPrice(rs.getDouble(price);list.add(productModel);catch(Exceptione)e.printStackTrace();throwe;finallyhelper.close();returnlist;642开发servicepublicListfindAII()throwsExceptionreturnproductDao.findAII();643开发视图privatestaticvoidfindAll()/格式化货币NumberFormatnf=NumberFormat.getCurrencylnstanee(Locale.CHINA);tryProductserviceproductservice=newProductService();Listlist=productService.findAll();System.out.println(编号t名称t价格);if(list!=null&list.size()0)for(inti=0;ilist.size();i+)System.out.print(list.get(i).getld();System.out.print(t);System.out.print(list.get(i).getProductName();System.out.print(t);System.out.println(nf.format(list.get(i).getPrice();catch(Exceptione)e.printStackTrace();6.4.4.单元测试
展开阅读全文