springBoot-05-springBoot整合mybatis项目开发过程
1、导入静态资源
- 静态资源可以存放的位置【可以明确看到的位置】
-例子
<!--假设资源放在static包下,在写路径的时候不用写static-->
<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
- 静态资源可以存放的位置【webjars正常不用】
- 需要导入的依赖
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
2、运行项目,出现首页
3、项目中没有jsp,这时我们要用模板引擎Thymeleaf
- Thymeleaf语法可以在springBoot-04中看到
- 需要导入的依赖
- 直接导入启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 或导入相关jar包
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
- 在html页面加入对应的命名空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
4、装配扩展springMVC
1.可以通过重写方法,扩展springMVC
2.自定义视图解析器
-
这里通过@Bean的方式把我们之定义的视图解析器放到spring里面
-
这里我们通过在DispatcherServlet中的doDispatch方法上设断点,当我们请求时,就可以看到我们自定义的视图解析器已被加载
5、连接数据库springBoot整合mybatis
1.需要到导入的依赖
<!--springBoot整合mybatis需要的依赖,且这个包不是官方的,看格式-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.编写配置文件
#数据连接
spring.datasource.username=root
spring.datasource.password=123
#serverTimezone=UTC #比北京时间少8个小时
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Shanghai&userUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#整合mybatis
mybatis.type-aliases-package=com.lc.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
6、登录功能的实现
1.index页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Signin Template for Bootstrap</title>
<!-- Bootstrap core CSS -->
<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
<!-- Custom styles for this template -->
<link th:href="@{/css/signin.css}" rel="stylesheet">
</head>
<body class="text-center">
<form class="form-signin" th:action="@{/Login}" method="post">
<img class="mb-4" th:src="@{/img/bug.svg}" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}"></h1>
<!--提示错误信息-->
<p style="color: red;" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
<label class="sr-only">Username</label>
<input type="text" th:name="username" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">
<label class="sr-only">Password</label>
<input type="password" th:name="password" class="form-control" th:placeholder="#{login.password}" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox">[[ #{login.remember} ]]
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit" >[[ #{login.btn} ]]</button>
<p class="mt-5 mb-3 text-muted">© 2020-2021</p>
<a class="btn btn-sm" th:href="@{/index(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index(l='en_US')}">English</a>
</form>
</body>
</html>
2.Dao层UserMapper接口【这里必须写上@mapper相当于mapper扫描包的作用=>@MapperScan】
@Mapper
@Repository
public interface UserMapper {
//添加一个员工
int addUser(User user);
//修改一个员工
int updateUser(User user);
//查询全部员工
List<User> queryAllUsers();
//根据id查询员工
User queryUserById(String username);
//根据id删除员工
int deleteUserById(Integer username);
}
3.UserMapper.xml【这里注意mapper.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.lc.dao.UserMapper">
<select id="queryAllUsers" resultType="User">
select * from springboot.user;
</select>
<select id="queryUserById" parameterType="String" resultType="User">
select * from springboot.user where username = #{username}
</select>
<insert id="addUser" parameterType="User">
insert into springboot.user (username,password,level)
values (#{username},#{password},#{level});
</insert>
<update id="updateUser" parameterType="User">
update springboot.user
set password = #{password},level=#{level}
where username = #{username};
</update>
<delete id="deleteUserById" parameterType="String">
delete from springboot.user where username=#{username}
</delete>
</mapper>
4.UserService
public interface UserService {
//添加一个员工
int addUser(User user);
//修改一个员工
int updateUser(User user);
//查询全部员工
List<User> queryAllUsers();
//根据id查询员工
User queryUserById(String username);
//根据id删除员工
int deleteUserById(Integer username);
}
5.UserServiceImpl【这里注意是调用dao层,一定要写上@Autowired】
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public int addUser(User user) {
int i = userMapper.addUser(user);
return i;
}
@Override
public int updateUser(User user) {
int i = userMapper.updateUser(user);
return i;
}
@Override
public List<User> queryAllUsers() {
List<User> users = userMapper.queryAllUsers();
return users;
}
@Override
public User queryUserById(String username) {
User user = userMapper.queryUserById(username);
return user;
}
@Override
public int deleteUserById(Integer username) {
int i = userMapper.deleteUserById(username);
return i;
}
}
7、增删改查
1.Thymeleaf中代码复用
2.Dao层和Service层
a)、Dao层EmployeeMapper接口【这里必须写上@mapper】
@Mapper
@Repository
public interface EmployeeMapper {
//添加一个员工
int addEmployee(Employee employee);
//修改一个员工
int updateEmployee(Employee employee);
//查询全部员工
List<Employee> queryAllEmployees();
//根据id查询员工
Employee queryEmployeeById(Integer Eid);
//根据id删除员工
int deleteEmployeeById(Integer Eid);
}
b)、EmployeeMapper.xml
<mapper namespace="com.lc.dao.EmployeeMapper">
<select id="queryAllEmployees" resultType="Employee">
select * from springboot.employee;
</select>
<select id="queryEmployeeById" parameterType="Integer" resultType="Employee">
select * from springboot.employee where Eid =#{Eid}
</select>
<insert id="addEmployee" parameterType="Employee">
insert into springboot.employee (Eid,Ename,email,sex,Did,birth)
values (#{Eid},#{Ename},#{email},#{sex},#{Did},#{birth});
</insert>
<update id="updateEmployee" parameterType="Employee">
update springboot.employee
set Ename = #{Ename},email = #{email},sex=#{sex},Did=#{Did},birth=#{birth}
where Eid=#{Eid};
</update>
<delete id="deleteEmployeeById" parameterType="Integer">
delete from springboot.employee where Eid=#{Eid}
</delete>
</mapper>
c)、UserService
public interface EmployeeService {
//添加一个员工
int addEmployee(Employee employee);
//修改一个员工
int updateEmployee(Employee employee);
//查询全部员工
List<Employee> queryAllEmployees();
//根据id查询员工
Employee queryEmployeeById(Integer Eid);
//根据id删除员工
int deleteEmployeeById(Integer Eid);
}
d)、UserServiceImpl【调Dao层@Autowired】
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
public void setBookMapper(EmployeeMapper employeeMapper){
this.employeeMapper=employeeMapper;
}
@Override
public int addEmployee(Employee employee) {
int i = employeeMapper.addEmployee(employee);
return i;
}
@Override
public int updateEmployee(Employee employee) {
int i = employeeMapper.updateEmployee(employee);
return i;
}
@Override
public List<Employee> queryAllEmployees() {
List<Employee> employees = employeeMapper.queryAllEmployees();
return employees;
}
@Override
public Employee queryEmployeeById(Integer Eid) {
Employee employee = employeeMapper.queryEmployeeById(Eid);
return employee;
}
@Override
public int deleteEmployeeById(Integer Eid) {
int i = employeeMapper.deleteEmployeeById(Eid);
return i;
}
}
3.Controller层
@Controller
public class EmployeeController {
@Autowired
EmployeeService employeeService;
@Autowired
DepartmentService departmentService;
}
a)、员工全查询
@RequestMapping("/emps")
public String list(Model model){
List<Employee> employees = employeeService.queryAllEmployees();
model.addAttribute("employees",employees);
return "emp/list";
}
b)、添加员工
//restful风格get
//跳转到添加员工页面
@GetMapping("/emp")
public String toAddEmp(Model model){
//查询所有部门的信息
List<Department> departments = departmentService.queryAllDepartments();
model.addAttribute("departments",departments);
return "emp/addEmployee";
}
//restful风格post
//添加员工并返回list页面
@PostMapping("/emp")
public String addEmployee(Employee employee){
//添加员工
System.out.println("addEmployee=>"+employee);
employeeService.addEmployee(employee);
return "redirect:/emps";
}
c)、修改员工
//跳转到修改员工页面
@GetMapping("/toUpdateEmp/{Eid}")
public String toUpdateEmp(@PathVariable("Eid")Integer Eid, Model model){
//根据id查询员工信息
Employee employee = employeeService.queryEmployeeById(Eid);
model.addAttribute("employee",employee);
System.out.println(Eid+"*******************************************"+ employee.toString());
//查询所有的部门
List<Department> departments = departmentService.queryAllDepartments();
model.addAttribute("departments",departments);
return "emp/updateEmployee";
}
//修改员工并返回list页面
@PostMapping("/updateEmployee")
public String updateEmployee(Employee employee){
employeeService.updateEmployee(employee);
return "redirect:/emps";
}
d)、删除员工
<!--list页面-->
<a class="btn btn-sm btn-danger" th:href="@{'/deleteEmployee/'+${emp.getEid()}}">删除</a>
//删除员工
@GetMapping("/deleteEmployee/{Eid}")
public String deleteEmployee(@PathVariable("Eid")Integer Eid){
employeeService.deleteEmployeeById(Eid);
System.out.println(Eid+"*************************************");
//重定向==> redirect:/
return "redirect:/emps";
}
e)、注销
<!--commons页面-->
<a class="nav-link" th:href="@{/loginOut}">注销</a>
@RequestMapping("/loginOut")
public String loginOut(HttpSession session){
System.out.println("***********************");
//注销
session.invalidate();
return "redirect:/index.html";
}
f)、404页面和500页面
8、拦截器
1.编写扩展springMVC的config【必须加上@Configuration】
@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之后自定义国际化才生效
@Bean
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}
//拦截器
//在这里添加上登录拦截,并添加要拦截的url和要排除的url
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/Login","/index.html","/css/**","/js/**","/img/**");
}
}
2.登录拦截【写完之后必须在】
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;
}
}
}
3.国际化要配置一个地区解析【之后必须在MyMvcConfig 注册@Bean才能生效】
public class MyLocalResolver implements LocaleResolver {
//解析请求
@Override
public Locale resolveLocale(HttpServletRequest request) {
//获取请求中的语言参数
String language = request.getParameter("l");
//如果没有参数就使用默认的
Locale locale = Locale.getDefault();
System.out.println("sdf"+language);
//如果请求的连接携带了国际化的参数
if(!StringUtils.isEmpty(language)){
//zh_CN
String[] split = language.split("_");
//国家,地区
locale = new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
9、中英文切换【国际化】
10、效果图
相关资源: 学习狂神说 学习地址(以上仅为笔记)