<dependencies>
<!--Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--阿里的json转换jar包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--mybatis-plus-->
<!--mybatis-plus是自己开发的,并非官方的-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--非官方: mybatis-spring-boot-starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--Druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--Druid会使用log4j的日志记录,使用导入依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<!--JDBC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis-plus-generator 生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<!-- freemarker,作为代码生成器mapper文件的模板引擎使用(当然也可以使用velocity,二选一即可) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--jcakson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
spring:
profiles:
active: release
spring:
thymeleaf:
cache: false
datasource:
username: root
password: 123456
# 假如时区报错了加 &serverTimezone=UTC
url: jdbc:mysql://localhost:3306/school_vote?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true&allowMultiQueries=true
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置druid数据源
type: com.alibaba.druid.pool.DruidDataSource
# 配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
# 如果允许时报错 java.lang.ClassNotFoundExcption :org.apache.log4j.Priority
# 则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j
druid:
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# 时间日期格式化 spring默认提交格式 yyyy/MM/dd
mvc:
format:
date: yyyy-MM-dd HH:mm:ss
servlet:
multipart:
enabled: true
max-file-size: 30MB
max-request-size: 30MB
# redis
redis:
host: ip地址 # 默认127.0.0.1
port: 6379 # 默认6379
password: 密码
# 整合mybatis
mybatis:
mapper-locations:
- classpath:com/zhao/mapper/*.xml
# 配置日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 开启驼峰命名
map-underscore-to-camel-case: true
# 配置逻辑删除
global-config:
db-config:
logic-delete-value: 1 # 1 为逻辑删除后的字段
logic-not-delete-value: 0 # 0 为没有逻辑删除的字段
logic-delete-field: deleted #对应实体类的字段 写了这个在实体类中就不需要写注解了
spring:
thymeleaf:
cache: false
datasource:
username: 账号
password: 密码
# 假如时区报错了加 &serverTimezone=UTC
url: jdbc:mysql://ip地址:3306/school_vote?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true&allowMultiQueries=true
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置druid数据源
type: com.alibaba.druid.pool.DruidDataSource
# 配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
# 如果允许时报错 java.lang.ClassNotFoundExcption :org.apache.log4j.Priority
# 则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j
druid:
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# 时间日期格式化 spring默认提交格式 yyyy/MM/dd
mvc:
format:
date: yyyy-MM-dd HH:mm:ss
servlet:
multipart:
enabled: true
max-file-size: 30MB
max-request-size: 30MB
# redis
redis:
host: ip地址 # 默认127.0.0.1
port: 6379 # 默认6379
password: 密码
# 整合mybatis
mybatis:
mapper-locations:
- classpath:com/zhao/mapper/*.xml
# 配置日志
mybatis-plus:
configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 开启驼峰命名
map-underscore-to-camel-case: true
# 配置逻辑删除
global-config:
db-config:
logic-delete-value: 1 # 1 为逻辑删除后的字段
logic-not-delete-value: 0 # 0 为没有逻辑删除的字段
logic-delete-field: deleted #对应实体类的字段 写了这个在实体类中就不需要写注解了
server:
port: 9800
log4j.logger.freemarker.cache=ERROR
log4j.logger.freemarker.beans=ERROR
SpringBoot的JSON工具类(java),用于前后端分离_我认不到你的博客-CSDN博客
Redis工具类(redisTemplate)以及 redisTemplate 的用法_我认不到你的博客-CSDN博客
SpringBoot整合Rides_我认不到你的博客-CSDN博客
/**
* MD5工具类
* @author PING.AN.ZHAO
* @date 2022年7月10日
*/
public class MD5Util {
public static String md5(String source) throws NoSuchAlgorithmException {
String des = "";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] result = md.digest(source.getBytes());
StringBuilder buf = new StringBuilder();
for (byte b : result) {
buf.append(String.format("%02X", b));
}
des = buf.toString().toLowerCase();
return des;
}
}
此工具类转自:Java MD5 加密工具类_LookingTomorrow的博客-CSDN博客_java md5加密工具类
/**
* @Role 字母+数字工具类
* @Author 赵平安
* @GMTCreate 2022年7月20日
* @Modifier 修改bug,且第一个set弃用
* @GMTModified 赵平安
* @ModifyContent 2022年7月28日
*/
public class LetterNumberUtil {
public static String gal(String LetterNumber,String name) {
//没有的时候填充
if (LetterNumber==null||LetterNumber.trim().isEmpty()){
return name+"000001";
}
//截取头部字母编号
StringBuffer head = new StringBuffer();
String[] split = LetterNumber.split("");
for (String s : split) {
if (!s.matches("^[0-9]*$")){
head.append(s);
}else break;
}
//截取尾部数字
String tail = LetterNumber.replaceAll(" ","").substring(head.length(), LetterNumber.replaceAll(" ","").length());
//尾部数字 +1
int num = Integer.valueOf(tail) + 1;
//填充 0
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < tail.length(); i++) {
buffer.append(0);
}
String number = buffer.toString();
//合并字符串
number = number + num;
//进位
if (tail.length()<String.valueOf(num).length()){
number = number.substring(number.length() - tail.length()-1, number.length());
}else number = number.substring(number.length() - tail.length(), number.length());
return head + number;
}
}
@MapperScan("com.zhao.mapper")//扫描我们的mapper文件夹
@EnableTransactionManagement //事务控制
@Configuration //配置类
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//注册乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
@Configuration
public class RedisConfig {
// 编写我们自己的 RedisTemplate,一般拿来用就行了
@Bean
@SuppressWarnings("all") //这tm是个坑,我现在不知道这个注释是干嘛的,但是下面这个注解和这串注解没有的话
// RedisConnectionFactory redisConnectionFactory 会爆红,下面这注解没有注释的话,就序列化不了
// @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//我们为了自己开发方便,一般直接使用类型
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// Json序列化配置
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 这个被弃用了,所以现在要用 activateDefaultTyping
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
// String 的序列化
RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Autowired
VoteLoginInterceptor voteLoginInterceptor;
@Autowired
AdminLoginInterceptor adminLoginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自己的拦截器,并设置拦截的请求路径
//addPathPatterns为拦截此请求路径的请求
//excludePathPatterns为不拦截此路径的请求
registry.addInterceptor(voteLoginInterceptor).addPathPatterns("/vote/voting2/**","/vote/whetherVoting/**","/vote/index/voting/**").excludePathPatterns("/static/**");
registry.addInterceptor(adminLoginInterceptor).addPathPatterns("/index/**").excludePathPatterns("/","/static/**","/index");
}
}
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
@Bean
//后台监控功能:相当于web.xml
//因为Springboot 内置了 servlet 容器,所以没有web.xml , 代替方法:ServletRegistrationBean
public ServletRegistrationBean StatViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
//后台需要有人登录,账号密码配置
HashMap<String, String> initParameters = new HashMap<>();
//增加配置
initParameters.put("loginUserName","admin");//登录的key是固定参数:loginUserName loginPassword
initParameters.put("loginPassword","123456");
//允许谁可以访问
// initParameters.put("allow","localhost");//仅允许本地登录
initParameters.put("allow","");//允许所有人登录
//禁止谁能访问
// initParameters.put("kuangshen","192.168.11.123");//禁止这个ip地址访问
bean.setInitParameters(initParameters);//设置初始化参数
return bean;
}
@Bean
//filter
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
//可以过滤哪些请求
HashMap<String, String> initParameters = new HashMap<>();
//这些东西不进行统计
initParameters.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParameters);
return bean;
}
}
/**
* @Role 跨域请求
* @Author 赵平安
* @GMTCreate 2022年7月21日
* @Modifier
* @GMTModified
* @ModifyContent
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //拦截所有请求
//是否发送Cookie,用于凭证请求, 默认不发送cookie。
.allowCredentials(true)
//出现的问题:当allowCredentials为真时,allowedorigin不能包含特殊值"*",因为不能在"访问-控制-起源“响应头中设置该值。要允许凭证到一组起源,显示地列出它们,或者考虑使用"allowedOriginPatterns”代替。
// .allowedOrigins("*") //可跨域的域名
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许跨域的方法,可以单独配置
//配置预检请求的有效时间, 单位是秒,表示:在多长时间内,不需要发出第二次预检请求。
.maxAge(1800)
//配置允许的自定义请求头,用于 预检请求。
.allowedHeaders("*")
.exposedHeaders("*");
}
}
@Slf4j
@Component
public class AdminLoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行前
* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
* 返回 true 表示继续向下执行,返回 false 表示中断后续操作
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("adminInfo");
if (loginUser == null) {
//未登录,返回登陆页
request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
request.getRequestDispatcher("/").forward(request, response);
return false;
} else {
//放行
return true;
}
}
/**
* 目标方法执行后
* 该方法在控制器处理请求方法调用之后、解析视图之前执行
* 可以通过此方法对请求域中的模型和视图做进一步修改
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// log.info("postHandle执行{}", modelAndView);
}
/**
* 页面渲染后
* 该方法在视图渲染结束后执行
* 可以通过此方法实现资源清理、记录日志信息等工作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// log.info("afterCompletion执行异常{}", ex);
}
}
@Slf4j //日志
@Component //一定不要忘记把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill.....");
this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill.....");
this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
}
}
/**
*
* 代码生成器(快速版本)
*
*
* @author 赵平安
* @since 2022-4-12 0022 16:51
*/
public class FastCodeGenerator {
// 基础信息配置
// 数据库连接字符
private static final String URL = "jdbc:mysql://127.0.0.1:3306/school_vote?useUnicode=true&serverTimezone=UTC&useSSL=false&characterEncoding=utf8";
// 数据库用户名
private static final String USERNAME = "root";
// 数据库密码
private static final String PASSWORD = "123456";
// 项目根路径。生成结果如:D:\MyProject\spring-boot
private static final String projectRootPath = System.getProperty("user.dir");
// 项目根路径(测试用,非通用)(此句是本项目测试用的。实际项目中,包括多模块项目,请注释掉此句,使用上句)
// private static final String projectRootPath = System.getProperty("user.dir") + "/study-mybatis-plus-fast-generator";
// 父包名。用于生成的java文件的import。
// private static final String parentPackageName = "com.cxhit.mybatisplus.generator";
private static final String parentPackageName = "com.zhao.projectname";
/**
* 执行此处
*/
public static void main(String[] args) {
// 简单示例,适用于单模块项目
simpleGenerator();
// 完整示例,适用于多模块项目
// completeGenerator();
}
/**
* 【单模块】简单的实现方案
*/
protected static void simpleGenerator() {
// 包路径
String packagePath = projectRootPath + "/src/main/java";
// XML文件的路径
String mapperXmlPath = projectRootPath + "/src/main/resources/Mybatis/mapper";
// 开始执行代码生成
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
// 1. 全局配置
.globalConfig(builder -> builder
// 作者名称
.author("赵平安")
// 开启覆盖已生成的文件。注释掉则关闭覆盖。
// .fileOverride()
// 禁止打开输出目录。注释掉则生成完毕后,自动打开生成的文件目录。
.disableOpenDir()
// 指定输出目录。如果指定,Windows生成至D盘根目录下,Linux or MAC 生成至 /tmp 目录下。
.outputDir(packagePath)
// 开启swagger2.注释掉则默认关闭。
// .enableSwagger()
// 指定时间策略。
.dateType(DateType.TIME_PACK)
// 注释时间策略。
.commentDate("yyyy-MM-dd")
)
// 2. 包配置
.packageConfig((scanner, builder) -> builder
// 设置父表名
.parent(parentPackageName)
// .moduleName(scanner.apply("请输入模块名:"))
// mapper.xml 文件的路径。单模块下,其他文件路径默认即可。
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperXmlPath))
//改实体类名字为pojo
.entity("pojo")
)
// 3. 策略配置
.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?生成所有表,请输入[all]:")))
// 阶段1:Entity实体类策略配置
.entityBuilder()
// 开启生成实体时生成字段注解。
// 会在实体类的属性前,添加[@TableField("nickname")]
.enableTableFieldAnnotation()
// 逻辑删除字段名(数据库)。
.logicDeleteColumnName("deleted")
// 逻辑删除属性名(实体)。
// 会在实体类的该字段属性前加注解[@TableLogic]
.logicDeletePropertyName("deleted")
// 乐观锁
.versionColumnName("version")
.versionPropertyName("version")
// 会在实体类的该字段上追加注解[@TableField(value = "create_time", fill = FieldFill.INSERT)]
.addTableFills(new Column("create_time", FieldFill.INSERT))
// 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)]
.addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
// 阶段2:Mapper策略配置
.mapperBuilder()
// 开启 @Mapper 注解。
// 会在mapper接口上添加注解[@Mapper]
.enableMapperAnnotation()
// 启用 BaseResultMap 生成。
// 会在mapper.xml文件生成[通用查询映射结果]配置。
.enableBaseResultMap()
// 启用 BaseColumnList。
// 会在mapper.xml文件生成[通用查询结果列 ]配置
.enableBaseColumnList()
// 阶段4:Controller策略配置
.controllerBuilder()
// 会在控制类中加[@RestController]注解。
.enableRestStyle()
// 开启驼峰转连字符
.enableHyphenStyle()
.build()
)
// 4. 模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
//.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())
// 5. 执行
.execute();
}
/**
* 【多模块使用】完整的实现方案
*/
protected static void completeGenerator() {
//【1】基础信息配置
// 指定模块名,用于生成的java文件的import。
String moduleName = scanner("请输入模块名:");
// 六个文件的路径。多模块项目下,一般来说每个文件的路径都是不同的(根据项目实际,可能在不同的模块下)。
String entityPath = projectRootPath + "/project-entity/src/main/java/com/yourdomain/projectname/entity/" + moduleName;
String mapperPath = projectRootPath + "/project-dao/src/main/java/com/yourdomain/projectname/mapper/" + moduleName;
String mapperXmlPath = projectRootPath + "/project-dao/src/main/resources/mapper/" + moduleName;
String servicePath = projectRootPath + "/project-service/src/main/java/com/yourdomain/projectname/service/" + moduleName;
String serviceImplPath = projectRootPath + "/project-service/src/main/java/com/yourdomain/projectname/service/" + moduleName + "/impl";
String controllerPath = projectRootPath + "/project-controller/src/main/java/com/yourdomain/projectname/controller/" + moduleName;
// 关于以上写法的解释:
// --- 假设我们的项目有四个模块:project-entity、project-dao、project-service、project-controller
// --- project-entity 的包路径:com.yourdomain.projectname.eneity,
// ---则生成system模块下的sys_user表,生成的实体文件将放在:com.yourdomain.projectname.entity.system包下,SysUser.java。
// --- project-dao 的包路径:com.yourdomain.projectname.mapper,
// ---则生成system模块下的sys_user表,生成的mapper接口文件将放在:com.yourdomain.projectname.mapper.system包下,类名为:SysUserMapper.java。
// --- 其他文件以此类推,即每个模块放MVC结构中对应的类型文件。
// --- 注意:这里最后的文件路径修改了,下文配置中的【2 包配置】中的包路径也要同步修改!否则生成的java文件,首句import会报错。原因是路径错误。
// 【2】开始执行代码生成
FastAutoGenerator.create(URL, USERNAME, PASSWORD)
// 1. 全局配置
.globalConfig(builder -> builder
// 作者名称
.author("赵平安")
// 开启覆盖已生成的文件。注释掉则关闭覆盖。请谨慎开启此选项!
// .fileOverride()
// 禁止打开输出目录。注释掉则生成完毕后,自动打开生成的文件目录。
.disableOpenDir()
// 指定输出目录。多模块下,每个类型的文件输出目录不一致,在包配置阶段配置。
// .outputDir(packagePath)
// 开启swagger2。注释掉则默认关闭。
// .enableSwagger()
// 开启 kotlin 模式。注释掉则关闭此模式
// .enableKotlin()
// 指定时间策略。
.dateType(DateType.TIME_PACK)
// 注释时间策略。
.commentDate("yyyy-MM-dd")
)
// 2. 包配置
.packageConfig((scanner, builder) -> builder
// 阶段1:各个文件的包名设置,用来拼接每个java文件的第一句:package com.XXX.XXX.XXX.xxx;
// 父包名配置
.parent(parentPackageName)
// 输入模块名。此模块名会在下面的几个包名前加。多模块项目,请根据实际选择是否添加。
// .moduleName(moduleName)
.entity("entity." + moduleName)
.mapper("mapper." + moduleName)
.service("service." + moduleName)
.serviceImpl("service." + moduleName + ".impl")
.controller("controller." + moduleName)
.other("other")
// 阶段2:所有文件的生成路径配置
.pathInfo(
new HashMap<OutputFile, String>() {{
// 实体类的保存路径
put(OutputFile.entity, entityPath);
// mapper接口的保存路径
put(OutputFile.mapper, mapperPath);
// mapper.xml文件的保存路径
put(OutputFile.xml, mapperXmlPath);
// service层接口的保存路径
put(OutputFile.service, servicePath);
// service层接口实现类的保存路径
put(OutputFile.serviceImpl, serviceImplPath);
// 控制类的保存路径
put(OutputFile.controller, controllerPath);
}}
)
)
// 3. 策略配置【请仔细阅读每一行,根据项目实际项目需求,修改、增删!!!】
.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?生成所有表,请输入[all]:")))
// 阶段1:Entity实体类策略配置
.entityBuilder()
// 设置父类。会在生成的实体类名后:extends BaseEntity
// .superClass(BaseEntity.class)
// 禁用生成 serialVersionUID。(不推荐禁用)
// .disableSerialVersionUID()
// 开启生成字段常量。
// 会在实体类末尾生成一系列 [public static final String NICKNAME = "nickname";] 的语句。(一般在写wapper时,会用到)
// .enableColumnConstant()
// 开启链式模型。
// 会在实体类前添加 [@Accessors(chain = true)] 注解。用法如 [User user=new User().setAge(31).setName("snzl");](这是Lombok的注解,需要添加Lombok依赖)
// .enableChainModel()
// 开启 lombok 模型。
// 会在实体类前添加 [@Getter] 和 [@Setter] 注解。(这是Lombok的注解,需要添加Lombok依赖)
// .enableLombok()
// 开启 Boolean 类型字段移除 is 前缀。
// .enableRemoveIsPrefix()
// 开启生成实体时生成字段注解。
// 会在实体类的属性前,添加[@TableField("nickname")]
.enableTableFieldAnnotation()
// 逻辑删除字段名(数据库)。
.logicDeleteColumnName("deleted")
// 逻辑删除属性名(实体)。
// 会在实体类的该字段属性前加注解[@TableLogic]
.logicDeletePropertyName("deleted")
// 数据库表映射到实体的命名策略(默认下划线转驼峰)。一般不用设置
// .naming(NamingStrategy.underline_to_camel)
// 数据库表字段映射到实体的命名策略(默认为 null,未指定按照 naming 执行)。一般不用设置
// .columnNaming(NamingStrategy.underline_to_camel)
// 添加父类公共字段。
// 这些字段不会出现在新增的实体类中。
.addSuperEntityColumns("id", "delete_time")
// 添加忽略字段。
// 这些字段不会出现在新增的实体类中。
// .addIgnoreColumns("password")
// 添加表字段填充
// 会在实体类的该字段上追加注解[@TableField(value = "create_time", fill = FieldFill.INSERT)]
.addTableFills(new Column("create_time", FieldFill.INSERT))
// 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)]
.addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
// 全局主键类型。如果MySQL主键设置为自增,则不需要设置此项。
// .idType(IdType.AUTO)
// 格式化文件名称。
// 如果不设置,如表[sys_user]的实体类名是[SysUser]。设置成下面这样,将是[SysUserEntity]
// .formatFileName("%sEntity")
// 阶段2:Mapper策略配置
.mapperBuilder()
// 设置父类
// 会在mapper接口方法集成[extends BaseMapper]
// .superClass(BaseMapper.class)
// 开启 @Mapper 注解。
// 会在mapper接口上添加注解[@Mapper]
.enableMapperAnnotation()
// 启用 BaseResultMap 生成。
// 会在mapper.xml文件生成[通用查询映射结果]配置。
.enableBaseResultMap()
// 启用 BaseColumnList。
// 会在mapper.xml文件生成[通用查询结果列 ]配置
.enableBaseColumnList()
// 设置缓存实现类
// .cache(MyMapperCache.class)
// 格式化 mapper 文件名称。
// 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper]。写成下面这种形式后,将变成[SysUserDao]。
// .formatMapperFileName("%sDao")
// 格式化 xml 实现类文件名称。
// 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper.xml],写成下面这种形式后,将变成[SysUserXml.xml]。
// .formatXmlFileName("%sXml")
// 阶段3:Service策略配置
// .serviceBuilder()
// 设置 service 接口父类
// .superServiceClass(BaseService.class)
// 设置 service 实现类父类
// .superServiceImplClass(BaseServiceImpl.class)
// 格式化 service 接口文件名称
// 如果不设置,如表[sys_user],默认的是[ISysUserService]。写成下面这种形式后,将变成[SysUserService]。
// .formatServiceFileName("%sService")
// 格式化 service 实现类文件名称
// 如果不设置,如表[sys_user],默认的是[SysUserServiceImpl]。
// .formatServiceImplFileName("%sServiceImpl")
// 阶段4:Controller策略配置
.controllerBuilder()
// 设置父类。
// 会集成此父类。
// .superClass(BaseController.class)
// 开启生成 @RestController 控制器
// 会在控制类中加[@RestController]注解。
.enableRestStyle()
// 开启驼峰转连字符
.enableHyphenStyle()
// 最后:构建
.build()
)
//模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
//.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())
// 执行
.execute();
}
// 处理 all 情况
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
/**
*
* 读取控制台内容
*
*/
private static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入").append(tip).append(":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
}
Git使用详解全图文(基于gitee),看这一篇就够了_我认不到你的博客-CSDN博客_git的使用
# Compiled class file
*.class
# Eclipse
.project
.classpath
.settings/
# Intellij
*.ipr
*.iml
*.iws
.idea/
# Maven
target/
# Gradle
build
.gradle
# Log file
*.log
log/
# out
**/out/
# Mac
.DS_Store
# others
*.jar
*.war
*.zip
*.tar
*.tar.gz
*.pid
*.orig
temp/
Swagger3+knife4j的使用_我认不到你的博客-CSDN博客
使用Docker搭建分布式文件存储系统MinIO
jenkins使用docker安装保姆级教程(面向小白教程,最新最全,全图文)2022-8-1,不会docker也没关系
使用jenkins+gitee创建docker镜像并运行
JAVA操作Excel(POI、easyPOI、easyExcel)