qidao123.com技术社区-IT企服评测·应用市场
标题:
【SpringBoot】7 数据库(MySQL&MyBatis)
[打印本页]
作者:
耶耶耶耶耶
时间:
2024-10-7 08:01
标题:
【SpringBoot】7 数据库(MySQL&MyBatis)
MySQL
前提:当地有安装 MySQL 。
毗连
使用工具 Navicat Premium ,或者 IDEA 自带的 DB 工具,或者其他能毗连 MySQL 数据库的工具都可以。
1)创建 MySQL Data Source
2)根据当地设置毗连上 MySQL,点击【Test Connection】,表现毗连乐成,再点击【OK】按钮即可乐成毗连上 DB。
版本
此时已经是乐成毗连上 MySQL,在 console 窗口输入命令检察当地 MySQL 的版本。
SELECT VERSION();
复制代码
依赖
前往公共 Maven 检察,发现 MySQL 没有8.0.34的版本,所以用降个版本用 v8.0.33。
仓库地点:https://mvnrepository.com/artifact/com.mysql/mysql-connector-j
pom.xml
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
复制代码
application.yml
spring:
application:
name: system
thymeleaf:
prefix: classpath:/templates/ #前缀,默认为classpath:/templates/
suffix: .html #后缀,默认为.html
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
复制代码
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别及设定 serverTimezone 的方法:https://www.jb51.net/program/298475don.htm
建库建表
新建库 system,新建表 t_user。
#建库,库名: system
CREATE DATABASE `system` CHARACTER SET 'utf8mb4';
#进入 system 数据库
use `system`;
#建表,表名: t_user
CREATE TABLE `system`.`t_user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` tinyint NULL,
`gender` varchar(2) NULL COMMENT '性别',
`deleted` tinyint(1) NOT NULL COMMENT '已经删除:0否,1是',
`create_time` timestamp NOT NULL,
`update_time` timestamp NULL,
PRIMARY KEY (`id`)
);
复制代码
MyBatis
官网
MyBatis 3:https://mybatis.org/mybatis-3/
MyBatis-Plus(推荐):https://baomidou.com/
依赖
pom.xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
复制代码
设置
1)启动类添加 @MapperScan 注解
SystemApplication.java
@SpringBootApplication
@MapperScan("com.lm.system.mapper")
public class SystemApplication extends SpringBootServletInitializer {}
复制代码
插件(可选)
图标不同是因为装了插件,这个装不装都可以,装了可以在 Mapper 接口和 Mapper.xml 两个间跳转等功能。
实当代码
实体类
实体类 User 实用于背景程序操作,数据库操作。
User.java
package com.lm.system.common;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @Author: DuHaoLin
* @Date: 2024/7/26
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@TableId(value = "id", type = IdType.INPUT)
private Integer id; //自增长
private String name;
private Integer age;
private String gender; //性别
private Integer deleted; //是否已经删除:0否,1是
private Date createTime;
private Date updateTime;
}
复制代码
UserDTO 实用于数据传输。
UserDTO.java
package com.lm.system.common.dto;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("用户实体类")
public class UserDTO {
private Integer id;
private String name;
private Integer age;
private String gender;
private String createTime;
private String updateTime;
}
复制代码
Mapper / Dao 层
在 system 目录下,新建 mapper 目录,在 mapper 目录下新建 UserMapper 接口。
UserMapper.java(这是个接口)
package com.lm.system.mapper;
import com.lm.system.common.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public interface UserMapper {
int insertUser(@Param("user") User user); //写入单个用户信息
int updateUser(@Param("user") User user); //修改单个用户信息
User queryUserById(int id); //按ID查询用户信息
List<User> queryAllUser(); //查询所有用户信息
int deleteUser(int id); //按ID删除用户
}
复制代码
在 resource 目录下,新建 com 目录,在 com 目录下新建 lm 目录,在 lm 目录下新建 system 目录,在 system 目录下新建 UserMapper.xml 文件。
注:保持 resource 下的 mapper 目录的层级,和 src 中的 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.lm.system.mapper.UserMapper">
<!-- 返回结果集 -->
<resultMap id="users" type="com.lm.system.common.User">
<id property="id" column="id" jdbcType="INTEGER" />
<result property="name" column="name" jdbcType="VARCHAR" />
<result property="age" column="age" jdbcType="INTEGER" />
<result property="gender" column="gender" jdbcType="VARCHAR" />
<result property="deleted" column="deleted" jdbcType="INTEGER" />
<result property="createTime" column="create_time" jdbcType="DATE" />
<result property="updateTime" column="update_time" jdbcType="DATE" />
</resultMap>
<resultMap id="userDTO" type="com.lm.system.common.dto.UserDTO">
<result property="name" column="name" jdbcType="VARCHAR" />
<result property="age" column="age" jdbcType="INTEGER" />
<result property="gender" column="gender" jdbcType="VARCHAR" />
</resultMap>
<sql id="baseColumn">
id, `name`, age, gender, deleted, create_time, update_time
</sql>
<insert id="insertUser" parameterType="com.lm.system.common.User"
keyColumn="id" keyProperty="id" useGeneratedKeys="true">
INSERT INTO t_user (name, age, gender, deleted, create_time, update_time)
VALUES (#{user.name}, #{user.age}, #{user.gender}, 0, NOW(), NOW())
</insert>
<update id="updateUser" parameterType="com.lm.system.common.User">
UPDATE t_user SET
<if test="user.name != '' and user.name != null"> name=#{user.name}, </if>
<if test="user.age != null"> age=#{user.age}, </if>
<if test="user.gender != '' and user.gender != null"> gender=#{user.gender}, </if>
update_time=NOW()
WHERE id = #{user.id}
</update>
<select id="queryUserById" parameterType="int" resultType="com.lm.system.common.User">
SELECT <include refid="baseColumn"></include>
FROM t_user
WHERE id = #{id} AND deleted = 0
</select>
<select id="queryAllUser" resultMap="userDTO">
SELECT <include refid="baseColumn"></include>
FROM t_user
WHERE deleted = 0
</select>
<update id="deleteUser" parameterType="int">
UPDATE t_user SET deleted = 1
WHERE id = #{id}
</update>
</mapper>
复制代码
Service 层
在 system 目录下,新建 service 目录,在 service 目录下新建 UserService 接口。
UserService.java(这是一个接口)
package com.lm.system.service;
import com.lm.system.common.User;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public interface UserService {
int insertUser(User user); //写入单个用户信息
int updateUser(User user); //修改单个用户信息
User queryUserById(int id); //按ID查询用户信息
List<User> queryAllUser(); //查询所有用户信息
int deleteUser(int id); //按ID删除用户
}
复制代码
在 service 目录下新建 impl 目录,在 impl 目录下新建 UserServiceImpl 类。
UserServiceImpl.java
package com.lm.system.service;
import com.lm.system.common.User;
import com.lm.system.common.dto.UserDTO;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public interface UserService {
int insertUser(User user); //写入单个用户信息
int updateUser(User user); //修改单个用户信息
User queryUserById(int id); //按ID查询用户信息
List<User> queryAllUser(); //查询所有用户信息
int deleteUser(int id); //按ID删除用户
}
复制代码
Exception
在 system 目录下,新建 exception 目录,exception 目录下新建 DatabaseException 类。
DataBaseException.java
package com.lm.system.exception;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public class DataBaseException extends RuntimeException {
public DataBaseException() {
super();
}
public DataBaseException(String message) {
super(message);
}
public DataBaseException(String message, Throwable cause) {
super(message, cause);
}
}
复制代码
GlobalExceptionHandler.java
添加一个捕获 DatabaseException 的方法。
@ExceptionHandler({DataBaseException.class})
public String handleDataBaseException(Exception e, HttpServletRequest request) {
log.error("500-数据库操作失败,{},{}", e.getMessage(), request.getServletPath());
return ResultBody
.build(HttpStatus.INTERNAL_SERVER_ERROR)
.setMsg(e.getMessage())
.getReturn();
}
复制代码
Util
在 system 目录下,新建 ResultUtil 类。
ResultUtil.java
package com.lm.system.util;
import com.lm.system.common.ResultBody;
import org.springframework.http.HttpStatus;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public class ResultUtil{
/**
* 根据操作记录数判断是否操作成功,返回对应的结果
* @param i 本次操作的数据库操作记录数
*/
private static String getResult(int i, String successMsg, String failMsg) {
boolean b = i == 0;
return ResultBody
.build(b ? HttpStatus.INTERNAL_SERVER_ERROR : HttpStatus.OK)
.setMsg(b ? failMsg : successMsg)
.getReturn();
}
public static String getAddResult(int i) {
return getResult(i, "添加成功", "添加失败");
}
public static String getUpdateResult(int i) {
return getResult(i, "修改成功", "修改失败");
}
public static String getDeleteResult(int i) {
return getResult(i, "删除成功", "删除失败");
}
}
复制代码
Controller 层
UserController.java
package com.lm.system.controller;
import com.lm.system.common.ResultBody;
import com.lm.system.common.User;
import com.lm.system.common.dto.UserDTO;
import com.lm.system.service.UserService;
import com.lm.system.util.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/26
*/
@RestController
@Api(tags = "用户接口")
@RequestMapping("user")
public class UserController {
@Resource
private UserService userService;
@PostMapping("addUser")
@ApiOperation("添加用户")
public String addUser(@RequestBody UserDTO dto) {
User user = new User();
BeanUtils.copyProperties(dto, user);
int i = userService.insertUser(user);
return ResultUtil.getAddResult(i);
}
@PutMapping("updateUser")
@ApiOperation("修改用户")
public String updateUser(@RequestBody User user) {
int i = userService.updateUser(user);
return ResultUtil.getUpdateResult(i);
}
@GetMapping("userById/{id}")
@ApiOperation("按用户ID获取用户信息")
public String queryUserById(@PathVariable int id) {
User user = userService.queryUserById(id);
return ResultBody
.build(user == null ? HttpStatus.NO_CONTENT : HttpStatus.OK)
.setData(user)
.setCount(user == null ? 0 : 1)
.getReturn();
}
@GetMapping("users")
@ApiOperation("获取所有用户信息")
public String users() {
List<User> users = userService.queryAllUser();
return ResultBody
.build(HttpStatus.OK)
.setData(users)
.setCount(users.size())
.getReturn();
}
@DeleteMapping("deleteUser/{id}")
@ApiOperation("按用户ID删除用户信息")
public String deleteUser(@PathVariable int id) {
int i = userService.deleteUser(id);
return ResultUtil.getDeleteResult(i);
}
}
复制代码
UserPageController.java
package com.lm.system.controller;
import com.lm.system.common.User;
import com.lm.system.service.UserService;
import io.swagger.annotations.Api;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/26
*/
@Controller
@Api(tags = "用户页面")
public class UserPageController {
@Resource
private UserService userService;
@GetMapping("userPage")
public String user(Model model) {
List<User> users = userService.queryAllUser();
model.addAttribute("users", users);
return "user";
}
}
复制代码
效果图
接口文档
添加用户接口
注:Post 方法要用 Swagger 或 Postman 软件进行访问,不能使用浏览器直接进行访问。
查询全部效户接口
删除用户接口
修改用户接口
用户页面
项目目录布局
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4