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_HOME
为D:\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
注解实际上是三个注解的组合:
@SpringBootConfiguration
:表示这是一个 Spring 配置类。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置功能,它会根据类路径上的 jar 文件自动配置 Spring Bean。@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 接口定义,如
GET
、POST
、PUT
、DELETE
等。示例代码:
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等凭证信息
}
}