【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
 */
@Api(tags = "用户接口")
@RestController("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 软件进行访问,不能使用浏览器直接进行访问。
在这里插入图片描述

查询所有用户接口

在这里插入图片描述

删除用户接口

在这里插入图片描述
在这里插入图片描述

修改用户接口

在这里插入图片描述在这里插入图片描述

用户页面

在这里插入图片描述

项目目录结构

在这里插入图片描述

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个基于Java的开源框架,简化了使用Java编写企业级应用程序所需的配置和部署过程。它提供了一个简单且功能强大的方式来连接MySQL数据库,并使用Druid作为连接池管理工具,以提高数据库连接的性能和稳定性。同时,Spring Boot也提供了集成MyBatis的支持,以便于数据库访问和操作。 对于连接MySQL数据库,首先需要在项目的配置文件中配置MySQL数据库的连接信息,包括数据库的URL、用户名和密码等。然后,在Spring Boot的启动类中使用相应的注解,例如@EnableAutoConfiguration和@SpringBootApplication,来启用Spring Boot的自动配置和扫描功能。 接下来,可以通过在pom.xml文件中添加相应的依赖来引入Druid和MyBatis等库。Druid作为连接池管理工具,可以在配置文件中配置最大连接数、最小连接数等参数,以及其他高级功能如连接池监控等。MyBatis是一个优秀的ORM框架,可以通过编写XML文件或注解的方式来定义和执行数据库操作。 在编写代码时,可以使用Spring Boot提供的注解,如@Repository、@Service和@Controller等,来标记数据访问层、业务逻辑层和控制层的实现类。同时,可以使用@Mapper注解来标记MyBatis的Mapper接口,以便让Spring Boot自动创建对应的实现类,并与数据库进行交互。 总结来说,Spring Boot结合MySQL、Druid和MyBatis提供了一种简单而强大的方式来连接和操作数据库。通过配置文件和注解,可以快速搭建和部署应用程序,并实现高性能的数据库访问和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值