CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
概述
其中,MVC(Model View Controller,模型-视图-控制器)如下:
-
Model层:是一个存取数据的对象或 JAVA POJO。一般包括业务逻辑层Service与数据访问层Dao。Service主要是用作将从Controller层获取的数据和数据库的数据进行桥接;Dao主要是用作对数据库操作的封装。
-
View层:是页面的显示,与用户进行交互。
-
Controller层:作用于模型和视图上。它控制数据流向Model层,并在数据变化时更新View层。它使Model层与View层分离开。
MVC的实现
基于 Java Web 与 MVC 的学生信息管理的 Web 应用例子:
其中,实现了对MySQL数据库的student表的增删改查。通过姓名可以进行模糊查询也可以直接点击查询全部学生信息;点击添加跳转到添加学生信息页面,学号自增,其他信息手动添加,错误添加将会在控制台进行反馈;点击修改跳转到修改学生信息页面,错误修改也会在控制台进行反馈;点击删除,弹出确认框再次确定便会删除。另外,管理员登录后期会进行实现,同时也会对其他页面进行简单的设计与美化。
工具包JDBC.utils
定义一个JDBCUtils类,数据库的连接:
package cn.edu.MVCcase.JDBC.utils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
//JDBC工具类
public class JDBCUtils {
//数据库连接池C3P0,需导入c3p0、mchange.jar包
private static DataSource dataSource = null;
//静态代码块
static {
//对应c3p0-config的named-config的name
dataSource = new ComboPooledDataSource("MySQL");
}
//数据库MySQL连接
public static Connection getCon() {
Connection con = null;
try {
con = dataSource.getConnection();
return con;
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//关闭数据库连接
public static void closeCon(Connection con) {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//回滚事务
public static void rollbackTransation(Connection con) {
if (con != null) {
try {
con.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试:
package cn.edu.MVCcase.Test.test;
import cn.edu.MVCcase.JDBC.utils.JDBCUtils;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
//数据库连接测试
public class JDBCutilsTest {
@Test
void TestGetCon () {
Connection con = JDBCUtils.getCon();
System.out.println(con);
}
}
Model层
- model包:用来对数据库每一张表都要有与之相映射
- dao包:用来实现对数据的操作
- service包:用来对(复杂)业务处理
model包
在 model包中,定义一个与数据库student表相映射的学生类Student:
package cn.edu.MVCcase.Model.model;
public class Student {
private int id ; //学号
private String name ; //姓名
private String sex ; //性别
private String grade ; //班级
private String telephone ; //手机号
public Student() {
super();
}
public Student(int id, String name, String sex, String grade, String telephone) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.grade = grade;
this.telephone = telephone;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", grade='" + grade + '\'' +
", telephone='" + telephone + '\'' +
'}';
}
}
dao包
在dao包中,首先,定义一个泛型CurrencyDao,通过类型参数来实现代码复用以提高代码的编写效率。
再定义一个接口StudentDao,声明一系列操作学生信息的方法:
package cn.edu.MVCcase.Model.dao;
import cn.edu.MVCcase.Model.model.Student;
import java.sql.Connection;
import java.util.List;
//接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现
//创建接口实现类,按 alt+enter
public interface StudentDao {
//添加学生信息的方法
public int Add(Student student);
//删除学生信息的方法
public int Delete(int id);
//修改学生信息的方法
public int Update(Student student);
//不支持事务,查询学生信息的方法,获取一条用户数据,封装成类Student的一个对象
public Student Select(int id);
//支持事务
public Student Select(Connection con,int id);
//查询学生全部信息的方法
public List<Student> List();
//获取指定学生姓名的条数
public long CountName(String name);
//通过姓名进行模糊查询
public List<Student> List(String name);
}
最后创建这个接口的实现类StudentDaoImpl:
package cn.edu.MVCcase.Model.dao;
import cn.edu.MVCcase.Model.model.Student;
import java.sql.Connection;
import java.util.List;
//StudentDao接口的实现类
//StudentDaoImpl实现类的测试类,按 alt+insert
public class StudentDaoImpl extends CurrencyDao<Student> implements StudentDao {
@Override
public int Add(Student student) {
String sql = "INSERT INTO `student` (`name`,`sex`,`grade`,`telephone`) VALUES (?,?,?,?);";
return super.TableOperation(sql,student.getName(),student.getSex(),student.getGrade(),student.getTelephone());
}
@Override
public int Delete(int id){
String sql = "DELETE FROM `student` WHERE `id`=?;";
return super.TableOperation(sql,id);
}
@Override
public int Update(Student student){
String sql = "UPDATE `student` SET `name`=?,`sex`=?,`grade`=?,`telephone`=? WHERE `id`=?;";
return super.TableOperation(sql,student.getName(),student.getSex(),student.getGrade(),student.getTelephone(),student.getId());
}
//不支持事务
@Override
public Student Select(int id) {
String sql = "SELECT `id`,`name`,`sex`,`grade`,`telephone` FROM `student` WHERE `id`=?;";
return super.getSelect(sql,id);
}
//支持事务
@Override
public Student Select(Connection con,int id) {
String sql = "SELECT `id`,`name`,`sex`,`grade`,`telephone` FROM `student` WHERE `id`=?;";
return super.getSelect(con,sql,id);
}
@Override
public List<Student> List() {
String sql = "SELECT `id`,`name`,`sex`,`grade`,`telephone` FROM `student`;";
return super.getList(sql);
}
@Override
public long CountName(String name){
String sql = "SELECT COUNT(`id`) FROM `student` WHERE `name`=?;";
return (int)super.getCount(sql,name);
}
@Override
public List<Student> List(String name) {
String sql = "SELECT `id`,`name`,`sex`,`grade`,`telephone` FROM `student` WHERE 1=1 ";
if(name != null && !"".equals(name)) {
sql = sql + " AND name like '%"+name+"%'"; //拼接成SQL语句,存在注入攻击风险(用户恶意注入特殊字符)
}
return super.getList(sql);
}
}
另外,定义一个类FactoryDao,解耦,降低模块间的依赖性,提高程序的独立性:
package cn.edu.MVCcase.Model.dao;
public class FactoryDao {
public static StudentDao getStudentDao() {
return new StudentDaoImpl();
}
}
service包
在service包中,首先,定义一个接口StudentService,然后,同样地,创建一个接口的实现类与定义一个类FactoryService。service层的方法相较于dao层的方法是在基础的操作上又增加了一层包装的,实现的是相对高级的操作。
package cn.edu.MVCcase.Model.service;
import cn.edu.MVCcase.Model.model.Student;
import java.util.List;
public interface StudentService {
//添加学生信息的方法
public int Add(Student student);
//删除学生信息的方法
public int Delete(int id);
//修改学生信息的方法
public int Update(Student student);
//不支持事务,查询学生信息的方法,获取一条用户数据,封装成类Student的一个对象
public Student Select(int id);
//支持事务
public Student SelectTransation(int id);
//查询学生全部信息的方法
public List<Student> List();
//获取指定学生姓名的条数
public long CountName(String name);
//通过姓名进行模糊查询
public List<Student> List(String name);
}
View层
- StudentDao.jsp:学生信息管理主页面
- StudentAdd.jsp:添加学生信息页面
- StudentUpdate.jsp:修改学生信息页面
Controller层
- StudentController:调用service来实现业务
数据库结构设计
- student表:学生信息,实现管理员对表信息增删改查功能
相关jar包
如图是需要用到的jar包,同时需要add to build path : File – Project Structure… – Libraies – 点击“加号” – Java – 选择好你项目中lib下的驱动jar包 – ok