SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发

手把手教你实战开发

在正式开发之前需要先搭建环境:请参考我的上一篇文章SpringBoot+JPA+mysql实现简单的增删改查(一)—Spring Boot入门

一、建立目录结构

首先创建以下目录结构,其中分别是:entity层,dao层、service层、serviceImpl实现层、Controller层。
SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第1张图片

二、文件配置及环境

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层。
比如:建立班级

  1. 建立实体层类TheClass.java
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进行数据库驱动,配置文件中设置了可以自动建表,所以数据库可以不用建表,运行程序的时候会自动在对应数据库中创建。

  1. 建立Dao层接口TheClass.java
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>{
}
  1. 建立Service层接口TheService.java
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);
}
  1. 建立ServiceImpl层类TheClassServiceImpl.java
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);
	}
}
  1. 建立Controller层TheClasscontroller.java
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下面。没有这个目录的话,可以手动建一个。
SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第2张图片
其中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这个入口文件就可以了哦)
SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第3张图片
一般出现如下显示而且没有报错的话则表示启动成功:

前端没有用框架,所以不是很好看,后面会继续完善前端的部分,毕竟界面美观还是很重要的,输入url地址:http://localhost:8888/schoolSystem/listClass
SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第4张图片

测试

  • 新增功能:输入班级号:106,班级名称:二年六班,点击提交
    SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第5张图片
    添加成功ok
    SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第6张图片
  • 修改功能:点击编辑,修改班级名称,点击提交保存。
    SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第7张图片
    修改成功ok
    SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第8张图片
    -删除功能:点击删除链接。
    SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第9张图片
    删除成功ok
    SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第10张图片
    以上这个demo还有很多不足之处,基本功能可以运行,新手可以利用这个来掌握SpringBoot+JPA技术栈和开发技巧。或许你会想问:为什么没有查询功能?哈哈哈,,,这个我后面有时间再更新。

ps:源码我上传到了github上,有兴趣的可以下载看看:https://github.com/AthenaHe/MyProject.git,觉得对你有帮助的话,请给我一个start呀,嘿嘿嘿
SpringBoot+JPA+mysql实现简单的增删改查(二)---实战开发_第11张图片

你可能感兴趣的:(项目)