Article directory
version introduction
jdk 17
SpringBoot 3.1.0
druid-spring-boot-starter 1.2.4
mysql-connector 8.0.33
mybatis-plus 3.5.3.1
Environmental preparation
import dependencies
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<druid.version>1.2.4</druid.version>
<mysql.version>8.0.33</mysql.version>
<lombok.version>1.18.26</lombok.version>
<swagger.version>1.5.22</swagger.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>
<!-- Web 相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>compile</scope>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.version}</version>
<scope>compile</scope>
</dependency>
application.yml configuration
server:
port: 8080
spring:
datasource:
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/springboot-exp?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
username: root
password: 123456
# 数据源连接池配置
druid:
# 数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=1000;
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml # xml路径
global-config:
db-config:
id-type: ASSIGN_ID # 全局默认主键策略,默认为雪花ID,若表中设置了自增,则生成的实体自动添加自增ID属性,参考 TestDelete
logic-delete-field: deleted # 全局逻辑删除的实体字段名,若不配置,则不启用
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
configuration:
map-underscore-to-camel-case: true # 驼峰转下划线(默认)
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 日志输出
type-aliases-package: com.example.domain.entity
Database Table
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名字',
`password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户密码',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
use
MybatisPlusConfig
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 添加 攻击 SQL 阻断解析器,防止全表更新与删除
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
// 添加 乐观锁 插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
User
@TableName(value = "user", autoResultMap = true)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = -4328989516223829865L;
/**
* 用户ID
*/
@TableId
private String id;
/**
* 用户账号
*/
private String userName;
/**
* 密码
*/
private String password;
}
UserMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {}
UserService
public interface UserService {
void save(User user);
User getById(String id);
void removeById(String id);
void update(UserUpdateReqVO reqVO);
}
UserBaseVO
@ApiModel("Request VO")
@Data
@ToString(callSuper = true)
public class UserBaseVO {
@ApiModelProperty(value = "用户名字", required = true)
@NotNull(message = "用户名字不能为空")
private String username;
@ApiModelProperty(value = "用户密码", required = true)
@NotNull(message = "用户密码不能为空")
private String password;
}
UserUpdateReqVO
@ApiModel("用户更新 Request VO")
@Data
@ToString(callSuper = true)
public class UserUpdateReqVO extends UserBaseVO {
@ApiModelProperty(value = "", required = true)
@NotNull(message = "id不能为空")
private String id;
}
UserCreateReqVO
@ApiModel("用户更新 Request VO")
@Data
@ToString(callSuper = true)
public class UserCreateReqVO extends UserBaseVO {
}
MyBatisDemoController
@RestController
@RequestMapping("/user")
@Slf4j
public class MyBatisDemoController {
@Autowired
private UserService userService;
/**
* 添加一个新用户
*
* @return java.lang.Object
*/
@GetMapping("/add")
public Object add(UserCreateReqVO reqVO) {
User user = User.builder().id(UUID.randomUUID().toString()).password(reqVO.getPassword()).userName(reqVO.getUsername()).build();
userService.save(user);
return "add";
}
/**
* 更新用户
*
* @return java.lang.Object
*/
@GetMapping("/update")
public Object update(@RequestBody UserUpdateReqVO reqVO) {
User user = userService.getById(reqVO.getId());
if(null != user){
userService.update(reqVO);
return "update success";
}
return "update error";
}
/**
* 通过id获取用户
*
* @param id
* @return java.lang.Object
*/
@GetMapping("/{id}")
public Object get(@PathVariable String id) {
return userService.getById(id);
}
/**
* 通过id删除用户
*
* @param id
* @return java.lang.Object
*/
@GetMapping("/del/{id}")
public Object del(@PathVariable String id) {
userService.removeById(id);
return "del";
}
}
code generation tool
import dependencies
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
GeneratorUtils
public class GeneratorUtils {
public static void main(String[] args) {
autoGenerator();
}
public static void autoGenerator() {
AutoGenerator autoGenerator = new AutoGenerator();
autoGenerator.setDataSource(getDataSourceConfig());
autoGenerator.setGlobalConfig(getGlobalConfig());
autoGenerator.setPackageInfo(getPackageInfo());
autoGenerator.setStrategy(getStrategyConfig());
autoGenerator.execute();
}
/**
* 设置数据源
* @return
*/
public static DataSourceConfig getDataSourceConfig(){
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://47.98.123.147:3306/springboot-exp?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True");
dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("springboot-exp");
dsc.setPassword("HJRNEhKPS8MPapB8");
dsc.setDbType(DbType.MYSQL);
return dsc;
}
/**
* 设置全局配置
* @return
*/
public static GlobalConfig getGlobalConfig(){
GlobalConfig gc = new GlobalConfig();
String path = System.getProperty("user.dir");
gc.setOutputDir(path+"/springboot-mybatisplus-druid/src/main/java");//参数是一个目录,所以需要获取当前系统目录
gc.setAuthor("coderjim");
gc.setOpen(true);//是否打开资源管理器
gc.setFileOverride(true);//是否覆盖已经生成的
gc.setServiceName("%sService");//去service的I前缀
gc.setIdType(IdType.INPUT);// id生成策略
gc.setDateType(DateType.ONLY_DATE);
return gc;
}
/**
*包配置
* @return
*/
public static PackageConfig getPackageInfo(){
PackageConfig pc = new PackageConfig();
pc.setModuleName("common");
pc.setParent("com.example");
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
return pc;
}
/**
* 策略配置
* @return
*/
public static StrategyConfig getStrategyConfig(){
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);// 下划线转驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 设置映射的表名,多张表
strategy.setInclude("user");
strategy.setEntityLombokModel(true);// 是否启用lombok开启注解
strategy.setLogicDeleteFieldName("isAction");//设置逻辑删除字段
// 时间自动填充配置
TableFill startDate = new TableFill("startDate", FieldFill.INSERT);
TableFill updateDate = new TableFill("updateDate", FieldFill.UPDATE);
ArrayList<TableFill> list = new ArrayList<>();
list.add(startDate);
list.add(updateDate);
strategy.setTableFillList(list);
// 乐观锁配置
strategy.setVersionFieldName("version");
// rustful 格式
strategy.setRestControllerStyle(true);
return strategy;
}
}
If you need the complete source code, please pay attention to the official account "Architecture Palace", reply "SpringBoot+mybatisplus+druid" to get
write at the end
If you are interested in related articles, you can pay attention to the official account "Architecture Hall", and will continue to update AIGC, java basic interview questions, netty, spring boot, spring cloud and other series of articles, and a series of dry goods will be delivered at any time!