【SpringBoot】7 数据库(MySQL&MyBatis)

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

MySQL

前提:当地有安装 MySQL 。
毗连

使用工具 Navicat Premium ,或者 IDEA 自带的 DB 工具,或者其他能毗连 MySQL 数据库的工具都可以。

1)创建 MySQL Data Source

2)根据当地设置毗连上 MySQL,点击【Test Connection】,表现毗连乐成,再点击【OK】按钮即可乐成毗连上 DB。

版本

此时已经是乐成毗连上 MySQL,在 console 窗口输入命令检察当地 MySQL 的版本。
  1. SELECT VERSION();
复制代码

依赖

前往公共 Maven 检察,发现 MySQL 没有8.0.34的版本,所以用降个版本用 v8.0.33。
仓库地点:https://mvnrepository.com/artifact/com.mysql/mysql-connector-j

   pom.xml
  1. <dependency>
  2.     <groupId>com.mysql</groupId>
  3.     <artifactId>mysql-connector-j</artifactId>
  4.     <version>8.0.33</version>
  5. </dependency>
复制代码
  application.yml
  1. spring:
  2.   application:
  3.     name: system
  4.   thymeleaf:
  5.     prefix: classpath:/templates/ #前缀,默认为classpath:/templates/
  6.     suffix: .html #后缀,默认为.html
  7.   datasource:
  8.     driver-class-name: com.mysql.cj.jdbc.Driver
  9.     url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
  10.     username: root
  11.     password: root
复制代码
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别及设定 serverTimezone 的方法:https://www.jb51.net/program/298475don.htm
建库建表

新建库 system,新建表 t_user。
  1. #建库,库名: system
  2. CREATE DATABASE `system` CHARACTER SET 'utf8mb4';
  3. #进入 system 数据库
  4. use `system`;
  5. #建表,表名: t_user
  6. CREATE TABLE `system`.`t_user`  (
  7.   `id` int NOT NULL AUTO_INCREMENT,
  8.   `name` varchar(255) NOT NULL,
  9.   `age` tinyint NULL,
  10.   `gender` varchar(2) NULL COMMENT '性别',
  11.   `deleted` tinyint(1) NOT NULL COMMENT '已经删除:0否,1是',
  12.   `create_time` timestamp NOT NULL,
  13.   `update_time` timestamp NULL,
  14.   PRIMARY KEY (`id`)
  15. );
复制代码
MyBatis

官网

MyBatis 3:https://mybatis.org/mybatis-3/
MyBatis-Plus(推荐):https://baomidou.com/
依赖

   pom.xml
  1. <dependency>
  2.     <groupId>com.baomidou</groupId>
  3.     <artifactId>mybatis-plus-boot-starter</artifactId>
  4.     <version>3.5.7</version>
  5. </dependency>
复制代码
设置

1)启动类添加 @MapperScan 注解
   SystemApplication.java
  1. @SpringBootApplication
  2. @MapperScan("com.lm.system.mapper")
  3. public class SystemApplication extends SpringBootServletInitializer {}
复制代码
插件(可选)

图标不同是因为装了插件,这个装不装都可以,装了可以在 Mapper 接口和 Mapper.xml 两个间跳转等功能。

实当代码

实体类

实体类 User 实用于背景程序操作,数据库操作。
   User.java
  1. package com.lm.system.common;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableId;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import java.util.Date;
  8. /**
  9. * @Author: DuHaoLin
  10. * @Date: 2024/7/26
  11. */
  12. @Data
  13. @NoArgsConstructor
  14. @AllArgsConstructor
  15. public class User {
  16.     @TableId(value = "id", type = IdType.INPUT)
  17.     private Integer id; //自增长
  18.     private String name;
  19.     private Integer age;
  20.     private String gender; //性别
  21.     private Integer deleted; //是否已经删除:0否,1是
  22.     private Date createTime;
  23.     private Date updateTime;
  24. }
复制代码
UserDTO 实用于数据传输。
   UserDTO.java
  1. package com.lm.system.common.dto;
  2. import io.swagger.annotations.ApiModel;
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. /**
  7. * @Author: DuHaoLin
  8. * @Date: 2024/7/27
  9. */
  10. @Data
  11. @NoArgsConstructor
  12. @AllArgsConstructor
  13. @ApiModel("用户实体类")
  14. public class UserDTO {
  15.     private Integer id;
  16.     private String name;
  17.     private Integer age;
  18.     private String gender;
  19.     private String createTime;
  20.     private String updateTime;
  21. }
复制代码
Mapper / Dao 层

在 system 目录下,新建 mapper 目录,在 mapper 目录下新建 UserMapper 接口。
   UserMapper.java(这是个接口)
  1. package com.lm.system.mapper;
  2. import com.lm.system.common.User;
  3. import org.apache.ibatis.annotations.Param;
  4. import java.util.List;
  5. /**
  6. * @Author: DuHaoLin
  7. * @Date: 2024/7/27
  8. */
  9. public interface UserMapper {
  10.     int insertUser(@Param("user") User user); //写入单个用户信息
  11.     int updateUser(@Param("user") User user); //修改单个用户信息
  12.     User queryUserById(int id); //按ID查询用户信息
  13.     List<User> queryAllUser(); //查询所有用户信息
  14.     int deleteUser(int id); //按ID删除用户
  15. }
复制代码
在 resource 目录下,新建 com 目录,在 com 目录下新建 lm 目录,在 lm 目录下新建 system 目录,在 system 目录下新建 UserMapper.xml 文件。
注:保持 resource 下的 mapper 目录的层级,和 src 中的 mapper 目录的层级一样。
   UserMapper.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.lm.system.mapper.UserMapper">
  4.     <!--  返回结果集  -->
  5.     <resultMap id="users" type="com.lm.system.common.User">
  6.         <id property="id" column="id" jdbcType="INTEGER" />
  7.         <result property="name" column="name" jdbcType="VARCHAR" />
  8.         <result property="age" column="age" jdbcType="INTEGER" />
  9.         <result property="gender" column="gender" jdbcType="VARCHAR" />
  10.         <result property="deleted" column="deleted" jdbcType="INTEGER" />
  11.         <result property="createTime" column="create_time" jdbcType="DATE" />
  12.         <result property="updateTime" column="update_time" jdbcType="DATE" />
  13.     </resultMap>
  14.     <resultMap id="userDTO" type="com.lm.system.common.dto.UserDTO">
  15.         <result property="name" column="name" jdbcType="VARCHAR" />
  16.         <result property="age" column="age" jdbcType="INTEGER" />
  17.         <result property="gender" column="gender" jdbcType="VARCHAR" />
  18.     </resultMap>
  19.     <sql id="baseColumn">
  20.         id, `name`, age, gender, deleted, create_time, update_time
  21.     </sql>
  22.     <insert id="insertUser" parameterType="com.lm.system.common.User"
  23.             keyColumn="id" keyProperty="id" useGeneratedKeys="true">
  24.         INSERT INTO t_user (name, age, gender, deleted, create_time, update_time)
  25.         VALUES (#{user.name}, #{user.age}, #{user.gender}, 0, NOW(), NOW())
  26.     </insert>
  27.     <update id="updateUser" parameterType="com.lm.system.common.User">
  28.         UPDATE t_user SET
  29.             <if test="user.name != '' and user.name != null"> name=#{user.name}, </if>
  30.             <if test="user.age != null"> age=#{user.age}, </if>
  31.             <if test="user.gender != '' and user.gender != null"> gender=#{user.gender}, </if>
  32.             update_time=NOW()
  33.         WHERE id = #{user.id}
  34.     </update>
  35.     <select id="queryUserById" parameterType="int" resultType="com.lm.system.common.User">
  36.         SELECT <include refid="baseColumn"></include>
  37.         FROM t_user
  38.         WHERE id = #{id} AND deleted = 0
  39.     </select>
  40.     <select id="queryAllUser" resultMap="userDTO">
  41.         SELECT <include refid="baseColumn"></include>
  42.         FROM t_user
  43.         WHERE deleted = 0
  44.     </select>
  45.     <update id="deleteUser" parameterType="int">
  46.         UPDATE t_user SET deleted = 1
  47.         WHERE id = #{id}
  48.     </update>
  49. </mapper>
复制代码
Service 层

在 system 目录下,新建 service 目录,在 service 目录下新建 UserService 接口。
   UserService.java(这是一个接口)
  1. package com.lm.system.service;
  2. import com.lm.system.common.User;
  3. import java.util.List;
  4. /**
  5. * @Author: DuHaoLin
  6. * @Date: 2024/7/27
  7. */
  8. public interface UserService {
  9.     int insertUser(User user); //写入单个用户信息
  10.     int updateUser(User user); //修改单个用户信息
  11.     User queryUserById(int id); //按ID查询用户信息
  12.     List<User> queryAllUser(); //查询所有用户信息
  13.     int deleteUser(int id); //按ID删除用户
  14. }
复制代码
在 service 目录下新建 impl 目录,在 impl 目录下新建 UserServiceImpl 类。
   UserServiceImpl.java
  1. package com.lm.system.service;
  2. import com.lm.system.common.User;
  3. import com.lm.system.common.dto.UserDTO;
  4. import java.util.List;
  5. /**
  6. * @Author: DuHaoLin
  7. * @Date: 2024/7/27
  8. */
  9. public interface UserService {
  10.     int insertUser(User user); //写入单个用户信息
  11.     int updateUser(User user); //修改单个用户信息
  12.     User queryUserById(int id); //按ID查询用户信息
  13.     List<User> queryAllUser(); //查询所有用户信息
  14.     int deleteUser(int id); //按ID删除用户
  15. }
复制代码
Exception

在 system 目录下,新建 exception 目录,exception 目录下新建 DatabaseException 类。
   DataBaseException.java
  1. package com.lm.system.exception;
  2. /**
  3. * @Author: DuHaoLin
  4. * @Date: 2024/7/27
  5. */
  6. public class DataBaseException extends RuntimeException {
  7.     public DataBaseException() {
  8.         super();
  9.     }
  10.     public DataBaseException(String message) {
  11.         super(message);
  12.     }
  13.     public DataBaseException(String message, Throwable cause) {
  14.         super(message, cause);
  15.     }
  16. }
复制代码
  GlobalExceptionHandler.java
添加一个捕获 DatabaseException 的方法。
  1. @ExceptionHandler({DataBaseException.class})
  2. public String handleDataBaseException(Exception e, HttpServletRequest request) {
  3.     log.error("500-数据库操作失败,{},{}", e.getMessage(), request.getServletPath());
  4.     return ResultBody
  5.             .build(HttpStatus.INTERNAL_SERVER_ERROR)
  6.             .setMsg(e.getMessage())
  7.             .getReturn();
  8. }
复制代码
Util

在 system 目录下,新建 ResultUtil 类。
   ResultUtil.java
  1. package com.lm.system.util;
  2. import com.lm.system.common.ResultBody;
  3. import org.springframework.http.HttpStatus;
  4. /**
  5. * @Author: DuHaoLin
  6. * @Date: 2024/7/27
  7. */
  8. public class ResultUtil{
  9.     /**
  10.      * 根据操作记录数判断是否操作成功,返回对应的结果
  11.      * @param i 本次操作的数据库操作记录数
  12.      */
  13.     private static String getResult(int i, String successMsg, String failMsg) {
  14.         boolean b = i == 0;
  15.         return ResultBody
  16.                 .build(b ? HttpStatus.INTERNAL_SERVER_ERROR : HttpStatus.OK)
  17.                 .setMsg(b ? failMsg : successMsg)
  18.                 .getReturn();
  19.     }
  20.     public static String getAddResult(int i) {
  21.         return getResult(i, "添加成功", "添加失败");
  22.     }
  23.     public static String getUpdateResult(int i) {
  24.         return getResult(i, "修改成功", "修改失败");
  25.     }
  26.     public static String getDeleteResult(int i) {
  27.         return getResult(i, "删除成功", "删除失败");
  28.     }
  29. }
复制代码
Controller 层

   UserController.java
  1. package com.lm.system.controller;
  2. import com.lm.system.common.ResultBody;
  3. import com.lm.system.common.User;
  4. import com.lm.system.common.dto.UserDTO;
  5. import com.lm.system.service.UserService;
  6. import com.lm.system.util.ResultUtil;
  7. import io.swagger.annotations.Api;
  8. import io.swagger.annotations.ApiOperation;
  9. import org.springframework.beans.BeanUtils;
  10. import org.springframework.http.HttpStatus;
  11. import org.springframework.web.bind.annotation.*;
  12. import javax.annotation.Resource;
  13. import java.util.List;
  14. /**
  15. * @Author: DuHaoLin
  16. * @Date: 2024/7/26
  17. */
  18. @RestController
  19. @Api(tags = "用户接口")
  20. @RequestMapping("user")
  21. public class UserController {
  22.     @Resource
  23.     private UserService userService;
  24.     @PostMapping("addUser")
  25.     @ApiOperation("添加用户")
  26.     public String addUser(@RequestBody UserDTO dto) {
  27.         User user = new User();
  28.         BeanUtils.copyProperties(dto, user);
  29.         int i = userService.insertUser(user);
  30.         return ResultUtil.getAddResult(i);
  31.     }
  32.     @PutMapping("updateUser")
  33.     @ApiOperation("修改用户")
  34.     public String updateUser(@RequestBody User user) {
  35.         int i = userService.updateUser(user);
  36.         return ResultUtil.getUpdateResult(i);
  37.     }
  38.     @GetMapping("userById/{id}")
  39.     @ApiOperation("按用户ID获取用户信息")
  40.     public String queryUserById(@PathVariable int id) {
  41.         User user = userService.queryUserById(id);
  42.         return ResultBody
  43.                 .build(user == null ? HttpStatus.NO_CONTENT : HttpStatus.OK)
  44.                 .setData(user)
  45.                 .setCount(user == null ? 0 : 1)
  46.                 .getReturn();
  47.     }
  48.     @GetMapping("users")
  49.     @ApiOperation("获取所有用户信息")
  50.     public String users() {
  51.         List<User> users = userService.queryAllUser();
  52.         return ResultBody
  53.                 .build(HttpStatus.OK)
  54.                 .setData(users)
  55.                 .setCount(users.size())
  56.                 .getReturn();
  57.     }
  58.     @DeleteMapping("deleteUser/{id}")
  59.     @ApiOperation("按用户ID删除用户信息")
  60.     public String deleteUser(@PathVariable int id) {
  61.         int i = userService.deleteUser(id);
  62.         return ResultUtil.getDeleteResult(i);
  63.     }
  64. }
复制代码
  UserPageController.java
  1. package com.lm.system.controller;
  2. import com.lm.system.common.User;
  3. import com.lm.system.service.UserService;
  4. import io.swagger.annotations.Api;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import javax.annotation.Resource;
  9. import java.util.List;
  10. /**
  11. * @Author: DuHaoLin
  12. * @Date: 2024/7/26
  13. */
  14. @Controller
  15. @Api(tags = "用户页面")
  16. public class UserPageController {
  17.     @Resource
  18.     private UserService userService;
  19.     @GetMapping("userPage")
  20.     public String user(Model model) {
  21.         List<User> users = userService.queryAllUser();
  22.         model.addAttribute("users", users);
  23.         return "user";
  24.     }
  25. }
复制代码
效果图

接口文档


添加用户接口

注:Post 方法要用 Swagger 或 Postman 软件进行访问,不能使用浏览器直接进行访问。

查询全部效户接口


删除用户接口



修改用户接口


用户页面


项目目录布局



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表