java API
事务
- 手动提交事务
@Autowired
private PlatformTransactionManager transactionManager;// 引入 (平台)事务管理器,Spring 事务策略的核心。
@Autowired
private TransactionDefinition transactionDefinition;
@RequestMapping("/transactionManager")
public R transactionManager(){
TransactionStatus transactionStatusSaveData1 = transactionManager.getTransaction(transactionDefinition);
MemberEntity memberEntity = new MemberEntity();
memberEntity.setUsername("transactionManager");
try {
memberService.save(memberEntity);
int i = 1/0;
transactionManager.commit(transactionStatusSaveData1);
}catch (Exception e){
e.printStackTrace();
transactionManager.rollback(transactionStatusSaveData1 );
}
return R.ok();
}
枚举
链接: 传送门
- 定义一些字符串类型的常量,并且只在这个类中使用
- 现成代码
public enum ComputeModeEnum {
/**
* 增值服务费-前置费用计算方式枚举
*/
COMPUTE_MODE1(1,"按费率"),
COMPUTE_MODE2(2,"按费率区间"),
COMPUTE_MODE3(3,"按金额"),
COMPUTE_MODE4(4,"按金额区间");
/**
* 编码
*/
private final Integer code;
/**
* 名称
*/
private final String name;
ComputeModeEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public Integer getCode() {
return code;
}
public String getName() {
return name;
}
/**
* 根据编码获名称
* @param code
* @return String
*/
public static String getNameByCode(Integer code){
for (ComputeModeEnum value : ComputeModeEnum.values()) {
if(value.getCode().equals(code)){
return value.getName();
}
}
return null;
}
}
日期
☆、得到当天最小时间和第二天最大时间
☆、java8日期转换用DateTimeFormatter
- 实体类日期注解
// 转换给前端需要的类型
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
// Spring框架本身所有,将前端传来的字符串类型的日期转为后台需要的时间类型结果
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
范型
范型类
☆、当创建一个类时,类里面的参数类型不确定时,就可以使用范型类。
☆、泛型类中的参数可以随便写为任意标识,常见的如T、E、K、V等。
范型接口
参考文章
☆、当很多实现类的处理逻辑差不多,只是参数类型不一样,就可以使用范型接口。
☆、范型接口的参数是指在接口和实现类中可以使用的参数类型。
范型方法
☆、当返回值类型不确定时使用。
☆、public 与 返回值中间非常重要,只有声明了的方法才是泛型方法。
☆、泛型类中的使用了泛型的成员方法并不是泛型方法。
☆、示例:
public <T> T t2(){
T couponResult = (T) new CouponResult("123","123");
return couponResult;
}
占位符(通配符)
☆、List<?> list = findAllList(xxx);
1.?作对象的泛型来用。
2.为了保证类型安全,不允许对通配符类型进行类似add的操作。
☆、List<? extends Fruit> fruits
1.上限通配符,用来限制元素的类型的上限。
2.表示集合中的元素类型上限为Fruit类型,即只能是Fruit或者Fruit的子类。
☆、List<? super Apple> apples
1.下限通配符 ,用来限制元素的类型下限。
2.表示集合中的元素类型下限为Apple类型,即只能是Apple或Apple的父类。
spring
SpringUtils.getBean()
☆、springboot默认扫描启动类所在的包及其子包,有的场景扫描不到:模块嵌套,想要嵌套模块里面的service对象。
☆、ruoyi-vue里面有SpringUtils这个工具类。
☆、示例:
SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
ApplicationContext.getBeansOfType
- 接口的多实现类动态调用
- 参考博客
设置上下文路径
server:
servlet:
context-path:/api/demo
spring.factories文件
其它
TypeReference
String jsonString = JSON.toJSONString(r.get("memberEntity"));
MemberResponseVo memberResponseVo = JSON.parseObject(jsonString, new TypeReference<MemberResponseVo>() {});
Map<String, List<Catalog2Vo>> listMap = JSON.parseObject(catalogJson, new TypeReference<Map<String, List<Catalog2Vo>>>() {});
SeckillSkuInfoVo skuInfo = r.getData("skuInfo", new TypeReference<SeckillSkuInfoVo>() {});
optional
一、作用
1.对象为null时做处理,简化if else代码。
2.类似于steam流的过滤处理。
二、参考博客
三、文档缺失方法补充
- optional.isPresent():判断optional是否为空,如果空则返回false,否则返回true。
- optional.orElseGet(Supplier other):如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other。(拓展:optional.orElse(Supplier other) optional为空不为空都会执行)
- optional.ifPresentOrElse(System.out::println, () -> System.out.println(“Null”));
对象嵌套
1.设计模式-责任链模式里面有对象嵌套新写法,当嵌套的对象是自己或者自己的子类时适合使用。在itstack-demo-design-13-02 ApiTest里面。
2.备忘录模式里面有一种思想,想在一个对象里面做拓展但是不想改变原有对象,可以新建一个类,把那个对象作为这个类的属性,用这个类里面做拓展。
JSR303校验集合
- 在Controller上添加@Validated注解,方法上添加@Valid注解
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
MapStruct
- 使用的版本:1.5.1.Final
- 类命名:FinanceCustAfterValueaddFeeConvertMapper
使用指南 - pom.xml文件配置注意点
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.3.RELEASE</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<!-- 使用lombok注意冲突,maven-compiler-plugin要3.6以上,lombok使用1.16.16版本以上,需要配置lombok的path -->
<!--不加这个最后的拷贝对象没有值-->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.1.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</path>
</annotationProcessorPaths>
<!--作用未知-->
<!-- <showWarnings>true</showWarnings>-->
<!-- <compilerArgs>-->
<!-- <arg>-->
<!-- -Amapstruct.suppressGeneratorTimestamp=true-->
<!-- </arg>-->
<!-- <arg>-->
<!-- -Amapstruct.suppressGeneratorVersionInfoComment=true-->
<!-- </arg>-->
<!-- </compilerArgs>-->
</configuration>
</plugin>
</plugins>
</build>
Guava Cache本地缓存
private static final Cache<String,SendTemplate> SEND_TEMPLATE_CACHE = CacheBuilder.newBuilder()
.maximumSize(20).expireAfterAccess(30,TimeUnit.DAYS).build();
代码计时
- StopWatch
Http请求
RestTemplate
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setConnectTimeout(5000);
requestFactory.setReadTimeout(10000);
restTemplate.setRequestFactory(requestFactory);
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
if (messageConverters != null) {
Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();
while (iterator.hasNext()) {
HttpMessageConverter<?> httpMessageConverter = iterator.next();
if (httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
}
}
}
return restTemplate;
}
}
容易遗忘的知识点
线程
☆、线程睡眠
TimeUnit.SECONDS.sleep(1);
集合
☆、遍历
Iterator iterator = productList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().getName());
}
☆、获取map里面的key并弄成一个集合
Iterator iterator = configAttributeMap.keySet().iterator();
☆、声明一个map并且直接赋值
Map<String,String> m = new HashMap<String,String>(){{
put("consigneeUserName", "谢飞机");
put("consigneeUserPhone", "15200292123");
put("consigneeUserAddress", "吉林省.长春市.双阳区.XX街道.檀溪苑小区.#18-2109");
}};
mybatis plus相关
☆、可以在service实现类中使用baseMapper,因为所有的dao都继承了它。
☆、mybatis配置类上要加上@EnableTransactionManagement ,开启事务。
☆、dao类中的参数上要加上@Param注解,才能在xml文件中通过#{name}拿到。
void updateCategory(@Param("catId") Long catId, @Param("name") String name);
UPDATE `pms_category_brand_relation` SET catelog_name=#{name} WHERE catelog_id=#{catId}
接收对象时可以不加,对应xml文件中的写法#{carrierUrl};接收对象时加,对应xml文件中的写法#{对象.carrierUrl}。
☆、IdWorker,根据时间生成一个全局唯一的长整形ID,支持分布式环境下的使用。idworker采用了Snowflake算法,并在此基础上增加了奇偶抖动功能,避免在低并发的环境下生成全是偶数的情况。
String orderSn = IdWorker.getTimeId(); //202112311138373651476759672152133634
注解
☆、JsonInclude(JsonInclude.Include.NON_EMPTY) 标记在实体的字段上,如果这个字段是空的,就不会返回到前端了
☆、spring.factories文件
1.@EnableAutoConfiguration注解来注册项目包外的bean,spring.factories文件加载注册项目包外的bean。
mysql
1.一个service中有多条操作数据库的代码,要等程序全部执行完之后才能在数据库中看到,可以通过执行下面的sql,程序不执行玩就能看到:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
但是它对于当前的事务窗口生效,如果想要设置全局的,需要加上global字段(没试过)
BigDecimal
☆、保留两位小数,多出的向上进入
BigDecimal payAmount = orderEntity.getPayAmount().setScale(2, BigDecimal.ROUND_UP);
工具代码
- 去除json里面的 \ 和{}外面的双引号
data = data.replaceAll("\\\\", "").replaceAll("\"\\{", "{").replaceAll("\\}\"", "}");