diff --git a/README.md b/README.md index 14c94ac..3ead357 100644 --- a/README.md +++ b/README.md @@ -1 +1,87 @@ -# Springboot3和JDK17的基础脚手架 \ No newline at end of file +# Springboot3和JDK17的基础脚手架 - 数据库分支 + + + +## 基础依赖 +- MySQL +- MyBatis-Plus 3.5.15 这个版本是SpringBoot3支持的最高版本 +- jsqlparser 在MyBatis-Plus 3.5.9以后的版本,插件部分开始修改为可选依赖,所以这里手动增加。 + +> 引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 mybatis-spring-boot-starter和MyBatis-Spring,以避免因版本差异导致的问题。 + +```xml + + com.mysql + mysql-connector-j + runtime + + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.15 + + + + com.baomidou + mybatis-plus-jsqlparser + 3.5.14 + compile + +``` + + + +## Druid数据源配置详解 +- [官方WIKI](https://github.com/alibaba/druid/wiki/%E9%A6%96%E9%A1%B5) + +### Druid多数据源说明 +添加配置 +```properties +spring.datasource.url= +spring.datasource.username= +spring.datasource.password= + +# Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖 +spring.datasource.druid.initial-size=5 +spring.datasource.druid.max-active=5 + +# Druid 数据源 1 配置,继承spring.datasource.druid.* 配置,相同则覆盖 +spring.datasource.druid.one.max-active=10 +spring.datasource.druid.one.max-wait=10000 + + +# Druid 数据源 2 配置,继承spring.datasource.druid.* 配置,相同则覆盖 + +spring.datasource.druid.two.max-active=20 +spring.datasource.druid.two.max-wait=20000 + +``` + +# Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖 + +```properties +spring.datasource.druid.initial-size=5 +spring.datasource.druid.max-active=5 +``` + +# Druid 数据源 1 配置,继承spring.datasource.druid.* 配置,相同则覆盖 +```properties + + +spring.datasource.druid.one.max-active=10 +spring.datasource.druid.one.max-wait=10000 +``` + +# Druid 数据源 2 配置,继承spring.datasource.druid.* 配置,相同则覆盖 +```properties +spring.datasource.druid.two.max-active=20 +spring.datasource.druid.two.max-wait=20000 +``` + +强烈注意:**Spring Boot 2.X** 版本不再支持配置继承,多数据源的话每个数据源的所有配置都需要单独配置,否则配置不会生效 + + + +## MyBatis-Plus配置详解 +- [官网文档](https://baomidou.com/introduce/) diff --git a/pom.xml b/pom.xml index 1ce04fd..0450d80 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,8 @@ UTF-8 UTF-8 3.5.9 + 1.2.27 + 3.5.15 @@ -40,7 +42,35 @@ spring-boot-starter-test test + + + + com.mysql + mysql-connector-j + runtime + + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-jsqlparser + ${mybatis-plus.version} + compile + + + com.alibaba + druid-spring-boot-3-starter + ${druid.version} + + + + diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/Application.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/Application.java index 42e6058..37c6262 100644 --- a/src/main/java/com/yongfeng/lg/springboot3jdk17/Application.java +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/Application.java @@ -1,9 +1,11 @@ package com.yongfeng.lg.springboot3jdk17; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication +@MapperScan("com.yongfeng.lg.springboot3jdk17.mapper") // 必须配置,扫描mapper包 public class Application { public static void main(String[] args) { diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/controller/UserController.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/controller/UserController.java new file mode 100644 index 0000000..7653d6d --- /dev/null +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/controller/UserController.java @@ -0,0 +1,57 @@ +package com.yongfeng.lg.springboot3jdk17.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yongfeng.lg.springboot3jdk17.entity.User; +import com.yongfeng.lg.springboot3jdk17.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + + // 1. 新增用户 + @PostMapping("/save") + public boolean save(@RequestBody User user) { + return userService.save(user); + } + + // 2. 根据ID查询用户 + @GetMapping("/{id}") + public User getById(@PathVariable Long id) { + return userService.getById(id); + } + + // 3. 查询所有用户 + @GetMapping("/list") + public List list() { + return userService.list(); + } + + // 4. 分页查询用户 (MP分页插件生效) + @GetMapping("/page") + public Page page(@RequestParam Integer current, @RequestParam Integer size) { + Page page = new Page<>(current, size); + return userService.page(page); + } + + // 5. 条件查询:根据年龄查询 + @GetMapping("/listByAge/{age}") + public List listByAge(@PathVariable Integer age) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.gt(User::getAge, age); // 年龄大于指定值 + return userService.list(wrapper); + } + + // 6. 删除用户 + @DeleteMapping("/{id}") + public boolean remove(@PathVariable Long id) { + return userService.removeById(id); + } +} diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/entity/User.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/entity/User.java new file mode 100644 index 0000000..55fed38 --- /dev/null +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/entity/User.java @@ -0,0 +1,57 @@ +package com.yongfeng.lg.springboot3jdk17.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 com.yongfeng.lg.springboot3jdk17.enums.SexEnum; +import lombok.Data; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 数据库表对应的实体类 (示例:用户表 user) + */ +@Data // lombok注解,自动生成get/set/toString/equals等方法 +@TableName("user") // 对应数据库的表名 +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + // 自增主键 + @TableId(type = IdType.AUTO) + private Long id; + + // 用户名 (数据库字段:user_name) + @TableField("user_name") + private String userName; + + // 密码 + @TableField("password") + private String password; + + // 年龄 + @TableField("age") + private Integer age; + + // 性别 使用枚举值 + @TableField("sex") + private SexEnum sex; + + + // 邮箱 + @TableField("email") + private String email; + + // 创建时间 + @TableField("create_time") + private LocalDateTime createTime; + + // 更新时间 + @TableField("update_time") + private LocalDateTime updateTime; + + // 逻辑删除字段 (0=未删除,1=已删除) + @TableField("deleted") + private Integer deleted; +} \ No newline at end of file diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/enums/SexEnum.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/enums/SexEnum.java new file mode 100644 index 0000000..71ba713 --- /dev/null +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/enums/SexEnum.java @@ -0,0 +1,26 @@ +package com.yongfeng.lg.springboot3jdk17.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * MyBatis-Plus使用枚举示例 + */ + +@Getter +@AllArgsConstructor +public enum SexEnum { + PRIMARY(1, "小学"), + SECONDARY(2, "中学"), + HIGH(3, "高中"); + + // 枚举属性使用 @EnumValue 注解, + // 指定枚举值在数据库中存储的实际值。 + // 支持枚举类中的任意字段,如序号或编码。 + // 标记数据库存的值是code + @EnumValue + private final int code; + + private final String desc; +} diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/mapper/UserMapper.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/mapper/UserMapper.java new file mode 100644 index 0000000..3e2d2fc --- /dev/null +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/mapper/UserMapper.java @@ -0,0 +1,16 @@ +package com.yongfeng.lg.springboot3jdk17.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yongfeng.lg.springboot3jdk17.entity.User; +import org.apache.ibatis.annotations.Mapper; + +/** + * MP的Mapper接口,继承BaseMapper即可,无需写任何方法 + * BaseMapper 中的泛型是对应的实体类 + */ +//@Mapper // 可选,因为主启动类加了@MapperScan,二选一即可 +public interface UserMapper extends BaseMapper { + + // 自定义的Mapper可以在这里面写,对应Mapper XML文件 +} diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/service/UserService.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/service/UserService.java new file mode 100644 index 0000000..a20a6cd --- /dev/null +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/service/UserService.java @@ -0,0 +1,12 @@ +package com.yongfeng.lg.springboot3jdk17.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yongfeng.lg.springboot3jdk17.entity.User; + +/** + * 业务层接口,继承MP的IService + */ +public interface UserService extends IService { + +} diff --git a/src/main/java/com/yongfeng/lg/springboot3jdk17/service/impl/UserServiceImpl.java b/src/main/java/com/yongfeng/lg/springboot3jdk17/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..2fbf057 --- /dev/null +++ b/src/main/java/com/yongfeng/lg/springboot3jdk17/service/impl/UserServiceImpl.java @@ -0,0 +1,16 @@ +package com.yongfeng.lg.springboot3jdk17.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yongfeng.lg.springboot3jdk17.entity.User; +import com.yongfeng.lg.springboot3jdk17.mapper.UserMapper; +import com.yongfeng.lg.springboot3jdk17.service.UserService; +import org.springframework.stereotype.Service; + +/** + * 业务层实现类,继承ServiceImpl,注入Mapper即可 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b01c1a6..b33d4ba 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,53 @@ -# 端口号 +# Web服务端口号 server.port=8080 +# 配置数据源类型为Druid +spring.datasource.type=com.alibaba.druid.pool.DruidDataSource +# druid相关配置文件 +# MySQL8.x 驱动类,固定值;如果是MySQL5.7,改成 com.mysql.jdbc.Driver +spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver +# 数据库连接地址 +spring.datasource.druid.url=jdbc:mysql://10.232.112.35:3306/springboot3-jdk17?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai +# 数据库名 +spring.datasource.druid.username=root +# 数据库密码 +spring.datasource.druid.password=-w9M627JZeYo5p^3lbH0mqDa +# 初始化连接数 +spring.datasource.druid.initial-size=5 +# 最小空闲连接数 +spring.datasource.druid.min-idle=5 +# 最大活跃连接数 +spring.datasource.druid.max-active=20 +# 获取连接的最大等待时间(ms) +spring.datasource.druid.max-wait=60000 +# 检测空闲连接的间隔时间 +spring.datasource.druid.time-between-eviction-runs-millis=60000 +# 空闲连接的存活时间 +spring.datasource.druid.min-evictable-idle-time-millis=300000 +# 检测连接是否有效 +spring.datasource.druid.validation-query=SELECT 1 FROM DUAL +# 空闲时检测连接有效性 +spring.datasource.druid.test-while-idle=true +# 获取连接时不检测(提升性能)但是可能存在使用了废弃的会话 +spring.datasource.druid.test-on-borrow=false +# 归还连接时不检测(提升性能) +spring.datasource.druid.test-on-return=false +# 开启PSCache +spring.datasource.druid.pool-prepared-statements=true +spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 +# MyBatis-Plus配置文件 +# 配置Mapper.xml映射文件的路径 +mybatis-plus.mapper-locations=classpath:mapper/**/*.xml +# 配置实体类的包别名,简化Mapper中的实体类引用 +mybatis-plus.type-aliases-package=com.example.demo.entity +# 主键策略:AUTO(自增),也可以用雪花算法 (分布式唯一ID,推荐) +mybatis-plus.global-config.db-config.id-type=AUTO +# 逻辑删除字段配置(可选) +mybatis-plus.global-config.db-config.logic-delete-field=deleted +# 配合逻辑删除字段 1代表删除 +mybatis-plus.global-config.db-config.logic-delete-value=1 +mybatis-plus.global-config.db-config.logic-not-delete-value=0 + +mybatis-plus.configuration.map-underscore-to-camel-case=true +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.configuration.cache-enabled=false