三层架构是指哪三层
- 格式: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;