本章节用的技术栈为:SpringBoot、Mybatis、Thymeleaf
1. 创建SpringBoot项目,并导入thymeleaf、mybatis、mysql、springWeb、lombok、druid相关依赖,代码如下:
//文件位置:spring-mybatis/pom.xml
<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>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Mybatis 启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
2. 配置properties文件,代码如下:
#文件位置:spring-mybatis\src\main\resources\application.properties
#端口号
server.port=8080
#mybatis链接数据库相关配置
spring.thymeleaf.cache=false
spring.devtools.restart.enabled=true
spring.devtools.restart.additional-paths=src/main/java
#mybatis链接数据库相关配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://100.0.0.1:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username=你的数据库账号
spring.datasource.password=你的数据库密码
mybatis.type-aliases-package=com.example.demo.entity
#mapper路径
mybatis.mapperLocations=classpath:mapper/*.xml
到这里咱们的工作已经完成了一半了(*^▽^*)!下面就可以开始进行CRUD操作了,Let's go~
实现CRUD操作步骤(代码块中的文件位置为源码文件路径,可下载查看)
创建表,SQL如下:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建实体,代码如下:
//文件位置:com.example.demo.entity.Users
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: Wang Zhao Long
* @time: 2023/3/29
* @description:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Users {
private Integer id;
private String name;
private Integer age;
}
实现添加操作
1. 创建mapper,代码如下所示:
//文件位置:com.example.demo.mapper.UserMapper
package com.example.demo.mapper;
import com.example.demo.entity.Users;
import org.apache.ibatis.annotations.Mapper;
/**
* @author: Wang Zhao Long
* @time: 2023/3/29
* @description:
*/
@Mapper
public interface UserMapper {
void insertUser(Users users);
}
2. 创建XML映射文件,代码如下:
//文件位置:mapper/UserMapper.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.example.demo.mapper.UserMapper">
<!--namespace根据自己需要创建的的mapper的路径和名称填写-->
<insert id="insertUser" parameterType="com.example.demo.entity.Users">
insert into users(name,age) value (#{name},#{age})
</insert>
</mapper>
3. 创建业务层(接口与实现),代码如下:
//文件位置:com.example.demo.service.UserService
//以下为接口代码:
package com.example.demo.service;
import com.example.demo.entity.Users;
import java.util.List;
/**
* @author: Wang Zhao Long
* @time: 2023/3/29
* @description:
*/
public interface UserService {
void addUser(Users user);
}
//以下为实现层代码:
//文件位置:com.example.demo.service.impl.UserServiceImpl
package com.example.demo.service.impl;
import com.example.demo.entity.Users;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author: Wang Zhao Long
* @time: 2023/3/29
* @description:
*/
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void addUser(Users user) {
this.userMapper.insertUser(user);
}
}
4. 创建controller控制器,代码如下:
//文件位置:com.example.demo.controller.UsersController
package com.example.demo.controller;
import com.example.demo.entity.Users;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: Wang Zhao Long
* @time: 2023/3/29
* @description:
*/
@Controller
@RequestMapping("/users")
public class UsersController {
@Resource
private UserService userService;
/**
* 页面跳转
*/
@RequestMapping("/{page}")
public String showPage(@PathVariable String page) {
return page;
}
/**
* 添加用户
*/
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(Users user) {
this.userService.addUser(user);
return "ok";
}
}
5. 创建视图层,代码如下:
这里需注意,页面必须创建在templates目录下!!
//文件位置:templates/input.html
//添加页面如下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>添加用户</title>
</head>
<body>
<form th:action="@{/users/addUser}" method="post">
用户姓名:<input type="text" name="name"><br>
用户年龄:<input type="text" name="age"><br>
<input type="submit" value="确认"><br>
</form>
</body>
</html>
//添加后跳转成功页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>操作提示页面</title>
</head>
<body>
操作成功!!!
</body>
</html>
实现列表展示
1. 在mapper中编写接口,代码如下:
//文件位置:com.example.demo.mapper.UserMapper
List<Users> findUser();
2. 在XML映射文件中编写SQL,代码如下:
//文件位置:mapper/UserMapper.xml
<select id="findUser" resultType="com.example.demo.entity.Users">
select id,name,age from users
</select>
3. 在业务层中编写,代码如下:
//文件位置:com.example.demo.service.UserService
//接口代码:
List<Users> findUsers();
//文件位置:com.example.demo.service.impl.UserServiceImpl
//实现层代码:
@Override
public List<Users> findUsers() {
return userMapper.findUser();
}
4. 在控制器中编写,代码如下:
//文件位置:com.example.demo.controller.UsersController
/**
* 列表信息
*/
@RequestMapping("/findUser")
public String findUser(Model model) {
List<Users> list = this.userService.findUsers();
model.addAttribute("list",list);
return "showUsers";
}
5. 编写视图层,代码如下:
//文件位置:templates/showUsers.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
</head>
<body>
<table border="1" style="width: 500px">
<tr>
<th>用户ID</th>
<th>用户姓名</th>
<th>用户年龄</th>
<th>操作</th>
</tr>
<tr th:each="user : ${list}">
<td th:text="${user.id}"></td>
<td th:text="${user.name}"></td>
<td th:text="${user.age}"></td>
<td>
<a th:href="@{/users/findUserById(id=${user.id})}">更新用户</a>
<a th:href="@{/users/del(id=${user.id})}">删除</a>
</td>
</tr>
</table>
</body>
</html>
下面就可以进行展示你的列表信息啦~
实现更新操作
逻辑梳理:要实现更新的操作,首先我们要通过用户想修改数据的id去查询该条信息,对该条信息进行回显操作,之后用户点击确认跳转修改方法,从而达到更新的效果。话不多说,代码上。
1. 编写mapper,代码如下:
//文件位置:com.example.demo.mapper.UserMapper
//查询要修改的数据
Users selectUserById(Integer id);
void updateUser(Users user);
2. 编写映射文件,代码如下:
//文件位置:mapper/UserMapper.xml
<select id="selectUserById" resultType="com.example.demo.entity.Users">
select id,name,age from users where id = #{id}
</select>
<update id="updateUser" parameterType="com.example.demo.entity.Users">
update users set name = #{name},age = #{age} where id = #{id}
</update>
3. 编写业务层,代码如下:
//文件位置:com.example.demo.service.UserService
//接口代码:
Users findUserById(Integer id);
void updateUser(Users user);
//文件位置:com.example.demo.service.impl.UserServiceImpl
//实现层代码:
@Override
public Users findUserById(Integer id) {
return this.userMapper.selectUserById(id);
}
public void updateUser(Users user) {
this.userMapper.updateUser(user);
}
4. 编写控制器,代码如下:
//文件位置:com.example.demo.controller.UsersController
/**
* 根据id查询用户信息
*/
@RequestMapping("/findUserById")
public String findUserById(Integer id,Model model){
Users user = this.userService.findUserById(id);
model.addAttribute("user",user);
return "updateUser";
}
/**
* 修改用户
*/
@RequestMapping("/editUser")
public String editUser(Users user){
this.userService.updateUser(user);
return "ok";
}
5. 编写视图层,代码如下:
//文件位置:templates/showUsers.html
//在列表页面中添加修改链接,代码如下:
<a th:href="@{/users/findUserById(id=${user.id})}">更新用户</a>
//文件位置:templates/updateUser.html
//修改用户页面展示,代码如下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>修改用户</title>
</head>
<body>
<form th:action="@{/users/editUser}" method="post">
<input type="hidden" name="id" th:field="${user.id}">
用户姓名:<input type="text" name="name" th:field="${user.name}"><br>
用户年龄:<input type="text" name="age" th:field="${user.age}"><br>
<input type="submit" value="确认"><br>
</form>
</body>
</html>
实现删除操作
最简单的删除操作来了
1. 编写mapper,代码如下:
//文件位置:com.example.demo.mapper.UserMapper
void deleteUser(Integer id);
2. 编写映射文件,代码如下:
//文件位置:mapper/UserMapper.xml
<delete id="deleteUser">
delete from users where id = #{id}
</delete>
3. 编写业务层,代码如下:
//文件位置:com.example.demo.service.UserService
//接口代码:
void del(Integer id);
//文件位置:com.example.demo.service.impl.UserServiceImpl
//实现层代码:
@Override
public void del(Integer id) {
this.userMapper.deleteUser(id);
}
4. 编写控制器,代码如下:
//文件位置:com.example.demo.controller.UsersController
/**
* 删除
*/
@RequestMapping("/del")
public String del(Integer id){
this.userService.del(id);
return "redirect:/users/findUser";
}
总结:
1. 需要注意properties中的配置信息;
2. 需要注意在启动类中加@MapperScan注解,表示让项目启动自动取扫描mapper所在的路径;
3. 在删除操作中,删除成功后要重定向(redirect)到列表页面;
4. 需要注意在页面中使用thymeleaf语法。