MVC开发模式

1.1 定义

MVC指MVC模式的某种框架,它强制性地使应用程序的输入、处理和输出分开。

使用MVC应用程序被分成三个核心部件:模型、视图、控制器。

MVC开发模式_第1张图片

视图 V

视图是用户看到并与之交互的界面。对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet和Web services.

MVC好处是它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,只是作为一种输出数据并允许用户操纵的方式。 

模型 M

事务模型层,完成业务处理。模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。 

控制器 C

控制器接受用户的输入并调用模型和视图去完成用户的需求,所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。 

1.2 MVC架构的工作流程

首先我们需要去建立实体类(一般会建立一个entity层去集中放置实体类)去对对应数据库中的表,而实体类的不同属性就对应不同的表的不同列;比如说:数据库有个user表,字段有long类型的id,string类型的姓名,那么entity中的user类也必须是含有这两个字段的,且类型必须一致。不过数据库存的是long类型,user类里的属性是string类型。

然后是去写Dao层,Dao主要作用就是控制后端与数据库的交互连接,一般Dao层中放置的都是接口类;

接着就是写Service层,一般来说Service层会有接口类与其相对应的实现类,Service层中的接口类中一般会写一些操作方法,然后由其对应的实现类去具体实现;

最后再由Controller层注入对应的Service层接口对象,通过对应注解和路径来与前端进行交互数据。

MVC开发模式_第2张图片

 

 1.3 细节补充:

(一).DAO:

        1.DAO包设计规范:

DAO包是有DAO接口和DAO实现类和描述类组成,在开发中会多件一个包测试DAO包        

DAO的命名:
        公司域名倒写.项目名.DAO --> 主包
        例子:
           com.qfedu.项目名称.domain --> 存储到是domain文件
           com.qfedu.项目名称.dao    --> 存储dao的接口 -->封装了处理数据库的方法
           com.qfedu.项目名称.dao.impl --> 存储dao包下的实现类
           com.qfedu.项目名称.test     --> 存储的是测试文件 --> 项目开发完成必须删除

        2.DAO包的作用:

        在实际业务处理过程中,往往需要进行多次的数据库访问。这些访问的性质往往是相同的。采用Dao层可以对数据库访问进行封装,避免进行重复性的数据库访问开发操作。同时也降低了维护的成本。

        例如:张三给李四转账3000元,那么需要进行的操作如下:

        1.确认张三这个账户是否是存在的

         2.确认李四这个账户是否是存在的

        3.查询张三账户余额

        4.查询李四账户余额

        5.更新张三账户余额

        6.更新李四账户余额

        在这个例子中,就进行了多次的重复性的数据库访问,例如前两个操作,就是"select count (*) from account where name=?",这样会严重影响到开发效率。

(二).Service:

        Service层的作用:

1.封装的具体业务实现方法,来提高业务复用性

2.负责将参与本次业务实现的Dao层中事务进行管理

        不过其实有一个很有疑问的点就是Service层是不是可有可无,其实作为我个人观点来说的话,小型项目,业务逻辑不复杂的情况下,不用Service层其实并没有什么关系,毕竟Dao层实现了和数据库的交互,Controller层则实现了与前端的交互,这样已经基本打通了前后端,但是遇到大型项目的前提下,还是需要Service层去进行逻辑处理的,确实是需要分情况而言。

(三). Controller:

        即控制器的作用。

  (四).util:

        util是utiliy的缩写,意为多用途的,工具性质的包。

        这个中主要存放了:集合类(如ArrayList,HashMap等),随机数产生类,属性文件读取类,定时器类等类。这些类极大方便了Java编程,日常java编程中,经常要用到这些类。

        一个实例:数据库连接工具 DBUtil.java

        就是一个工具类,定义了关闭资源与事务处理的方法

package com.bjsxt.util;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


/**
 * JDBC的公共类
 * 
 * @author Administrator
 * 
 */
public class DBUtil {

	private static Connection conn = null;
	private static PreparedStatement pstmt = null;
	private static  ResultSet  rs=null;
	
	/**
	 * 创建一个连接
	 * @return
	 */
	public static Connection getConnection() {		
		try {
			
		    /*Class.forName("oracle.jdbc.driver.OracleDriver");
			// 获取连接
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "bjsxt", "bjsxt");*/
	 
			
			Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
			// 数据库连接池
			conn = DriverManager.getConnection("proxool.test");
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return conn;
	}

	/**
	 * 关闭数据库资源
	 * @param rs
	 * @param stmt
	 * @param conn
	 */
	public static void closeAll() {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (pstmt != null) {
				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 执行insert、update、delete 三个DML操作
	 * @param sql
	 * @param prams
	 * @return
	 */
	public static int executeUpdate(String sql, Object[] prams) {
		
		conn = getConnection();
		int n = 0;
		try {
			pstmt = conn.prepareStatement(sql);
			for (int i = 0; i < prams.length; i++) {
				pstmt.setObject(i + 1, prams[i]);
			}
			n = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return n;
	}
	/**
	 * 执行查询所返回的Resultset对象
	 **/
	
	public static ResultSet executeQuery (String sql, Object[] prams) {
		
		conn = getConnection();
		try {
			pstmt = conn.prepareStatement(sql);
			for (int i = 0; i < prams.length; i++) {
				pstmt.setObject(i + 1, prams[i]);
			}
			
			    rs = pstmt.executeQuery();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}	
}

 

 

你可能感兴趣的:(数据库实用技术,mvc,servlet,java)