《三層架構(gòu)是指哪三層》由會員分享,可在線閱讀,更多相關(guān)《三層架構(gòu)是指哪三層(8頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1. 三層架構(gòu)是指哪三層界面(視圖)層業(yè)務層數(shù)據(jù)訪問(持久層)
2. 為什么使用三層職責劃分清楚,各司其職,各層配合
例如:發(fā)現(xiàn)sql語句寫錯了,sql語句的定義一定在dao層上層如何將數(shù)據(jù)傳遞給下層
例如:數(shù)據(jù)從界面如何傳給業(yè)務數(shù)據(jù)如何從業(yè)務傳給dao
方法:要將數(shù)據(jù)傳給誰,就new誰的對象,然后用new出來的對象調(diào)用方法,數(shù)據(jù)作為方法參數(shù)傳遞下層如何將數(shù)據(jù)傳遞給上層
下層通過返回值將數(shù)據(jù)傳遞給上層各層中都寫什么代碼
2.1. 界面層界面層主要職責是輸入和輸出
2.2. 業(yè)務層是核心層
是核心層
編寫控制業(yè)務流程的代碼,通常是很多if語句來控制業(yè)務流程,例如:
業(yè)務:
2、用銀行卡取錢業(yè)務流程
1:判斷卡是否是銀行卡2:驗證卡號和密碼是否正確
3:驗證卡是否被凍結(jié)4:判斷余額是否夠用
5:是否跨行6:是否跨地區(qū)
7:開始取錢數(shù)據(jù)訪問層
2.2.1. Dao拼寫sql語句
1. 為sql語句的參數(shù)準備值發(fā)送sql和值到dbhelepr
Dao程序編寫的模板publicintsave(Useruser)throwsException{
Try{拼寫sql準備值調(diào)用dbhelpoer執(zhí)行sql
}catcha(Exceptione){異常處理,將異常拋出
}Finally{Dbheleper.close()
}}
2.2.2. dbHelper
3、執(zhí)行sql語句
3. 三層示例需求
1:實現(xiàn)添加商品2:商品的列表顯示
3.1. 準備開發(fā)環(huán)境6.2.1.數(shù)據(jù)庫環(huán)境
CREATEDATABASEthreelayer;USEthreelayer;
CREATETABLEproduct(
idINTAUTO_INCREMENTPRIMARYKEYproductNameVARCHAR(30),
priceDOUBLE);
6.2.2. Java環(huán)境同一個項目中,每個開發(fā)人員的各個環(huán)境的版本必須一致
1. Jdk的版本:1.8Eclipse的版本:Kepler
2. Jar包:
a) Mysql數(shù)據(jù)庫的驅(qū)動jar
b) Ju
4、nit的jarJlib^
色hamc『uwt-匸
.junit-4.11jar
芻mysqI-ccrinector-java-5.1.6-binjar創(chuàng)建java項目
項目命名為threelayer1126分包
:界面層:業(yè)務層:數(shù)據(jù)訪問層:實體類6.2.5.準備DBHelper(其實你可以拷貝)
packageedu.xbmu.threelayer.dao;importjava.io.File;
importjava.io.FileInputStream;importjava.io.IOException;
importjava.sql.Connection;importja
5、va.sql.DriverManager;
importjava.sql.PreparedStatement;importjava.sql.ResultSet;
importjava.sql.SQLException;importjava.util.Properties;
*該類的作用是執(zhí)行sql語句
*該類必須通用,通用是指對所有的表的sql語句都能夠執(zhí)行
*/publicclassDBHelper{
//定義屬性
privateConnectionconnection=null;
privatePreparedStatementstatement=null;
privat
6、eResultSetrs=null;
privatestaticStringURL="jdbc:mysql://localhost:3306/threelayer";
privatestaticStringUSER="root";
privatestaticStringPASS="root";〃硬編碼
//靜態(tài)塊加載驅(qū)動,只加載一次
static{try{
Class.forName("com.mysql.jdbc.Driver");}catch(ClassNotFoundExceptione){
e.printStackTrace();}
}
〃加載數(shù)據(jù)庫的配置文件stat
7、ic{try{
Filefile=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){
(”數(shù)據(jù)庫配置
8、文件加載失敗,請停止所有的操作,檢查數(shù)據(jù)庫配置文件");}
}
*初始化連接對象
*/
privatevoidinitConnection(){
try{if(connection==null||connection.isClosed()==true){connection=DriverManager.getConnection(URL,USER,PASS);}
}catch(SQLExceptione){e.printStackTrace();
}
}
〃sql=insertintouser(username,userpass)values(?,?)//values=["a
9、dmin","123"]
/**
*執(zhí)行添加,刪除,修改的語句
* @paramsql被執(zhí)行的sql語句
* @paramvaluessql語句中占位符的值
* @return返回影響的行數(shù)
* @throwsSQLException
*/
publicintexecuteUpdate(Stringsql,Object...values)throwsSQLException{//創(chuàng)建連接對象
initConnection();//創(chuàng)建執(zhí)行sql語句的對象
statement=connection.prepareStatement(sql);//為sql語句占位符賦值
se
10、tParameter(values);//執(zhí)行sql語句
returnstatement.executeUpdate();
}
publicResultSetexecuteQuery(Stringsql,Object...values)throwsSQLException{//連接數(shù)據(jù)庫
initConnection();//創(chuàng)建執(zhí)行sql語句對象
statement=connection.prepareStatement(sql);//為占位符賦值
setParameter(values);rs=statement.executeQuery();
}
*
*/
retur
11、nrs;為占位符賦值
privatevoidsetParameter(Object...values)throwsSQLException{if(values!=null&&values.length>0){
for(inti=0;i
12、ntStackTrace();}
rs=null;}
if(statement!=null){try{
statement.close();}catch(SQLExceptione){e.printStackTrace();}
}if(connection!=null){try{
connection.close();}catch(SQLExceptione){e.printStackTrace();
}}
}}
6.3.需求1:添加商品6.3.1.開發(fā)實體類
3 importo.Serializable;
4
4 pubileclassProductModelimple
13、mentsSerializablefprivateintid;
privateStrinRprodu匚tNarne;privatedoubleprice;
6?3?2?開發(fā)界面層在view包中創(chuàng)建表示界面的類,命名為Productview
privatestaticvoidsave(){
〃1:界面輸入數(shù)據(jù)
System.out.println(”請輸入商品名稱”);
StringproductName=in.next();
System.out.println(”請輸入商品價格”);
doubleprice=in.nextDouble();〃2:對數(shù)據(jù)進行驗證
if(pri
14、ce<0){System.out.println(”商品價格不允許小于0");
System.out.println(”商品添加失敗”);return;II表示該方法停止運行,返回到調(diào)用者
}II3:將數(shù)據(jù)封裝到實體對象中
ProductModelproductModel=newProductModel();productModel.setProductName(productName);productModel.setPrice(price);II4:將數(shù)據(jù)傳遞給業(yè)務層
Productserviceproductservice=newProductService();inti=0;
15、
try{i=productService.save(productModel);
"保存商品出錯"+e);
"商品添加成功”);
"商品添加失敗”);
}catch(Exceptione){System.out.println(}
II5:顯示業(yè)務返回的結(jié)果if(i>0){System.out.println(
}else{
System.out.println(}6.3.3.開發(fā)業(yè)務層
publicclassProductService{
newProductDao();
privateProductDaoproductDao
II定義添加商品業(yè)務的方法
publi
16、cintsave(ProductModelproductModel)throwsException{II保存商品沒有業(yè)務流程,因此直接使用dao調(diào)用了save方法
returnproductDao.save(productModel);
}}
6.3.4. 開發(fā)dao層publicclassProductDao{
privateDBHelperhelper=newDBHelper();
//添加商品的dao
publicintsave(ProductModelproductModel)throwsException{intcount=0;
try{〃1:拼寫sql
String
17、sql="INSERTINTOproduct(productName,price)VALUES(?,?)";〃2:準備值
Object[]values=newObject[]{productModel.getProductName(),productModel.getPrice()};
〃3:調(diào)用dbhelper執(zhí)行count=helper.executeUpdate(sql,values);
}catch(Exceptionex){ex.printStackTrace();
throwex;}finally{
helper.close();}
returncount;
}}
18、6.3.5.單元測試publicclassProductTest{
ProductServiceproductService=null;
@BeforepublicvoidtearDown(){productService=newProductService();
}
@Test
publicvoidtestSave()throwsException{ProductModelproductModel=newProductModel();
productModel.setProductName("農(nóng)夫”);productModel.setPrice(3);
inti=product
19、service.save(productModel);Assert.assertEquals(1,i);
}需求2:查看所有的商品
6.4.1. 開發(fā)daopublicListfindAll()throwsException{
Listlist=newArrayList();try{
〃1:拼寫sqlStringsql="select*fromproduct";
〃2:準備值〃3:執(zhí)行
ResultSetrs=helper.executeQuery(sql);while(rs.next()){
P
20、roductModelproductModel=newProductModel();productModel.setld(rs.getlnt("id"));productModel.setProductName(rs.getString("productName"));
productModel.setPrice(rs.getDouble("price"));list.add(productModel);
}}catch(Exceptione){
e.printStackTrace();throwe;
}finally{helper.close();
}returnlist;
}6
21、?4?2?開發(fā)servicepublicListfindAII()throwsException{returnproductDao.findAII();
}6?4?3?開發(fā)視圖
privatestaticvoidfindAll(){//格式化貨幣
NumberFormatnf=NumberFormat.getCurrencylnstanee(Locale.CHINA);try{
Productserviceproductservice=newProductService();Listlist=productService.find
22、All();
System.
out.println(
"編號\t名稱\t價格");
if(list!=
null
&&list.size()>0){
for
(inti
=0;i