Java常见问题解决方案


唯有热爱,可抵岁月长河


基础

String

contains()

contains() 方法用于判断字符串中是否包含指定的字符或字符串。

String name= "123";
Boolean flag = name.contains("2");
valueOf()

valueOf() 方法用于返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等

// 数字转字符串
String s = String.valueOf(2)

Int

valueOf()

valueOf() 方法用于返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等

// 字符串转数字
Integer b = Integer.valueOf("444",16);   // 使用 16 进制

Object


面向对象


异常


泛型


反射


序列化与反序列化


语法糖





集合

List

添加元素
// add() 将元素插入到指定位置的 arraylist 中
ArrayList<Integer> myNumbers = new ArrayList<Integer>();
myNumbers.add(33);

// addAll() 添加集合中的所有元素到 arraylist 中

// Collections.addAll(); 拼接多个字符串到数组中
Collections.addAll(myNumbers , 33, 44);
删除元素
// remove() 删除 arraylist 里的单个元素
myNumbers.remove(33);

// subList() 截取部分 arraylist 的元素
// clear() 删除 arraylist 中的所有元素
List<String> subList = myNumbers.subList(myNumbers.size() - 1, fileDatum.size());
subList.clear();
System.out.println(myNumbers);
List 转 Set
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
 
Set<Integer> set = new HashSet<>(list);
去重
// 方法一(会导致顺序改变)
List<T> list = ...; // 原始List
Set<T> set = new HashSet<>(list);
List<T> resultList = new ArrayList<>(set);

// 方法二
List<T> list = ...; // 原始List
List<T> resultList = list.stream().distinct().collect(Collectors.toList());

// 方法三
List<T> list = ...; // 原始List
Set<T> set = new LinkedHashSet<>(list);
List<T> resultList = new ArrayList<>(set);

Set

Set 转 List
Set<String> set = new HashSet<>();
List<String> list = new ArrayList<>(set);

// addAll()
Set<String> set = new HashSet<>();
List<String> list = new ArrayList<>();
list.addAll(set);

Queue


Map





Tree

数据处理

递归
  @Override
    public void createTree() {
        List<Tree> tree = getTree();
    }

    /**
     * 获取树数据
     * @return
     */
    public List<Tree> getTree() {
        //获取所有符合条件数据
        List<Tree> all = treeDao.getAll();
        //获取所有根节点
        List<Tree> rootNode = treeDao.getRootNode();

        //通过根节点一层一层的找到所有子节点
        for (Tree tree : rootNode) {
            getTreeChildren(all, tree);
        }
        return rootNode;
    }

    /**
     * 处理树数据,递归
     *
     * @param listA
     * @return
     */
    public void getTreeChildren(List<Tree> listA, Tree tree) {
        // 每次执行删除父节点,提高效率,防止死循环
        listA.remove(tree);
        // 获取每一个父节点的下级节点List
        for (Tree tree2 : listA) {
            if (tree.getId().equals(tree2.getParentId())) {
                tree.getChildren().add(tree2);
            }
        }

        // 递归获取树数据
        if (tree.getChildren() != null && tree.getChildren().size() != 0) {
            for (Tree tree3 : tree.getChildren()) {
                getTreeChildren(listA, tree3);
            }
        }

    }



数据库

SQL

数据定义

数据操作
ForEach
<!--批量插入-->
<insert id="saveForEach" parameterType="java.util.List">
    INSERT INTO table_name (
    id,
    name,
    ref_id)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (
        #{item.id},
        #{item.name},
        #{item.refId},
        )
    </foreach>
</insert>

<!--批量删除-->
<delete id="deleteForEach">
    delete from
    table_name 
    where
    ref_id
    in
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item.refId}
    </foreach>
</delete>

数据查询
count
	<select id="select" resultType="xx.vo.XxVO">
		select
			count(1)
		from
			table_name 
	</select>
select
	<select id="select" resultType="xx.vo.XxVO">
		select
			*
		from
			table_name 
	</select>
WHERE

用于过滤记录。

	<select id="select" resultType="xx.vo.XxVO">
		select
		*
		from
		table_name 
		where
		1 = 1
		<if test="name != null and name != '' ">
			and name = #{name}
		</if>
		<if test="refId != null and refId != '' ">
			and ref_id = #{refId}
		</if>
		
		-- 日期过滤
        <if test='timeFrom != null and !"".equals(timeFrom)'>
            and upd_dtm <![CDATA[>=]]> #{timeFrom}
        </if>
        <if test='timeTo != null and !"".equals(timeTo)'>
            and upd_dtm <![CDATA[<=]]> #{timeTo}
        </if>
	</select>
ORDER BY

关键字用于对结果集进行排序。

    <select id="select">
        SELECT
        *
        FROM
        table_name 
        order by
        creat_time
        
        -- string 转 int
        -- cast(policy_version as UNSIGNED INTEGER) desc
    </select>
GROUP BY

GROUP BY 语句可结合一些聚合函数来使用

	<select id="select" resultType="xx.vo.XxVO">
		select
		*
		from
		table_name 
        GROUP BY
        version
	</select>

LIKE
	<select id="select" resultType="xx.vo.XxVO">
		SELECT
			*
		FROM
			table_name 
		WHERE
		<if test="name != null and name != ''">
			name LIKE CONCAT('%',#{name},'%')
		</if>
	</select>

page
	<select id="select" resultType="xx.vo.XxVO">
		SELECT
			*
		FROM
			table_name 
		<bind name="pageNow" value="(pageNum-1)*pageSize"></bind>
		ORDER BY last_update_time DESC
		LIMIT #{pageNow},#{serviceSyncQuery.pageSize}
	</select>

JOIN

在这里插入图片描述

inner join / join:
关键字在表中存在至少一个匹配时返回行

	<select id="select" resultType="xx.vo.XxVO">
	 SELECT column_name(s) FROM table_name tn1
	 JOIN
	 	table_name2 tn2 ON tn1.name = tn2.name;
		SELECT
			*
		FROM
			table_name tn1
		JOIN
			table_name2 tn2 ON tn1.name = tn2.name;
	</select>

left join:
关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

	<select id="select" resultType="xx.vo.XxVO">
	 SELECT column_name(s) FROM table_name tn1
	 JOIN
	 	table_name2 tn2 ON tn1.name = tn2.name;
		SELECT
			*
		FROM
			table_name tn1
		LEFT JOIN
			table_name2 tn2 ON tn1.name = tn2.name;
	</select>

数据控制

Mysql


Redis





工具类

BeanUtils

BeanUtils是一个Java类库,用于简化Java Bean对象之间的属性拷贝和赋值操作

BeanUtils.copyProperties(destination, source);

BeanUtils还提供了一些其他的方法,例如getProperty()、setProperty()、populate()等等,可以用于获取属性值、设置属性值、批量设置属性值等操作。

String value = BeanUtils.getProperty(bean, "propertyName");
BeanUtils.setProperty(bean, "propertyName", "value");

Stream流

Stream(流)是Java 8引入的新特性,它是一种处理集合数据的高级抽象概念。Stream流提供了一种更为简洁、强大和易于使用的方式来操作数据集合,可以进行过滤、映射、排序、聚合等各种操作,同时还支持并行处理,提高了代码的可读性和性能。

// 映射
List<VO> VOList = DTOMapper.getAllList();
List<=DTO> collect = VOList.stream().map(VO -> new DTO(VO.getCode(), VO.getId())).collect(Collectors.toList());

Util

UUID

UUID 是指Universally Unique Identifier,翻译为中文是通用唯一识别码,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息。

// 生成随机数
String.valueOf(UUID.randomUUID())

Time

引用的类主要包括:

import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.Period;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
具体使用方式
// LocalDate获取当前日期
LocalDate nowDate = LocalDate.now();
System.out.println("结果:" + nowDate);// 结果:2020-04-11

// LocalTime获取当前时间
LocalTime nowTime = LocalTime.now();
System.out.println("结果:" + nowTime);// 结果:18:51:28.986

// LocalDateTime获取当前日期和时间
LocalDateTime nowDateTime = LocalDateTime.now();                    
System.out.println("结果:" + nowDateTime);// 结果:2020-04-11T16:49:16.14

// 获取毫秒数
Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
System.out.println("结果:" + milliSecond);// 结果:1586595065304
LocalDateTime与String互转
// 时间转字符串格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");                                 
String dateTime1 = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);                                   System.out.println("结果:" + dateTime1);// 结果:20200411165517709                                                   

// 时间格式化2
LocalDate localDate2 = LocalDate.of(2019,9,10);                                                               
String s1 = localDate2.format(DateTimeFormatter.BASIC_ISO_DATE);
String s2 = localDate2.format(DateTimeFormatter.ISO_LOCAL_DATE);

// 自定义格式化
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");                                              
String s3 = localDate2.format(dtf);            
                                                                 
// 时间格式化2:2019-09-10 20190910 2019-09-10 10/09/2019
System.out.println("时间格式化2:" + localDate2 + "  " + s1 + "  " + s2 + "  " + s3);

// 字符串转时间
String dateTimeStr = "2018-07-28 14:11:15";                                                                     
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");                                      
LocalDateTime dateTime2 = LocalDateTime.parse(dateTimeStr, df);                                                 
System.out.println("结果:" + dateTime2);// 结果:2018-07-28T14:11:15      
LocalDateTime格式化
LocalDateTime time = LocalDateTime.now();
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String strDate = dtf2.format(time);
System.out.println("结果:" + strDate);// 结果:2020-04-11 17:12:45



Mybaits

增删改查





Mybaits-plus

增删改查

实体类
/**
 * xx实体类
 */
@TableName("demo_table")
public class DemoTableEntity implements Serializable {

    /**
     * ID
     */
    @TableId
    private String demoId;

    /**
     * 名称
     */
    private String demoName;

    public String getDemoId() {
        return demoId;
    }

    public void setDemoId(String demoId) {
        this.demoId= demoId;
    }

    public String getDemoName() {
        return demoName;
    }

    public void setDemoName(String demoName) {
        this.demoName= demoName;
    }
}

Controller
@RestController
@RequestMapping("/demoTable")
public class DemoTableController extends BaseController {

    @Autowired
    private DemoTableService demoTableService;

    /**
     * 新增
     * @param demoTableEntity
     * @return
     */
    @PostMapping("/save")
    public AjaxResult save(@RequestBody DemoTableEntity demoTableEntity){
        return toAjax(demoTableService.save(demoTableEntity));
    }

    /**
     * 修改
     * @param demoTableEntity
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody DemoTableEntity demoTableEntity){
        return toAjax(demoTableService.update(demoTableEntity));
    }

    /**
     * 查询列表
     * @param demoTableEntity
     * @return
     */
    @GetMapping("/selectList")
    public TableDataInfo selectList(DemoTableEntity demoTableEntity){
        startPage();
        List<DemoTableEntity> list = demoTableService.selectList(demoTableEntity);
        return getDataTable(list);
    }

    /**
     * 删除
     * @param id
     * @return
     */
    @DeleteMapping("/delete/{id}")
    public AjaxResult deleteById(@PathVariable String id){
        return toAjax(demoTableService.deleteById(id));
    }
}

Service
public interface DemoTableService {

    /**
     * 新增服务实例
     * @param demoTableEntity
     * @return
     */
    Integer save(DemoTableEntity demoTableEntity);

    /**
     * 修改服务实例
     * @param demoTableEntity
     * @return
     */
    Integer update(DemoTableEntity demoTableEntity);

    /**
     * 查询服务实例列表
     * @param demoTableEntity
     * @return
     */
    List<DemoTableEntity> selectList(DemoTableEntity demoTableEntity);

    /**
     * 根据id删除服务实例
     * @param id
     * @return
     */
    Integer deleteById(String id);
}

ServiceImpl
@Service
public class DemoTableServiceImpl implements DemoTableService {

    @Autowired
    private DemoTableMapper demoTableMapper;

    /**
     * 新增服务实例
     * @param demoTableEntity
     * @return
     */
    @Override
    public Integer save(DemoTableEntity demoTableEntity){
        return demoTableMapper.insert(demoTableEntity);
    }

    /**
     * 修改
     * @param demoTableEntity
     * @return
     */
    @Override
    public Integer update(DemoTableEntity demoTableEntity){
        UpdateWrapper<DemoTableEntity> wrapper = new UpdateWrapper<>();
        return demoTableMapper.update(demoTableEntity, wrapper);
    }

    /**
     * 查询列表
     * @param demoTableEntity
     * @return
     */
    @Override
    public List<DemoTableEntity> selectList(DemoTableEntity demoTableEntity){
        QueryWrapper queryWrapper = new QueryWrapper();
        return demoTableMapper.selectList(queryWrapper);
    }

    /**
     * 根据id删除
     * @param id
     * @return
     */
    @Override
    public Integer deleteById(String id){
        return demoTableMapper.deleteById(id);
    }

}

Mapper
public interface DemoTableMapper extends BaseMapper<DemoTableEntity> {

}




注解

1. @MapperScan

bug场景: 访问 Controller 的接口返回404

// 解决方案: 启动类添加 @MapperScan注解
@MapperScan("com.gientech.armp.empower.mapper.*")

@MapperScan 注解指定了 Mapper 接口所在的包路径为 com.gientech.armp.empower.mapper。这样,在应用启动时,Spring Boot 就会自动扫描该包下的所有 Mapper 接口,并将其实例化后交给 Spring 容器管理。




开发工具

Maven


Git


Gradle


Docker


IDEA






操作系统

Linux

部署
# 解压 tar包
tar -zxvf xx.tar.gz

#启动项目
./start.sh(bin目录下)

# 查看日志
tail -1000f xx.txt

# 重启nginx
./nginx -s reload





开发框架

Spring


SpringBoot





分布式

网关


分布式ID


分布式锁


分布式事物


配置中心





性能优化

CND


负载均衡


数据库优化





高可用

xx





IO

xx




并发

xx





  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后海 0_o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值