三层架构是指哪三层

  • 格式:docx
  • 大小:40.24 KB
  • 文档页数:11

1. 三层架构是指哪三层

界面(视图)层

业务层

数据访问(持久层)

2. 为什么使用三层

职责划分清楚,各司其职,各层配合

例如:发现sql语句写错了,sql语句的定义一定在dao层

3. 上层如何将数据传递给下层

例如:数据从界面如何传给业务

数据如何从业务传给dao

方法:要将数据传给谁,就new谁的对象,然后用new出来的对象调用方法,数据作为方法参数传递

4. 下层如何将数据传递给上层

下层通过返回值将数据传递给上层

5. 各层中都写什么代码

5.1. 界面层

界面层主要职责是输入和输出 5.2. 业务层

编写控制业务流程的代码,通常是很多if语句来控制业务流程,是核心层

例如:

业务:用银行卡取钱

业务流程

1:判断卡是否是银行卡

2:验证卡号和密码是否正确

3:验证卡是否被冻结

4:判断余额是否够用

5:是否跨行

6:是否跨地区

7:开始取钱

5.3. 数据访问层

5.3.1. Dao

1. 拼写sql语句

2. 为sql语句的参数准备值

3. 发送sql和值到dbhelepr

Dao程序编写的模板

public int save(User user) throws Exception{

Try{

拼写sql

准备值

调用dbhelpoer执行sql

}catcha(Exception e){

异常处理,将异常抛出

}Finally{

Dbheleper.close()

}

}

5.3.2. dbHelper

执行sql语句

6. 三层示例

6.1. 需求

1:实现添加商品

2:商品的列表显示

6.2. 准备开发环境

6.2.1. 数据库环境

CREATE DATABASE threelayer;

USE threelayer;

CREATE TABLE product

(

id INT AUTO_INCREMENT PRIMARY KEY,

productName VARCHAR(30),

price DOUBLE

);

6.2.2. Java环境

同一个项目中,每个开发人员的各个环境的版本必须一致

1. Jdk的版本:1.8

2. Eclipse的版本:Kepler

3. Jar包:

a) Mysql数据库的驱动jar

b) Junit的jar

6.2.3. 创建java项目

项目命名为threelayer1126

6.2.4. 分包

edu.xbmu.threelayer.view :界面层

edu.xbmu.threelayer.service :业务层

edu.xbmu.threelayer.dao :数据访问层

edu.xbmu.threelayer.pojo :实体类

6.2.5. 准备DBHelper(其实你可以拷贝)

package edu.xbmu.threelayer.dao;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Properties;

/**

* 该类的作用是执行sql语句

* 该类必须通用,通用是指对所有的表的sql语句都能够执行

*/

public class DBHelper {

//定义属性

private Connection connection = null;

private PreparedStatement statement =null;

private ResultSet rs = null;

private static String URL="jdbc:mysql://localhost:3306/threelayer";

private static String USER="root";

private static String PASS="root";//硬编码

//静态块加载驱动,只加载一次

static{ try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

//加载数据库的配置文件

static{

try {

File file =new File("c:/db.properties");

FileInputStream inStream =new FileInputStream(file);

//Properties是键值对的集合类,父接口是Map

Properties prop = new Properties();

prop.load(inStream);

URL = (String)prop.get("url");

USER = (String)prop.get("user");

PASS = (String)prop.get("pass");

} catch (IOException e) {

System.out.println("数据库配置文件加载失败,请停止所有的操作,检查数据库配置文件");

}

}

/**

* 初始化连接对象

*/

private void initConnection(){

try {

if(connection==null || connection.isClosed()==true){

connection = DriverManager.getConnection(URL,USER,PASS);

}

} catch (SQLException e) {

e.printStackTrace();

}

}

//sql=insert into user(username,userpass)values(?,?)

//values=["admin","123"]

/**

* 执行添加,删除,修改的语句

* @param sql 被执行的sql语句

* @param values sql语句中占位符的值

* @return 返回影响的行数

* @throws SQLException */

public int executeUpdate(String sql,Object ...values) throws SQLException{

//创建连接对象

initConnection();

//创建执行sql语句的对象

statement = connection.prepareStatement(sql);

//为sql语句占位符赋值

setParameter(values);

//执行sql语句

return statement.executeUpdate();

}

public ResultSet executeQuery(String sql,Object ...values) throws SQLException{

//连接数据库

initConnection();

//创建执行sql语句对象

statement= connection.prepareStatement(sql);

//为占位符赋值

setParameter(values);

rs = statement.executeQuery();

return rs;

}

/**

* 为占位符赋值

*/

private void setParameter(Object ...values) throws SQLException{

if(values!=null && values.length>0){

for (int i = 0; i < values.length; i++) {

statement.setObject(i+1, values[i]);

}

}

}

/**

* 关闭数据库

*/

public void close(){

//关闭库

if(rs!=null){

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

}

rs = null;