springboot开发环境搭建 maven,mybatis plus

发布于:2024-11-28 ⋅ 阅读:(10) ⋅ 点赞:(0)

Maven

配置

项目构建工具maven的安装与配置

maven 的意思是专家

创建目录如下

/maven

  • /maven 存放安装程序
  • /mavenProject 存放maven项目
  • /repository 存放本地仓库的jar包

配置\apache-maven-3.6.3\conf\settings.xml

<settings>里面标签修改以下内容

添加

<localRepository>D:\development\java\maven\repository</localRepository>

替换<mirrors>标签内容为

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>        
</mirror>
<!-- 阿里云仓库 -->
<mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

<!-- 中央仓库1 -->
<mirror>
    <id>repo1</id>
    <mirrorOf>central</mirrorOf>
    <name>Human Readable Name for this Mirror.</name>
    <url>http://repo1.maven.org/maven2/</url>
</mirror>

<!-- 中央仓库2 -->
<mirror>
    <id>repo2</id>
    <mirrorOf>central</mirrorOf>
    <name>Human Readable Name for this Mirror.</name>
    <url>http://repo2.maven.org/maven2/</url>
</mirror>

<profiles>配置jdk

<profile>    
    <id>jdk-1.8</id>    
    <activation>    
        <activeByDefault>true</activeByDefault>    
        <jdk>1.8</jdk>    
    </activation>    
    <properties>    
        <maven.compiler.source>1.8</maven.compiler.source>    
        <maven.compiler.target>1.8</maven.compiler.target>    
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>    
    </properties>
</profile>    

添加环境变量MAVEN_HOMED:\development\java\maven\apache-maven-3.6.3

添加%MAVEN_HOME%\bin到path

mvn -v 查看版本信息

idea集成

file->setting->build,execution,deployment->build tools->maven

配置maven_home,setting,repository

[外链图片转存中…(img-h3RpIc9L-1732607685467)]

添加依赖

修改pom.xml文件

普通依赖

依赖格式如下

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
 </dependency>
</dependencies>

标签的含义

  • <groupId>:这是依赖库的唯一标识符的第一部分,通常对应于组织的反向域名或项目组名。
  • <artifactId>:这是依赖库的唯一标识符的第二部分,通常对应于库的名称。
  • <version>:这是依赖库的版本号。
  • <scope>:这定义了依赖的范围,决定了该依赖何时可用。test 范围意味着该依赖仅在测试阶段可用,不会被包含在最终打包的应用程序中。Maven 支持多种依赖范围,常见的有 compile, test, provided, runtime, system, 和 import

父依赖

添加父依赖后,普通依赖会根据父依赖自动寻找版本,就不需要指定version了

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.3</version>
</parent>

<dependencies>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependencies>

Springboot

适配java8

创建springboot项目,将server url替换为https://start.aliyun.com 这样就能使用java8了

先选择依赖

  • SpringWeb 对接web
  • Spring Data JPA 对接数据库操作
  • MySQL Driver 连接数据库

Spring是一组开源软件集合

如springjdbc连接数据库,springsession管理会话等

因为配置复杂,所以就有了springboot

入口点

作为springboot主类的入口点@SpringBootApplication 注解实际上是三个注解的组合:

  1. @SpringBootConfiguration:表示这是一个 Spring 配置类。
  2. @EnableAutoConfiguration:启用 Spring Boot 的自动配置功能,它会根据类路径上的 jar 文件自动配置 Spring Bean。
  3. @ComponentScan:用于扫描指定包下的组件,例如带有 @Controller, @Service, @Repository@Component 注解的类。
package mapper;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("mapper")
@SpringBootApplication
public class TestMybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestMybatisPlusApplication.class, args);
    }
}

配置pom.xml

添加依赖就直接修改pom.xml就行了

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.6.3</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>maven</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        	<version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
<!--            <version>8.0.30</version>-->
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

Junit

在pom里面添加junit用于测试

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

使用方法

待测代码

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Divider cannot be zero");
        }
        return a / b;
    }
}

junit测试

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

public class CalculatorTest {

    private Calculator calculator;

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(5, calculator.add(2, 3));
        assertEquals(0, calculator.add(-1, 1));
    }

    @Test
    public void testDivide() {
        assertEquals(2, calculator.divide(4, 2));
    }

    @Test(expected = IllegalArgumentException.class)
    public void testDivideByZero() {
        calculator.divide(4, 0);
    }
}

Lombok

作用 : 为实体类自动化创建setter和getter接口

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

添加后使用注解就可以不写setter和getter了,减少代码冗余

import lombok.Data;

@Data
public class User {
    public enum Gender {
        MALE, FEMALE, OTHER, PREFER_NOT_TO_SAY
    }
    private String name;
    private int id;
    private Gender gender; // 使用枚举类型代替布尔类型
    private int age;
    private String email;
}

其他代码就可以直接使用setter和getter

public class Main {
    public static void main(String[] args) {
        User user = new User();

        // 使用自动生成的 Setter 方法
        user.setName("Alice");
        user.setId(1);
        user.setGender(User.Gender.FEMALE);
        user.setAge(25);
        user.setEmail("alice@example.com");

        // 使用自动生成的 Getter 方法
        System.out.println("Name: " + user.getName());
        System.out.println("ID: " + user.getId());
        System.out.println("Gender: " + user.getGender());
        System.out.println("Age: " + user.getAge());
        System.out.println("Email: " + user.getEmail());
    }
}

MySQL

安装

记住设置的密码

root

创建数据库

DROP DATABASE IF EXISTS testMyBatisPlus;

CREATE DATABASE testMyBatisPlus;

USE testMyBatisPlus;

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

配置数据库

在source文件夹里面添加application.yaml用于配置数据库账号等 信息

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testMyBatisPlus?useUnicode=true&characterEncoding=utf8
    username: root
    password: root

如果这里的密码是纯数字,如果连接失败,可以试试加双引号

Mybatis-plus框架

持久层框架,用于对接数据库

Entity

职责

  • 定义与数据库表对应的实体类。
  • 每个字段通常映射到表中的列,可以使用 JPA 注解或 MyBatis 注解标注。
  • 可以使用Lombok自动生成setter和getter

Mapper

路径:src/main/java/com/example/demo/mapper/UserMapper.java
SQL 文件:src/main/resources/mapper/UserMapper.xml

职责

  • 用于定义与数据库交互的接口和 SQL 语句。
  • 接口使用 @Mapper 注解,通常直接调用 XML 文件中的 SQL 语句。
  • UserMapper.xml 中编写具体的 SQL。

代码内容

  • 接口示例:提供基础的crub功能,可以通过xml扩展功能

    package com.example.demo.mapper;
    
    import com.example.demo.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    
    import java.util.List;
    
    @Mapper
    public interface UserMapper {
        List<User> getAllUsers();
        User getUserById(Long id);
        void insertUser(User user);
        void deleteUserById(Long id);
    }
    
  • 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">
        <select id="getAllUsers" resultType="com.example.demo.entity.User">
            SELECT * FROM user;
        </select>
    
        <select id="getUserById" parameterType="long" resultType="com.example.demo.entity.User">
            SELECT * FROM user WHERE id = #{id};
        </select>
    
        <insert id="insertUser" parameterType="com.example.demo.entity.User">
            INSERT INTO user (name, age, email) VALUES (#{name}, #{age}, #{email});
        </insert>
    
        <delete id="deleteUserById" parameterType="long">
            DELETE FROM user WHERE id = #{id};
        </delete>
    </mapper>
    

Service

职责

  • 定义业务逻辑接口及其实现。
  • Controller 层调用 Service 层的接口完成业务操作。
  • Service 层通常不直接与数据库交互,而是通过 Mapper 层完成。

代码内容

  • 接口示例

    package com.example.demo.service;
    
    import com.example.demo.entity.User;
    
    import java.util.List;
    
    public interface UserService {
        List<User> getAllUsers();
        User getUserById(Long id);
        void addUser(User user);
        void deleteUserById(Long id);
    }
    
  • 实现类示例

    package com.example.demo.service.impl;
    
    import com.example.demo.entity.User;
    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 java.util.List;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        @Override
        public List<User> getAllUsers() {
            return userMapper.getAllUsers();
        }
    
        @Override
        public User getUserById(Long id) {
            return userMapper.getUserById(id);
        }
    
        @Override
        public void addUser(User user) {
            userMapper.insertUser(user);
        }
    
        @Override
        public void deleteUserById(Long id) {
            userMapper.deleteUserById(id);
        }
    }
    

Controller

职责

  • 处理用户请求并返回响应(通常通过 RESTful API 的方式)。
  • 负责参数校验和调用 Service 层完成具体业务逻辑。
  • 通常通过 @RestController@Controller 注解定义。

代码内容

  • 主要包含 RESTful 接口定义,如 GETPOSTPUTDELETE 等。

  • 示例代码:

    java复制代码package com.example.demo.controller;
    
    import com.example.demo.entity.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/users")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        // 查询所有用户
        @GetMapping
        public List<User> getAllUsers() {
            return userService.getAllUsers();
        }
    
        // 根据 ID 查询用户
        @GetMapping("/{id}")
        public User getUserById(@PathVariable Long id) {
            return userService.getUserById(id);
        }
    
        // 添加新用户
        @PostMapping
        public void addUser(@RequestBody User user) {
            userService.addUser(user);
        }
    
        // 删除用户
        @DeleteMapping("/{id}")
        public void deleteUser(@PathVariable Long id) {
            userService.deleteUserById(id);
        }
    }
    

代码生成

因为有这么多个层,每有一个表就要创建这么多个文件,很麻烦,mybatis plus就提供了代码生成器,方便我们创建基础代码

添加依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

先创建数据库及表

-- 创建数据库,使用完整的utf-8,增加可扩增性
CREATE DATABASE demo_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 使用数据库
USE demo_db;

-- 创建用户表
CREATE TABLE user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
    name VARCHAR(50) NOT NULL COMMENT '用户名',
    age INT NOT NULL COMMENT '年龄',
    email VARCHAR(100) COMMENT '邮箱'
);

然后使用新版代码生成器

package com.cq.cd.generater;


import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;

import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/demo_db", "root", "root")
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("YourName") // 设置作者
                            .outputDir(System.getProperty("user.dir") + "/src/main/java") // 指定输出目录
                            .commentDate("yyyy-MM-dd") // 设置注释日期格式
                            .fileOverride(); // 覆盖已生成文件
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.example") // 设置父包名
                            .moduleName("demo") // 设置模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置Mapper XML生成路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("user") // 设置需要生成的表名
                            .addTablePrefix("t_") // 设置过滤表前缀
                            .entityBuilder().enableLombok(); // 启用Lombok
                })
                .execute();
    }
}

就可以生成以下目录

src/main/java
└── com
    └── example
        └── demo
            ├── controller
            │   └── UserController.java
            ├── entity
            │   └── User.java
            ├── mapper
            │   └── UserMapper.java
            ├── service
            │   ├── UserService.java
            │   └── impl
            │       └── UserServiceImpl.java
src/main/resources
└── mapper
    └── UserMapper.xml

其他问题

跨域请求

浏览器基于 同源策略(Same-Origin Policy)来限制网页与不同源的服务器进行交互。这个策略要求,只有协议、域名、端口都相同的资源才被视为同源,才能进行交互。跨域错误就是由于违反了这个规则产生的。

在使用uniapp访问springboot后端时,使用了不同的端口,出现跨域错误(Cross-Origin Error)

我们可以使用跨域资源共享(CORS)来解决,如下,在服务端允许对应端口

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 允许所有路径进行跨域请求
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:5173", "http://localhost:5174") // 显式列出多个端口
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
                .allowedHeaders("*") // 允许所有头部
                .allowCredentials(true); // 允许发送Cookie等凭证信息
    }
}