Springboot+thymeleaf简单整合
Springboot+thymeleaf整合
简单功能实现(增删改查)
功能分析方法参考
https://www.cnblogs.com/djhzzl/p/14087746.html
源码:https://github.com/345404748/Demo-Employee
访问,代码运行实现效果:
http://localhost:8080/admin
点击查询
换部门查询
添加操作
删除操作
点击即进行删除
编辑操作
代码部分:
开发工具:IDEA 2019.2
数据库:Mysql 5.7
在Mysql中创建表
-
employee表
CREATE TABLE `employee` ( `employee_id` int(11) NOT NULL AUTO_INCREMENT, `employee_name` varchar(255) DEFAULT NULL, `employee_age` int(11) DEFAULT NULL, `department_id` int(11) DEFAULT NULL, PRIMARY KEY (`employee_id`) ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
-
department表
CREATE TABLE `department` ( `department_id` int(11) NOT NULL AUTO_INCREMENT, `department_name` varchar(255) DEFAULT NULL, PRIMARY KEY (`department_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
demo项目:
-
配置yml文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/employee?serverTimezone=UTC
username: root
password: admin
mybatis:
mapper-locations: mapper/*.xml
type-aliases-package: com.djh.demo.bean
-
配置pom文件
<?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.4.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.djh</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
实体类(pojo):
生成get\set方法、重写toString方法
-
Employee.class
package com.djh.demo.bean; /** * @author HP * @data 2020-12-04 */ public class Employee { private Integer employee_id; private String employee_name; private Integer employee_age; private Department department; public Integer getEmployee_id() { return employee_id; } public void setEmployee_id(Integer employee_id) { this.employee_id = employee_id; } public String getEmployee_name() { return employee_name; } public void setEmployee_name(String employee_name) { this.employee_name = employee_name; } public Integer getEmployee_age() { return employee_age; } public void setEmployee_age(Integer employee_age) { this.employee_age = employee_age; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } @Override public String toString() { return "Employee{" + "employee_id=" + employee_id + ", employee_name='" + employee_name + '\'' + ", employee_age=" + employee_age + '}'; } }
-
Department.class
package com.djh.demo.bean; import java.util.List; /** * @author HP * @data 2020-12-04 */ public class Department { private Integer department_id; private String department_name; private List<Employee> employees; public Integer getDepartment_id() { return department_id; } public void setDepartment_id(Integer department_id) { this.department_id = department_id; } public String getDepartment_name() { return department_name; } public void setDepartment_name(String department_name) { this.department_name = department_name; } public List<Employee> getEmployees() { return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } @Override public String toString() { return "Department{" + "department_id=" + department_id + ", department_name='" + department_name + '\'' + ", employees=" + employees + '}'; } }
resources/mapper(Mapper.xml)
编写sql语句,实现增删改查操作
-
Employee1Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.djh.demo.dao.EmployeeDao"> <resultMap id="employeeMap" type="com.djh.demo.bean.Employee"> <id property="employee_id" column ="employee_id" /> <result property="employee_name" column = "employee_name"/> <result property="employee_age" column = "employee_age"/> <association property="department" javaType="com.djh.demo.bean.Department"> <id property="department_id" column ="department_id" /> <result property="department_name" column="department_name"/> </association> </resultMap> <select id="selectid" resultMap="employeeMap"> SELECT e.employee_id, e.employee_name, e.employee_age, d.department_name, d.department_id FROM employee AS e INNER JOIN department AS d ON e.department_id = d.department_id WHERE e.employee_id = #{id} </select> <select id="selectById" resultType="com.djh.demo.bean.Employee"> select * from employee where department_id = #{id} </select> <insert id="saveEmployee"> insert into employee (employee_name, employee_age, department_id) value (#{employee_name},#{employee_age},#{department_id}) </insert> <delete id="deleteEmployee"> delete from employee where employee_id = #{employee_id} </delete> <update id="updateEmployee"> update employee set employee_name = #{employee_name}, employee_age = #{employee_age}, department_id = #{department_id} where employee_id = #{employee_id} </update> </mapper>
-
DepartmentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.djh.demo.dao.DepartmentDao"> <select id="getall" resultType="com.djh.demo.bean.Department"> select * from department </select> </mapper>
Dao层(Mapper)
接口
数据库操作
-
EmployeeDao
package com.djh.demo.dao; import com.djh.demo.bean.Employee; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; /** * @author HP * @data 2020-12-04 */ @Mapper public interface EmployeeDao { Employee selectid(Integer id); List<Employee> selectById( Integer id); void saveEmployee(@Param("employee_name") String employee_name,@Param("employee_age") String employee_age,@Param("department_id") Integer department_id); void deleteEmployee(Integer employee_id); void updateEmployee(@Param("employee_id") Integer employee_id,@Param("employee_name") String employee_name,@Param("employee_age") Integer employee_age,@Param("department_id") Integer department_id ); }
-
DepartmentDao
package com.djh.demo.dao; import com.djh.demo.bean.Department; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * @author HP * @data 2020-12-04 */ @Mapper public interface DepartmentDao { List<Department> getall (); }
Service层(Service)
-
Service(实现业务逻辑),面向接口编程 :接口类(多数面向dao)调用Dao方法、 实现类。
-
注解要写在实现类上 不能写到接口上,将这个类给spring管理。
Service接口
-
EmployeeService
package com.djh.demo.service; import com.djh.demo.bean.Employee; import java.util.List; /** * @author HP * @data 2020-12-04 */ public interface EmployeeService { List<Employee> selectById( Integer id); void saveEmployee ( String employee_name,String employee_age,Integer department_id); void deleteEmployee(Integer employee_id); void updateEmployee( Integer employee_id, String employee_name, Integer employee_age,Integer department_id ); }
-
DepartmentService
package com.djh.demo.service; import com.djh.demo.bean.Department; import java.util.List; /** * @author HP * @data 2020-12-04 */ public interface DepartmentService { List<Department> getall (); }
实现对应Service接口(lmpl)
-
EmployeeServicelmpl
package com.djh.demo.service.impl; import com.djh.demo.bean.Employee; import com.djh.demo.dao.EmployeeDao; import com.djh.demo.service.EmployeeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @author HP * @data 2020-12-04 * 实现类 * */ @Service public class EmployeeServiceImpl implements EmployeeService { @Autowired private EmployeeDao employeeDao; @Override public List<Employee> selectById(Integer id) { return this.employeeDao.selectById(id); } @Override public void saveEmployee(String employee_name, String employee_age, Integer department_id) { employeeDao.saveEmployee(employee_name,employee_age,department_id); } @Override public void deleteEmployee(Integer employee_id) { employeeDao.deleteEmployee(employee_id); } @Override public void updateEmployee(Integer employee_id, String employee_name, Integer employee_age ,Integer department_id ) { employeeDao.updateEmployee(employee_id,employee_name,employee_age,department_id ); } }
-
DepartmentServicelmpl
package com.djh.demo.service.impl; import com.djh.demo.bean.Department; import com.djh.demo.dao.DepartmentDao; import com.djh.demo.service.DepartmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @author HP * @data 2020-12-04 */ @Service("DepartmentService") public class DepartmentServicelmpl implements DepartmentService{ @Autowired DepartmentDao departmentDao; @Override public List<Department> getall() { return departmentDao.getall(); } }
Controller层
绑定数据、跳转页面、接受用户请求->将数据传到页面
-
EmployeeController
package com.djh.demo.controller; import com.djh.demo.bean.Department; import com.djh.demo.bean.Employee; import com.djh.demo.service.DepartmentService; import com.djh.demo.service.EmployeeService; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; /** * @author HP * @data 2020-12-04 */ @Controller public class EmployeeController { @Autowired private EmployeeService employeeService; @Autowired private DepartmentService departmentService; @GetMapping("/queryEmpByDept") public String queryEmpByDept (ModelMap modelMap,Integer department_id){ List<Employee> employees = employeeService.selectById(department_id); modelMap.put("employees",employees); modelMap.put("department_id",department_id); List<Department> departments = departmentService.getall(); modelMap.put("departments",departments); return "admin"; } @GetMapping("/saveEmployee") public String saveEmployee(ModelMap modelMap ,String employee_name , String employee_age , Integer department_id){ employeeService.saveEmployee(employee_name,employee_age,department_id); List<Department> departments = departmentService.getall(); modelMap.put("departments",departments); return "admin"; } @GetMapping("/deleteEmployee") public String deleteEmployee(Integer employee_id){ employeeService.deleteEmployee(employee_id); return "/admin"; } @GetMapping("/updateEmployee") public String updateEmployee(ModelMap modelMap,Integer employee_id , String employee_name , Integer employee_age ,Integer department_id ){ employeeService.updateEmployee(employee_id,employee_name,employee_age,department_id ); List<Department> departments = departmentService.getall(); modelMap.put("departments",departments); return "/admin"; } }
-
DepartmentController
package com.djh.demo.service.impl; import com.djh.demo.bean.Department; import com.djh.demo.dao.DepartmentDao; import com.djh.demo.service.DepartmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @author HP * @data 2020-12-04 */ @Service("DepartmentService") public class DepartmentServicelmpl implements DepartmentService{ @Autowired DepartmentDao departmentDao; @Override public List<Department> getall() { return departmentDao.getall(); } }
前端HTML界面
admin(后台界面)
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="queryEmpByDept"> <select name="department_id"> <!--/*@thymesVar id="department_id" type=""*/--> <option th:each="department: ${departments}" th:text="${department.department_name}" th:value="${department.department_id}" th:selected="${department.department_id}==${department_id}?true:false"></option> </select> <input type="submit" value="查询"> <a href="/toadd">添加</a> <a href="/toupdate">编辑</a> </form> <table border="1" cellpadding="0" cellspacing="0" width="500"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>操作</th> </tr> </thead> <tbody> <tr th:each="employee : ${employees}"> <td th:text="${employee .employee_id}"></td> <td th:text="${employee .employee_name}"></td> <td th:text="${employee .employee_age}"></td> <td> <a th:href="@{'deleteEmployee'+'?employee_id='+${employee.employee_id}}">删除</a> <a th:href="@{'updateEmployee'+'?employee_id='+${employee.employee_id}}"></a> </td> </tr> </tbody> </table> </body> </html>
add(增加界面)
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="saveEmployee"> 姓名:<input type="text" name="employee_name" id="employee_name"> <br/> 年龄:<input type="number" name="employee_age" id="employee_age"> <br/> 部门: <select name="department_id"> <option th:each="department : ${departments}" th:value="${department.department_id}" th:text="${department.department_name}"></option> </select><br/> <input type="submit" value="添加"> </form> </body> </html>
update(编辑界面)
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="updateEmployee"> 职员编号 :<input type="text" name="employee_id" id="employee_id"> <br/> 修改姓名 :<input type="text" name="employee_name" id="employee_name"> <br/> 修改年龄 :<input type="text" name="employee_age" id="employee_age"> <br/> 修改部门 : <select name="department_id"> <option th:each="department : ${departments}" th:value="${department.department_id}" th:text="${department.department_name}"></option> </select><br/> <input type="submit" value="修改"> </form> </body> </html>
项目中遇到的问题
1.问题:出现空指针问题,java空指针异常:java.lang.NullPointException
解决方法:实现类或其他类缺少标注@Autowired,接口不需要标注
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
2.问题:进行delete操作时,无法将前页的id数据,导入对应的方法(待完善)
解决办法:试了很多方法都不能解决,前后端数据交接过程存在问题,只能使用拼接url方法将id放入方法中,进行delete操作,使用拼接url可以完成删除操作。
<a th:href="@{'deleteEmployee'+'?employee_id='+${employee.employee_id}}">删除</a>
'deleteEmployee'为指定访问的控制器域名,employee.employee_id为传入的参数id,使用+拼接
3.让部门的下拉列表显示所查询的内容。保持不变
th:selected="${department.department_id}==${department_id}?true:false"
效果:
若不加,则会显示第一个部门名
项目问题解决及完善办法更新:https://www.cnblogs.com/djhzzl/p/14096824.html