如果有Ts基础最好。写过egg就更好了。
我接触springboot + MybatisPlus 也就一星期,专业术语如果有问题,欢迎大佬指正。
项目准备
- 一台联网笔记本
- 工具选择Idea
- Java环境
初始化项目
两种安装
- 1.从官网下载模板
https://start.spring.io/
- 2.idea 新建项目
如果想从阿里云,地址自定义:https://start.aliyun.com/
包命名规范 公司域名 com.xxx.xxx
springboot 此时推荐稳定版 2.4.1
dependencies依赖安装,前期不清楚可以不勾选,后面我会给上我的。
说明
- pom.xml
类似于package.json
管理依赖插件 - maven
地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java
类似于 nodejs网站 各种包
dependencies
安装依赖,类似与Vue dependencies
如果想要依赖(或者启动项)
比如
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
直接复制到指定的位置<dependencies></dependencies>
会自动加载配置项,不像 vue需手动 npm install
与@EnableAutoConfiguration
有关
当然maven有生命周期,常用的标注了。如果加了依赖不下载,刷新一下。
以下是我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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> // 热部署 但有时候还是老老实实的重启吧
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency> // 集成了mybatis
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency> // 通常实体类get set
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置项 默认 application.properties
书写规则,个人喜欢xml(默认没有user config文件,我新建的)
连接数据库 配置项
application.yml
server:
port: 1111
spring:
application:
name: test
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://{ip}:{port}/posden?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC # 新版本时区
username: root
password: root # 密码加单引号的
platform: mysql
devtools: # 热加载
restart:
enabled: true
additional-paths: src/main/java # 指定目标文件
# mybatis-plus
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印数据库操作日志
初始化MySql
根据MybatisPlus官网
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL 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)
);
DELETE FROM user;
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');
编写 entity mapper 测试类上测试 mapper curd
添加文件
entity/User
创建User实体类
package com.example.demo.user.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@TableName
public class User{
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(value = "email") // 跟数据库字段保持一致,一样可以省略,不一样要指定
private String email;
}
mapper/UserMapper
简单的数据库操作不要*Mapp.xml,利用集成的curd就行
package com.example.demo.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.user.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
DemoApplicationTests
测试类
package com.example.demo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.user.entity.User;
import com.example.demo.user.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
// 查找全部
@Test
public void testSelectAll() {
System.out.println(("----- testSelectAll ------"));
List<User> userList = userMapper.selectList(null);
userList.forEach(item-> System.out.println(item));
}
// 主键
@Test
public void testSelectById() {
System.out.println(("----- testSelectById ------"));
User user = userMapper.selectById(1);
System.out.println(user);
}
// 条件查询
@Test
public void testSelectBySome() {
System.out.println(("----- testSelectBySome ------"));
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age",20).eq("name","Jack2");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}
// 保存
@Test
public void testSave() {
System.out.println(("----- testSave ------"));
User user = new User();
user.setName("Test").setAge(20).setEmail("test@qq.com");
userMapper.insert(user);
}
// 修改 根据主键
@Test
public void testUpdateById() {
System.out.println(("----- testSave ------"));
User user = userMapper.selectById(1);
user.setAge(33);
userMapper.updateById(user);
}
// 批量 根据搜索条件
@Test
public void testUpdateBySome() {
System.out.println(("----- testSave ------"));
User user = new User();
user.setName("Test2");
QueryWrapper<User> updateQueryWrapper = new QueryWrapper<>();
updateQueryWrapper.eq("age", 24);
userMapper.update(user,updateQueryWrapper);
}
// 删 根据Id
@Test
public void testdeleteById() {
System.out.println(("----- testSave ------"));
userMapper.deleteById(1);
}
// 删 根据条件
@Test
public void testDeleteBySome() {
System.out.println(("----- testSave ------"));
QueryWrapper<User> deleteQueryWrapper = new QueryWrapper<>();
deleteQueryWrapper.eq("age",20);
userMapper.delete(deleteQueryWrapper);
}
// 分页要MyBatis plus 分页插件
@Test
public void testPage() {
IPage<User> userPage = new Page<>(1, 2);//参数一是当前页,参数二是每页个数
userPage = userMapper.selectPage(userPage, null);
List<User> list = userPage.getRecords();
for(User user : list){
System.out.println(user);
}
}
}
分页插件
config/MyBatisPlusConfig
package com.example.demo.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@Configuration
@MapperScan("com.example.demo.user.mapper")
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
目前,基于mapper的curd基础测试完成
controller层获取前端数据
controller/UserController
package com.example.demo.user.controller;
import com.example.demo.user.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
@GetMapping("/{id}") // /api/v1/user/1 path
public void QueryId(@PathVariable Integer id){
System.out.println(id);
}
@GetMapping("query/{userId}") // /api/v1/user/query/1?age=18&name=Jack path query
public Map<String, Object> getBannerDetail(@PathVariable Integer userId, @RequestParam Integer age, @RequestParam String name ){
Map<String, Object> body = new HashMap<>();
body.put("userId", userId);
body.put("age", age);
body.put("name", name);
return body;
}
@PostMapping("/create")
public Map<String, Object> createUser(@RequestBody Map<String, Object> user){
user.put("id", 1243);
return user;
}
@PostMapping("/getHeader")
public Map<String, Object> getHeader(@RequestBody Map<String, Object> user, HttpServletRequest headers){
// // @RequestHeader HttpHeaders headers
String token = headers.getHeader("token");
user.put("token", token);
return user;
}
}
现在 单独 Mapper curd 和 获取前端path query body header上参数
编写service
service/Uservice
package com.example.demo.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.user.entity.User;
public interface UserService extends IService<User> {
}
service/impl/UserServiceImpl
package com.example.demo.user.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.user.entity.User;
import com.example.demo.user.mapper.UserMapper;
import com.example.demo.user.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }
在UserController测试
+++
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/{id}") // /api/v1/user/1 path
public User QueryId(@PathVariable Integer id){
System.out.println(id);
return userService.getById(id);
}
}
简单来说 server curd 是 mapper curd 的二次封装吧,其他暂时不写了,对着官方文档就行了
完工