一、概述:
MVC(Model View Controller)是软件工程中的一种 软件架构模式 ,它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时不需要重新编写业务逻辑。
M代表Model模型层,具体功能如下:
1.存放和数据库对应的实体类以及一些用于存储非数据库表完整相关的VO对象;
2.存放一些对数据进行逻辑运算操作的一些业务处理代码;
V代表view视图层,具体功能如下:
1.存放一些视图文件相关的代码,例如html、css以及js等;
2.在前后端分离的项目中,后端已经没有视图文件,该层次已经衍化成独立的前端项目;
C代表Controller控制层,具体功能如下:
1.接收客户端请求,获得请求数据;
2.将准备好的数据响应给客户端;
二、MVC模式下项目中的常见包:
M:
1.实体类包(pojo /entity /bean):专门存放和数据库对应的实体类和一些VO对象;
2.数据库访问包(dao/mapper):专门存放对数据库不同表格CURD方法封装的一些类;
3.服务包(service):专门存放对数据进行业务逻辑运算的一些类;
C:
控制层包(controller);
V:
1.web目录下的视图资源html、css、js、img等
2.前端工程化后,在后端项目中已经不存在了;
三、项目搭建:
项目结构:
1.数据库准备:创建schedule_system数据库并执行如下语句
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 8;
DROP TABLE IF EXISTS `sys_schedule`;
CREATE TABLE `sys_schedule`(
`sid` int NOT NULL AUTO_INCREMENT,
`uid` int NULL DEFAULT NULL,
`title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0908_ai_Ci NULL DEFAULT NULL,
`completed` int(1) NULL DEFAULT NULL,
PRIMARY KEY(`sid`)USING BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = Utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`(
`uid` int NOT NULL AUTO_INCREMENT
`username` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`user_pwd` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY(`uid`)USING BTREE,
UNIQUE INDEX `username`(`username`)USING BTREE
)ENGINE = InnoDB CHARACTER SET =utf8mb4 COLLATE=utf8mb4 0900_ai_ci ROW_FORMAT =Dynamic;
INSERT INTO `sys_user` VALUES(1,'zhangsan','e10adc3949ba59abbe56e057f20f883e');
INSERT INTO `sys_user` VALUES(2,'lisi','e10adc3949ba59abbe56e057f20f883e');
SET FOREIGN_KEY_CHECKS = 1;
2.pojo包处理:使用lombok处理getter、setter、equals、hashcode、构造器
lombok使用步骤:
(1)检查idea是否已经安装lombok插件
(2)检查是否勾选enable,annotation,processing
(3)导入lombok依赖,在实体类上添加注解
package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor//添加带有全部参数的构造器
@NoArgsConstructor//添加无参构造器
@Data//添加getter、setter、equals、hashcode
public class SysUser implements Serializable{
private Integer uid;
private String username;
private String userPwd;
}
package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SysSchedule implements Serializable{
private Integer sid;
private Integer uid;
private String title;
private Integer completed;
}
3.dao包的处理:dao类用于定义针对表格的CURD的方法
每张数据表都应该对应一个dao类,该dao类专门用于封装对该数据表的操作内容
(1).创建BaseDao对象
package com.atguigu.schedule.dao;
import com.atguigu.schedule.util.JDBCUtil;
import java.lang.reflect.Field;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class BaseDao{
//公共的查询方法 返回的是单个对象
public <T>T baseQueryObject(Class<T> clazz, String sql,Object ... args){
T t = null;
Connection connection = JDBCUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
int rows = 0;
try{
// 准备语句对象
preparedStatement = connection.prepareStatement(sql);
//设置语句上的参数
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i +1,args[i]);
}
// 执行 查询
resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
t = (T) resultSet.getobject(1);
}
}catch(Exception e){
e.printStackTrace();
}finally {
if(null != resultSet){
try{
resultSet.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(null != preparedStatement){
try{
preparedStatement.close();
}catch(SQLException e){
e.printStackTrace();
}
}
JDBCUtil.releaseConnection();
}
return t;
}
//公共的查询方法 返回的是对象的集合
public <T> List<T> baseQuery(Class clazz,String sql,Object ... args){
List<T> list =new ArrayList<>();
Connection connection = JDBCUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null:
int rows = 0;
try {
// 准备语句对象
preparedStatement = connection.prepareStatement(sql);
//设置语句上的参数
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i +1,args[i]);
}
// 执行 查询
resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
//将结果集通过反射封装成实体类对象
while(resultSet.next()){
//使用反射实例化对象
Object obj = clazz.getDeclaredConstructor().newInstance();
for(int i=1;i<=columnCount;i++){
String columnName = metaData.getColumnLabel(i);
Object value = resultSet.getObject(columnName);
//处理datetime类型字段和java.util.Data转换问题
if(value.getClass().equals(LocalDateTime.class)){
value = Timestamp.valueOf((LocalDateTime) value);
}
Field field=clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(obj,value);
}
list.add((T)obj);
}
} catch (Exception e){
e.printStackTrace();
}finally {
if(null != resultSet){
try{
resultSet.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(null != preparedStatement){
try{
preparedStatement.close();
}catch(SQLException e){
e.printStackTrace();
}
}
JDBCUtil.releaseConnection();
}
return list;
}
// 通用的增删改方法
public int baseUpdate(String sql,Object ... args){
//获取连接
Connection connection = JDBCUtil.getConnection();
PreparedStatement preparedStatement = null;
int rows =0;
try {
// 准备语句对象
preparedStatement=connection.prepareStatement(sql);
//设置语句上的参数
for(int i=0;i<args.length;i++){
preparedStatement.setObject(i+1,args[i]);
}
//执行 增删改executeUpdate
rows = preparedStatement.executeUpdate();
// 释放资源(可选)
}catch(SQLException e){
e.printStackTrace();
}finally{
if(null != preparedstatement){
try{
preparedStatement.close();
}catch(SQLException e){
throw new RuntimeException(e);
}
}
JDBCUtil.releaseConnection();
}
return rows;
}
}
(2).dao层所有接口:
package com.atguigu.schedule.dao;
public interface SysUserDao {
}
package com.atguigu.schedule.dao;
public interface SysScheduleDao{
}
(3).dao层所有实现类:
package com.atguigu.schedule.dao.impl;
importcom.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysUserDao;
public class SysUserDaoImpl extends BaseDao implements SysUserDao {
}
package com.atguigu.schedule.dao.impl;
import com.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysScheduleDao;
public class SysScheduleDaoImpl extends BaseDao implements SysScheduleDao{
}
4.service包处理
(1)接口:
package com.atguigu.schedule.service;
public interface SysUserService{
}
package com.atguigu.schedule.service;
public interface SysScheduleService{
}
(2)实现类:
package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.service.SysUserService;
public class SysUserServiceImpl implements SysUserService{
}
package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.service.SysScheduleService;
public class SysScheduleServiceImpl implements SysScheduleService{
}