一、寫在前面
Hello,你好呀,我是灰小猿,一個超會寫BUG的程式猿🙊!
近期在學習springboot框架相關的內容,相比于SSM,SpringBoot最大的特點就是集成了Spring和SpringMVC,讓之前繁瑣的配置作業變得更加簡潔,同時對于業務邏輯層的處理也更加的友好,
所以今天就使用SpringBoot整合MyBatis來做一個完整的員工管理系統,實作登錄驗證、國家化、CRUD等操作,帶大家熟悉一下SpringBoot的操作流程,以及整合MyBatis的具體步驟,整個專案你將會學到SpringBoot框架、mybatis框架、BootStrap框架、thymleaf、Lombok插件等技術!
小伙伴們一鍵三連?關注!灰小猿帶你上高速啦🎉🎉🎉!
先看一個效果視頻:
基于springboot+mybatis的員工管理系統
使用springboot+mybatis進行專案開發,我簡單的給大家劃分了幾個步驟,平常的開發我們只需要按照這個程序進行就可以了,
SpringBoot整合Mybatis基本步驟
- 搭建springboot環境
- 進行配置處理
- 在pom.xml中引入所需依賴
- 配置application
- 進行前端頁面布局
- 引入資料源
- 配置mybatis操作
二、進行專案配置
(1)引入pom.xml配置
雖然springboot大大的簡化的配置的程序,但是不代表所有的配置都可以由springboot自動完成,所以,當我們需要使用其他相關依賴的時候(如thymleaf、lombok),同樣需要在pom.xml中引入相應的配置依賴,
在這個專案中我們需要引入的依賴有
Mybatis依賴
<!--mybatis依賴-->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
資料庫驅動
<!--資料庫驅動-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
<scope>runtime</scope>
</dependency>
LomBok依賴
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
Thymleaf依賴
<!--thymleaf 基于3.x開發-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
(2)、配置application
當我們在對專案進行操作的時候,一般需要引入或修改一些springboot的默認配置,方便我們的開發使用,springboot的組態檔可以是properties后綴,也可以是ymal后綴,我這里使用的properties后綴的組態檔,
在這個專案中我們需要引入資料源、并進行以下一些配置,
# 清除thymeleaf的快取
spring.thymeleaf.cache=false
# 設定一個頁面的訪問路徑
server.servlet.context-path=/gyg
# 告訴springboot國際化放置的位置
spring.messages.basename=i18n.login
# 配置日期格式,自定義日期格式轉換器
spring.mvc.format.date=yyyy-MM-dd
# 配置資料源
spring.datasource.username=root
spring.datasource.password=ADMIN
#serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_emps?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置mybatis
mybatis.type-aliases-package=com.gyg.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
配置完以上這兩項之后就算是完成了專案開發的基本作業,其他詳細的配置我們在專案中用到的時候接著說,接下來就是布局前端頁面和實作資料處理的程序,
三、前端實作
因為整個專案是盡可能采用前后端分離的思想來做的,所以這里我就把前后端分開和大家講解,首先來做前端部分,包括登錄驗證、頁面布局、國際化、資料傳值、注銷操作等,
(1)、登錄驗證
一般的管理系統都是需要使用到登錄以及驗證操作的,驗證用戶的登錄資訊是否正確,判斷用戶有沒有非法的翻越登錄界面直接進入主頁這些操作,
一般判斷用戶有沒有在未登錄的情況下頁面的方法的是:在用戶第一次登錄成功時設定一個session并賦值,同時在請求主頁的時候驗證session是否存在,如果不存在,則說明用戶并沒有進行登錄操作就直接的訪問了主頁,這樣顯然是違法的,
在這里補充一個關于session生命周期的知識點:
Sessinon在用戶訪問第一次訪問服務器時創建,需要注意只有訪問JSP、Servlet等程式時才會創建Session,只訪問HTML、IMAGE等靜態資源并不會創建Session,但可呼叫request.getSession(true)強制生成Session,服務器會把長時間沒有活動的Session從服務器記憶體中清除,此時Session便失效,Tomcat中Session的默認失效時間為20分鐘,同時還可以呼叫Session的invalidate方法將session清除,

在這里,用戶點擊登錄時向控制器發送登錄請求,判斷用戶輸入的資訊是否正確,如果正確就創建session,并重定向到主頁;否則就重新回到登錄頁面,
代碼如下:
@RequestMapping("/user/login")
// @ResponseBody //回傳json字串
public String login(@RequestParam("username") String username, @RequestParam("password") String password,
Model model, HttpSession session) {
// 如果用戶名不為空,且密碼正確,就跳轉頁面
if (!StringUtils.isEmpty(username) && "666666".equals(password)) {
session.setAttribute("loginUser", username);
return "redirect:/main.html";
} else {
model.addAttribute("msg", "用戶名或密碼輸入錯誤!");
return "index";
}
/* model.addAttribute("username",username);
model.addAttribute("password",password);*/
}
(2)WebMvc組態檔
但是由于我們需要回傳頁面跳轉,所以我們需要設定像springmvc中的視圖決議器一樣的東西,來告訴springboot,對于一般的回傳,我們應該如何跳轉,
在這里我們需要寫一個專門的配置類,來實作這些配置操作,這些配置類都需要使用@Configuration標識,這樣系統才會認為這是一個配置類;使用@Configuration標識的類就相當于SSM中的xml組態檔,
Mvc的配置類需要實作WebMvcConfigurer介面,并且根據需要重寫介面中的一系列方法,視圖決議器的定義方法是這樣的:
/**
* 配置一個自定義的視圖控制器
*
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
(3)頁面布局實作
很多前端專案的布局都會使用到的一個框架bootstrap,這個框架提供了非常多的前端組件,我們可以直接匯入相應的代碼即可使用,像我們專案的頁面中,按鈕和表格布局,都是直接使用的bootstrap框架,想要了解如何使用的小伙伴們可以去它的官網查看【bootstrap官網】,然后對于想要快速搭建前端或者后臺頁面的小伙伴們還可以直接在網上搜索“bootstrap模版”即可,

(4)國際化操作
實作國際化的操作一般對于大型的網站開發還是非常常見的,所以在這個專案中我也在登錄頁面做了一個國際化的操作,
Springboot實作國際化需要實作LocaleResolver介面,并實作其中方法,這是springboot規定的語言決議介面,
該類的具體實作是這樣的:
package com.gyg.config;
import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
* 國際化配置
* @author 郭運剛
*/
public class MyLocaleResolver implements LocaleResolver {
/**
* 決議請求
*
* @param request
* @return
*/
@Override
public Locale resolveLocale(HttpServletRequest request) {
// 獲取請求中的語言引數鏈接
String language = request.getParameter("l");
// 如果沒有就使用默認的
Locale locale = Locale.getDefault();
// 判斷請求中獲取到的語言引數鏈接是否為空,如果不為空,就使用請求的鏈接
if (!StringUtils.isEmpty(language)) {
// zh_CN
String[] splits = language.split("_");
// 國家 地區
locale = new Locale(splits[0], splits[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
之后通過mvc的配置類中重寫addInterceptors方法,在其中添加實作語言決議的過濾器,addInterceptors方法的作用就是增加springboot訪問的攔截器,里面的registry引數后面可以增加過濾器類或者增加需要過濾哪些內容,不需要過濾哪些內容,
如下面我們的方法中,增加了國際化過濾、過濾所有內容,同時還對于css、js、img等內容不過濾,
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");
}
以上設定完成之后,我們需要在target/classes下建立檔案夾i18n,在其中建立三個國際化的組態檔夾,分別是默認語言、漢語、英語,

(5)注銷登錄
注銷登錄的操作實作其實還是比較簡單的,我們上面也提到了,驗證用戶是否正常登錄的操作是判斷是否存在session,那么在進行注銷登錄的時候,我們只需要將session使用invalidate()方法清除掉即可,同時回傳到登錄頁面,
/**
* 頁面注銷
* @param session
* @return
*/
@RequestMapping("/user/logout")
public String logout(HttpSession session){
// 使當前session作廢
session.invalidate();
return "redirect:/index.html";
}
直到這里,前端頁面的一些核心操作才算是基本完成了,📢📢📢中間還有很多頁面的代碼我沒有放出來,完整原始碼我整理好了,小伙伴們可以下載:【完整原始碼】
三、后臺實作
員工資訊管理專案的后臺實作主要是采用mybatis框架,使用mybatis框架實作的資料庫操作更加的簡單明了,資料層和業務邏輯層處理也更加簡單,
(1)資料源
我們的資料表結構如


同時我們需要將資料源匯入到專案中,方法是直接在application中寫入username、password、URL、ClassDriver這些引數就好,
# 配置資料源
spring.datasource.username=root
spring.datasource.password=ADMIN
#serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_emps?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
(2)利用LomBok簡化bean
Lombok 是一種 Java 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對于簡單的 Java 物件(POJO),它通過注釋實作這一目的,所以為了簡化代碼,我們的bean使用lombok插件,其中常用的三個注解是:
- @Data 表示該類是資料,并且默認給該類的引數加上了get和set方法
- @AllArgsConstructor 有參構造
- @NoArgsConstructor 無參構造
使用lombok后的員工類是這樣的,是不是簡化了很多代碼量!
package com.gyg.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* 員工表
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Integer did;
private Date birth;
private Department department;
}
(3)配置SQL
Mybatis的實作關鍵的幾個檔案也就是mapper、xml、serveice和controller,在mapper中定義好方法的介面,然后在xml中寫入相應的sql陳述句,移交到service類進行資料處理,controller類直接呼叫service類,最后通過請求執行controller類即可,
我們在員工的mapper介面中定義了基本的增刪改查方法,
package com.gyg.mapper;
import com.gyg.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 定義員工的介面
*/
@Mapper
@Repository
public interface EmployeeMapper {
List<Employee> queryAllEmp();
Employee queryEmpById(int id);
int addEmp(Employee employee);
int updateEmp(Employee employee);
int deleteEmpById(int id);
}
在部門的mapper中定義了查找所有部門的方法,
package com.gyg.mapper;
import com.gyg.pojo.Department;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 定義部門的介面
*/
@Mapper
@Repository
public interface DepartmentMapper {
List<Department> queryAllDepart();
}
緊接著我們需要分別在對應的xml中寫入執行該操作的sql陳述句,由于我們需要顯示員工和員工的部門,所以我們需要使用連接查詢,查詢出員工和其對應的部門資訊,
<?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.gyg.mapper.EmployeeMapper">
<!--回傳員工和對應的部門資訊-->
<resultMap id="withDepartResultMap" type="Employee">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="lastName" jdbcType="VARCHAR" property="lastName"/>
<result column="email" jdbcType="VARCHAR" property="email"/>
<result column="gender" jdbcType="INTEGER" property="gender"/>
<result column="d_id" jdbcType="INTEGER" property="did"/>
<result column="birth" jdbcType="DATE" property="birth"/>
<association property="department" javaType="Department">
<id column="d_id" jdbcType="INTEGER" property="id"/>
<result column="departmentName" jdbcType="VARCHAR" property="departmentName"/>
</association>
</resultMap>
<!--List<Employee> queryAllEmp();-->
<select id="queryAllEmp" resultMap="withDepartResultMap">
SELECT * FROM employee LEFT JOIN department ON employee.d_id=department.id
</select>
<!--Employee queryEmpById(int id);-->
<select id="queryEmpById" resultMap="withDepartResultMap">
SELECT * FROM employee LEFT JOIN department ON employee.d_id=department.id WHERE employee.id=#{id}
</select>
<!--int addEmp(Employee employee);-->
<insert id="addEmp" parameterType="Employee">
insert into employee (id,lastName,email,gender,d_id,birth) values (#{id},#{lastName},#{email},#{gender},#{did},#{birth});
</insert>
<!-- int updateEmp(Employee employee);-->
<update id="updateEmp" parameterType="Employee">
update employee set lastName = #{lastName},email=#{email},gender=#{gender},d_id=#{did},birth=#{birth} where id=#{id};
</update>
<!--int deleteEmpById(int id);-->
<delete id="deleteEmpById" parameterType="int">
delete from employee where id=#{id}
</delete>
</mapper>
(4)業務邏輯層實作
業務邏輯層也就是service層,在這里我們可以直接根據mybatis的特性,將對應的mapper自動裝配進去,然后直接呼叫介面的方法就可以實作執行sql陳述句的操作了,下面的員工類和部門類的service,
package com.gyg.service;
import com.gyg.mapper.EmployeeMapper;
import com.gyg.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 員工的業務邏輯層
*/
@Service
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
/**
* 獲取到所有的員工資訊
* @return
*/
public List<Employee> queryAllEmp(){
return employeeMapper.queryAllEmp();
};
/**
* 根據id查找指定員工
* @param id
* @return
*/
public Employee queryEmpById(int id){
return employeeMapper.queryEmpById(id);
};
/**
* 添加員工
* @param employee
* @return
*/
public int addEmp(Employee employee){
return employeeMapper.addEmp(employee);
};
/**
* 修改員工
* @param employee
* @return
*/
public int updateEmp(Employee employee){
return employeeMapper.updateEmp(employee);
};
/**
* 根據ID洗掉員工
* @param id
* @return
*/
public int deleteEmpById(int id){
return employeeMapper.deleteEmpById(id);
};
}
(5)控制器層
該層可以說是直接和前端界面進行連接的,在每一個方法上面都會標注相應的請求型別,直接將資料請求到對應的方法然后執行,
員工類的控制器層:
/**
* 員工管理
*/
@Controller
public class EmployeeController {
@Autowired
EmployeeService employeeService;
@Autowired
DepartmentService departmentService;
/**
* 獲取所有員工,并回傳到顯示頁
*
* @param model
* @return
*/
@RequestMapping("/emps")
public String queryAllEmp(Model model) {
List<Employee> employees = employeeService.queryAllEmp();
model.addAttribute("emps", employees);
System.out.println(employees);
return "emp/list";
}
/**
* 跳轉到添加員工頁面
*
* @return
*/
@GetMapping("/toAdd")
public String toAddPage(Model model) {
List<Department> departments = departmentService.queryAllDepart();
System.out.println("查詢結果:");
System.out.println(departments);
model.addAttribute("departments", departments);
return "emp/add";
}
/**
* 添加員工
*
* @return
*/
@PostMapping("/emp")
public String addEmployee(Employee employee) {
System.out.println("save------------- " + employee);
Integer did = employee.getDepartment().getId();
employee.setDid(did);
//添加員工
employeeService.addEmp(employee);
//重定向到串列頁面
return "redirect:/emps";
}
/**
* 去員工的修改頁面
*
* @return
*/
@GetMapping("/emp/{id}")
public String toUpdateEmp(@PathVariable("id") Integer id, Model model) {
//獲取到該員工資訊
Employee employee = employeeService.queryEmpById(id);
model.addAttribute("emp", employee);
System.out.println("empID:" + employee);
//獲取到所有的部門資訊
Collection<Department> departments = departmentService.queryAllDepart();
model.addAttribute("departments", departments);
return "emp/update";
}
/**
* 修改員工
* @return
*/
@PostMapping("updateEmp")
public String updateEmp(Employee employee){
Integer did = employee.getDepartment().getId();
employee.setDid(did);
employeeService.updateEmp(employee);
System.out.println("修改資料:" + employee);
return "redirect:/emps";
}
/**
* 洗掉員工
* @return
*/
@RequestMapping("/delete/{id}")
public String deleteEmp(@PathVariable("id") Integer id){
employeeService.deleteEmpById(id);
System.out.println("洗掉成功!" + id);
return "redirect:/emps";
}
}
以上就是這個專案的基本構造了!
四、寫在最后
由于代碼量比較多,所以上面只是貼了一些核心的代碼,🔊🔊🔊完整的原始碼小伙伴們可以在這里下載【完整原始碼】記得?star?喲!,
專案中用到的知識點也非常多,小伙伴們在學校的程序中有清楚的,可以在評論區留言或者加我交流,
小伙伴們一鍵三連?關注!灰小猿帶你上高速啦!🎉🎉🎉
我是灰小猿,我們下期見!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297132.html
標籤:java
上一篇:JAVA入門之例外 筆記(34)
