首次使用JNPF开发功能
在IDEA上开发本系统需要的插件
mybatis插件,mybatis-plus插件、lombok插件
springboot注解代码解读
Controller层注解
Service层注解
相当于在每个方法上都加了@Transactional
或者在单独方法上添加事务注解,会覆盖类上的事务注解
- 错误使用
- 默认配置下,spring 只有在抛出的异常为运行时 unchecked 异常时才回滚该事务,也就是抛出的异常为RuntimeException 的子类(Errors也会导致事务回滚),而抛出 checked 异常则不会导致事务回滚 。可通过 @Transactional rollbackFor进行配置。
- 接口中A、B两个方法,A无@Transactional标签,B有,上层通过A间接调用B,此时事务不生效。
- 多线程下事务管理因为线程不属于 spring 托管,故线程不能够默认使用 spring 的事务,也不能获取spring 注入的 bean 。在被 spring 声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。一个使用了@Transactional 的方法,如果方法内包含多线程的使用,方法内部出现异常,不会回滚线程中调用方法的事务。
- 更多参考@Transactional 详解
@Transactional 详解_愿我如星君如月 ... 夜夜流光相皎洁 ...-CSDN博客_@transactional
数据源配置
创建一个配置类
配置类中在类上添加注解,在类中一般包含@bean注解的方法,示例如下:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
StringRedisSerializer serializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<Object> jackson = new Jackson2JsonRedisSerializer<>(Object.class);
template.setValueSerializer(jackson);
template.setHashValueSerializer(jackson);
template.setKeySerializer(serializer);
template.setHashKeySerializer(serializer);
return template;
}
}
创建一个环境变量配置文件
spring:
datasource: mysql
mysql:
type: com.alibaba.druid.pool.xa.DruidXADataSource
druid:
system:
dbname: jnpf_test
url: jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
username: mysql
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
@Data
@Component
public class DataSourceUtil {
//数据库类型
@Value("${spring.datasource}")
private String dataSource;
//=====================================mysql
//驱动包
@Value("${spring.mysql.druid.system.driver-class-name}")
private String mysqlDriverClassName;
//库名
@Value("${spring.mysql.druid.system.dbname}")
private String mysqlDbName;
//数据连接字符串
@Value("${spring.mysql.druid.system.url}")
private String mysqlUrl;
//账号
@Value("${spring.mysql.druid.system.username}")
private String mysqlUserName;
//密码
@Value("${spring.mysql.druid.system.password}")
private String mysqlPassword;
}
实体类规范
创建一个枚举类
枚举类
/**
* 日志等级
*
* @author JNPF开发平台组
* @version V3.0.0
* @copyright 引迈信息技术有限公司
* @date 2019年9月26日 上午9:18
*/
public enum LogLevelEnum implements AbstractBaseExceptionEnum {
Error(0,"错误"),
Success(1,"成功"),
Warning(2,"警告");
private int code;
private String message;
LogLevelEnum(int code, String message){
this.code = code;
this.message = message;
}
@Override
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
/**
* 根据状态code获取枚举名称
* @return
*/
public static String getMessageByCode(Integer code) {
for (LogLevelEnum status : LogLevelEnum.values()) {
if (status.getCode().equals(code)) {
return status.message;
}
}
return null;
}
/**
* 根据状态code获取枚举值
* @return
*/
public static LogLevelEnum getByCode(Integer code) {
for (LogLevelEnum status : LogLevelEnum.values()) {
if (status.getCode().equals(code)) {
return status;
}
}
return null;
}
}
枚举类应用
示例
LogSortEnum.Error.getCode();
LogSortEnum.Error.getMessage();