在正式开发之前需要先搭建环境:请参考我的上一篇文章SpringBoot+JPA+mysql实现简单的增删改查(一)—Spring Boot入门
首先创建以下目录结构,其中分别是:entity层,dao层、service层、serviceImpl实现层、Controller层。
application.properties
#设置访问页面的前缀
spring.mvc.view.prefix=/WEB-INF/
#设置访问页面的后缀
spring.mvc.view.suffix=.jsp
##Mysql数据源各种配置
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=12345678
spring.datasource.initialSize=20
spring.datasource.minIdle=50
spring.datasource.maxActive=500
##项目端口配置
#配置服务器访问端口
server.port=8888
#配置url的访问路径
server.servlet.context-path=/schoolSystem
#jpa
#如果spring.jpa.properties.hibernate.hbm2ddl.auto设置为update,会自动更新数据表结构比如Entity中增加成员变量,数据表中也会增加相应的字段,但是需要注意的是,如果删除一个成员变量,这时数据表中不会自动删除对应的字段,如果删除的那个成员变量在数据表中被设置为not null,当再次运行时就会报错
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#熟悉mysql的都知道,myisam引擎并不支持事务,只有innodb引擎才支持事务的处理。由于jpa默认是myisam引擎,配置jpa自动建表为innodb
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#设置为true可以运行时输出SQL语句
spring.jpa.show-sql= true
#设置为true可以解决jpa或hibernate的延迟加载问题
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hh</groupId>
<artifactId>School</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>School</name>
<description>Demo project for School Management System</description>
<properties>
<java.version>11</java.version>
<!-- <java-jar-plugin.version>3.1.1</java-jar-plugin.version>-->
</properties>
<dependencies>
<!-- pom.xml 文件中默认有两个模块:
spring-boot-starter :核心模块,包括自动配置支持、日志和 YAML,如果引入了 spring-boot-starter-web web 模块可以去掉此配置,因为 spring-boot-starter-web 自动依赖了 spring-boot-starter。
spring-boot-starter-test :测试模块,包括 JUnit、Hamcrest、Mockito。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- pom.xml中添加支持web的模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat的支持.-->
<!-- 添加如下包对JSP进行编译 包tomcat-embed-jasper被标记为已提供(provided),
因此表明我们希望JDK或容器在运行时提供依赖项,该作用域仅在编译和测试类路径上可用,并且不可传递-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provide</scope>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version><!--$NO-MVN-MAN-VER$--><!-- 我装的是8.0.19版本-->
</dependency>
<!-- jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
补充:我们在进行开发过程中可能会出现反复修改代码的情况,那么如何在修改代码后不重启就能够生效呢,这时候需要进行我们的热部署。spring-boot-devtools 模块也支持应用快速重启(restart)。所以在pom.xml文件中可加入以下依赖
<!--快速应用重启(修改代码后不重启就能生效)热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
三、依次写entity实体层->Dao层->Service层->ServiceImpl层->controller层。
比如:建立班级
package com.hh.School.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author hehuan
* @date 2020年5月1日下午12:09:04
*/
@Entity
@Table(name = "class")
public class TheClass {
@Id
@Column(name = "classid")
//表示mysql主键自增策略:@GeneratedValue(strategy = GenerationType.IDENTITY)
//表示oracle主键自增策略:@GeneratedValue(strategy = GenerationType.AUTO)
private int classid;
@Column(name = "classname",length = 20)
private String classname;
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
}
ps:由于使用JPA进行数据库驱动,配置文件中设置了可以自动建表,所以数据库可以不用建表,运行程序的时候会自动在对应数据库中创建。
package com.hh.School.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.hh.School.entity.TheClass;
/**
* @author hehuan
* @date 2020年5月1日下午3:57:29
*/
@Repository
public interface TheClassDao extends JpaRepository<TheClass, Integer>{
}
package com.hh.School.service;
import java.util.List;
import com.hh.School.entity.TheClass;
/**
* @author hehuan
* @date 2020年5月1日下午4:00:19
*/
public interface TheClassService {
//保存
TheClass saveTheClass(TheClass theClass);
//更新
TheClass updateTheClass(TheClass theClass);
//删除
void deleteTheClass(TheClass theClass);
//查询所有
List<TheClass> findAll();
//根据主键查询
TheClass findByIDbyJPA(int classid);
}
package com.hh.School.serviceImpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hh.School.dao.TheClassDao;
import com.hh.School.entity.TheClass;
import com.hh.School.service.TheClassService;
/**
* @author hehuan
* @date 2020年5月1日下午4:02:48
*/
@Service
public class TheClassServiceImpl implements TheClassService{
@Autowired
private TheClassDao theClassDao;
@Override
public TheClass saveTheClass(TheClass theClass) {
return theClassDao.save(theClass);
}
@Override
public TheClass updateTheClass(TheClass theClass) {
return theClassDao.save(theClass);
}
@Override
public void deleteTheClass(TheClass theClass) {
theClassDao.delete(theClass);
}
@Override
public List<TheClass> findAll() {
return theClassDao.findAll();
}
@Override
public TheClass findByIDbyJPA(int id) {
return theClassDao.getOne(id);
}
}
package com.hh.School.Controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hh.School.entity.TheClass;
import com.hh.School.service.TheClassService;
/**
* @author hehuan
* @date 2020年5月1日下午4:10:42
*/
@Controller
public class TheClassController {
@Autowired
private TheClassService theClassService;
//查询所有
@RequestMapping("/listClass")
public String listClass(Model model) throws Exception{
List<TheClass> list=theClassService.findAll();
model.addAttribute("lists", list);
return "listClass";
}
//添加班级
@RequestMapping("/addClass")
public String addClass(TheClass theClass) throws Exception{
theClassService.saveTheClass(theClass);
return "redirect:listClass";
}
//删除班级
@RequestMapping("/deleteClass")
public String deleteClass(TheClass theClass) throws Exception {
theClassService.deleteTheClass(theClass);
return "redirect:listClass";
}
//修改班级
@RequestMapping("/updateClass")
public String updateClass(TheClass theClass) throws Exception {
theClassService.saveTheClass(theClass);
return "redirect:listClass";
}
//编辑班级
@RequestMapping("/editClass")
public String editClass(int classid,Model model) throws Exception {
TheClass s=theClassService.findByIDbyJPA(classid);
model.addAttribute("c", s);
return "editClass";
}
}
好了,后端部分就写好了。接下来写前端页面,用的jsp
我的jsp页面主要放在src/main/webapp/WEB-INF下面。没有这个目录的话,可以手动建一个。
其中listClass.jsp和editClass.jsp主要是对班级的增加、修改、删除操作展示。
listClass.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>班级号</td>
<td>班级名称</td>
<td>编辑</td>
<td>删除</td>
</tr>
<c:forEach items="${lists}" var="c" varStatus="st">
<tr>
<td>${c.classid}</td>
<td>${c.classname}</td>
<td><a href="editClass?classid=${c.classid}">编辑</a></td>
<td><a href="deleteClass?classid=${c.classid}">删除</a></td>
</tr>
</c:forEach>
新增:
<form action="addClass" method="post">
班级号:<input name="classid" > <br>
班级名称: <input name="classname"> <br>
<button type="submit">提交</button>
</form>
</table>
editClass.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<div style="margin:0px auto; width:500px">
<form action="updateClass" method="post">
班级号:<input name="classid" value="${c.classid}"><br>
班级名称:<input name="classname" value="${c.classname}"> <br>
<button type="submit">提交</button>
</form>
</div>
运行项目(直接执行Application.java这个入口文件就可以了哦)
一般出现如下显示而且没有报错的话则表示启动成功:
前端没有用框架,所以不是很好看,后面会继续完善前端的部分,毕竟界面美观还是很重要的,输入url地址:http://localhost:8888/schoolSystem/listClass
ps:源码我上传到了github上,有兴趣的可以下载看看:https://github.com/AthenaHe/MyProject.git,觉得对你有帮助的话,请给我一个start呀,嘿嘿嘿