目录
一、系统介绍:
完成了学生系统的增删改查。
1.前序技术:
- springboot2
- mybatis(MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录)
- thymeleaf 模板引擎
- mysql数据库
- lombok(可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具)
2.依赖添加:
可以在Maven Repository: Search/Browse/Explore中查询依赖
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 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.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
二、具体项目
1. 整体项目目录:
2. 配置文件
application.properties(此处也可以利用yaml)
#语言包
spring.messages.basename=i18n.login
#数据库设置
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/wangchentest?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#整合mybatis
mybatis.type-aliases-package=com.chen.pojo
mybatis.mapper-locations=classpath:mapper/*.xml
3. 创建数据库
本项目建立了两个表,一个是学院表,一个是学生表
-- 创建数据库
CREATE DATABASE wangchentest;
-- 使用springboot数据库
USE wangchentest;
CREATE TABLE IF NOT EXISTS `departments`(
`id` INT(4) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' ,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `departments`(`name`)
VALUES ("计算机学院"),("电信学院"),("土木学院"),("机械学院"),("建筑学院");
CREATE TABLE IF NOT EXISTS `students`(
`id` INT(4) NOT NULL AUTO_INCREMENT ,
`lastName` VARCHAR(30) NOT NULL DEFAULT '匿名' ,
`email` VARCHAR(30) NOT NULL,
`gender` INT(4) NOT NULL DEFAULT '0',
`departments` INT(4) NOT NULL DEFAULT '0',
`birthday` DATE,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
REPLACE INTO `students`(`id`,`lastName`,`email`,`departments`,`gender`,`birthday`)
VALUES (1, "zsr", "1234@qq.com", 1, 1, '1997/02/03'),
(2, "sad", "sad@qq.com", 2, 1, '1997-02-03'),
(3, "das", "das@qq.com", 3, 0, '1993-09-03'),
(4, "jbiu", "jbiu@qq.com", 4, 0, '1992-00-03'),
(5, "uiowe", "uiowe@qq.com", 5, 0, '1992-02-03');
4. 网页静态资源
网上下载,然后利用thymeleaf语法更改连接。
5. pojo包
department类:其中几个注解就是lombok应用,标记数据,全参构造,无参构造。
具体的get、set方法能够通过structure点击查看。
package com.chen.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {
private Integer id ;
private String name;
}
employee类:
package com.chen.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Calendar;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Integer departments;
private String birthday;
}
6.Mapper包+mapper的xml文件:
由于mybatis,这里替代的就是dao层,在写这里时只需写接口即可,注意:
@Repository将数据访问层 (DAO层) 的类标识为 Spring Bean
package com.chen.Mapper;
import com.chen.pojo.Department;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.Collection;
@Mapper
@Repository
public interface departmentsMapper {
Collection<Department> getDepartments();
String getDepartmentById(int id);
}
package com.chen.Mapper;
import com.chen.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.Collection;
@Mapper
@Repository
public interface EmployeesMapper {
int addEmployee(Employee employee);
int updateEmployee(Employee employee);
Collection<Employee> getAllEmployees();
Employee getEmployeeByID(Integer id);
void deleteEmployeeByID(int id);
}
相应的xml文件为:这也就是mybatis的优点,不需要将sql语句写进java文件中,利用xml文件就能将本来java中的对象,与mysql中的表相对应。
<?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.chen.Mapper.departmentsMapper">
<select id="getDepartments" resultType="Department">
select * from departments
</select>
<select id="getDepartmentById" resultType="String">
select name from departments where id= #{id}
</select>
</mapper>
<?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.chen.Mapper.EmployeesMapper">
<select id="getAllEmployees" resultType="Employee">
select * from students
</select>
<select id="getEmployeeByID" resultType="Employee">
select * from students where id= #{id}
</select>
<insert id="addEmployee" parameterType="Employee">
insert into students (id,lastName,email,gender,departments,birthday) values (#{id},#{lastName},#{email},#{gender},#{departments},#{birthday})
</insert>
<update id="updateEmployee" parameterType="Employee">
update students set lastName=#{lastName},email=#{email},gender=#{gender},departments=#{departments},birthday=#{birthday} where id=#{id}
</update>
<delete id="deleteEmployeeByID" parameterType="int">
delete from students where id=#{id}
</delete>
</mapper>
7. Controller包
EmployeesController.java:
以add为例:可以看到输入参数为一个对象,在html中的name必须和此对象的属性名称相同。
package com.chen.Controller;
import com.chen.Mapper.EmployeesMapper;
import com.chen.Mapper.departmentsMapper;
import com.chen.pojo.Department;
import com.chen.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Collection;
@Controller
public class EmployeesController {
@Autowired
private departmentsMapper dM;
@Autowired
private EmployeesMapper eM;
@RequestMapping("/emps")
public String list(Model model){
model.addAttribute("emps", eM.getAllEmployees());
model.addAttribute("departmentTable",dM);
return "emps/list";
}
@GetMapping("/emp")
public String toAddPage(Model model){
Collection<Department> departments = dM.getDepartments();
model.addAttribute("de",departments);
return "emps/add";
}
@PostMapping("/emp")
public String addEmployee(Employee a){
eM.addEmployee(a);
return "redirect:/emps";
}
//编辑按钮获取ID
@RequestMapping("/edit/{id}")
public String edit(@PathVariable("id") int id, Model model) {
//查询指定id的员工,添加到empByID中,用于前端接收
model.addAttribute("empByID", eM.getEmployeeByID(id));
//查出所有的部门信息,添加到departments中,用于前端接收
Collection<Department> departments = dM.getDepartments();
model.addAttribute("departments", departments);
return "/emps/edit";//返回到编辑员工页面
}
//编辑员工信息
@PostMapping("/edit")
public String editEmployee(Employee a){
eM.updateEmployee(a);
return "redirect:/emps";
}
//删除员工
@GetMapping("/delemp/{id}")
public String deleteEmployee(@PathVariable("id") int id, Model model){
eM.deleteEmployeeByID(id);
return "redirect:/emps";
}
}
LoginController.java:解决了登陆问题,
package com.chen.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(
@RequestParam("username")String username,
@RequestParam("password") String password,
Model model,
HttpSession session) {
if ("admin".equals(username) && "123456".equals(password)) {
session.setAttribute("loginuser",username);
return "redirect:/main.html";//跳转到dashboard页面
}
//如果用户名或者密码不正确
else {
model.addAttribute("msg", "用户名或者密码错误!");//显示错误信息
return "index";//跳转到首页
}
}
@RequestMapping("/user/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
}
8. config包
LoginHandlerInterceptor.java登陆拦截器:
package com.chen.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginuser = request.getSession().getAttribute("loginuser");
if (loginuser == null) {
request.setAttribute("msg", "没有输入!无法登陆");
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else {
return true;
}
}
}
地区位置配置:
package com.chen.config;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
//获取请求中的国际化参数
String language = request.getParameter("l");
//默认的地区
Locale locale = Locale.getDefault();
//如果请求的链接参数不为空,携带了国际化参数
if (!StringUtils.isEmpty(language)) {
String[] split = language.split("_");//zh_CN(语言_地区)
locale = new Locale(split[0], split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
自身配置:
package com.chen.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override//映射资源
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login",
"/css/**","/js/**","/img/**");
}
}
三、遇到的问题:
1. mysql中的date类型在java中用你date类型接收时会报错。
解决方案:设置为String类型接收。
2.设置的int类型的departmentId不显示。
解决方案:
pojo中的属性名必须和mysql中的属性名完全一致才行。
3. 目前的department是数字,现存两个表,希望做到:得到department数字以后,用这个数字在department表中查询出名字,再写在这一列。
解决方案:
原本:
后来:
注意在controller层需要加上:
结果正常显示
4. 添加用户并没有添加到数据库中。
四、运行
添加: