关于Java后端的问题汇总

1.int和String的相互转换

1.1 int to String 
		String str = String.valueOf(i)
		String str = Integer.toString(i)
		String str = "" + i
	1.2 String to int
		int i = Integer.parseInt(str)
		int i = Integer.valueOf(str).intValue()

2.关于oracle数据库无法使用表别名的情况:检查是否是建表时将字段加上了双引号导致。
3.后台自动生成uuid:

PrimaryKeyTool.generalUUIDPrimaryKey()
	前端生存UUID:
	guidSingle(){
        return (((1+Math.random())*0x10000)|0).toString(16).substring(1)
    },
	guid(){
		return (this.guidSingle()+this.guidSingle()+this.guidSingle()+this.guidSingle()
		+this.guidSingle()+this.guidSingle()+this.guidSingle()+this.guidSingle())
	},  
	StringUtils.repeat(repeatString,count) 重复字符串count次
  1. Map集合去空值:

    public static Map mapRemoveNull(Map map) {
           Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
           while (it.hasNext()) {
               Map.Entry<String, Object> entry = it.next();
               String key = entry.getKey();
               if (Objects.isNull(map.get(key)) || map.get(key).equals("null") || map.get(key).equals("")) {
                   it.remove();
               }
           }
           return map;
       }
    

5.前端页面对数组进行多种排序:

sortFiles(data){
		vm.resourceFiles = vm.rTempFiles.sort(d_count);
		function d_count(a, b) {
           if (vm.flag == 0){
            vm.flag = 1
            return a.browseCount - b.browseCount
          }else {
            vm.flag = 0
            return b.browseCount - a.browseCount
          }
        }
	}
	通过flag值的变化正序、反序排列
		if (vm.flag == 0){
			vm.flag = 1
			vm.tableQuery.order = {browse_count:'desc'}
		}else {
			vm.flag = 0
			vm.tableQuery.order = {browse_count:'asc'}
		}

6.js时间戳转日期格式:

//第一种
	function getLocalTime(nS) {     
	   return new Date(parseInt(nS) * 1000).toLocaleString().replace(/:\d{1,2}$/,' ');     
	}     
	//结果是2010年12月23日 10:53

	//第二种    
	function getLocalTime(nS) {     
		return new Date(parseInt(nS) * 1000).toLocaleString().substr(0,17)
	}     

	//第三种  格式为:2010-10-20 10:00:00
    function getLocalTime(nS) {     
       return new Date(parseInt(nS) * 1000).toLocaleString().replace(/年|月/g, "-").replace(/日/g, " ");      
    }     
	
	//第四种
	SimpleDateFormat format =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	Long time = new Long(str);
	str = format.format(time);
	Date date= format.parse(str);
	//第五种
	直接使用filters进行过滤处理

7.后台获取filter的order加入排序:

 String orderStr = ParameterUtil.StringToOrder(pagerQuery.getOrder());
        if (!Strings.isNullOrEmpty(orderStr)) {
            OrderByHelper.orderBy(orderStr);
        }

8.多选框查询
调用自身的“change”事件,当绑定值发生变化时触发

9.配置文件上传系统

10.radio单选框取值问题:

v-model绑定变量,选中意味着变量的值为相应 Radio label属性的值,
	<el-radio v-for="g in postModel.graduationOptions" :label="g.id">{{g.name}}</el-radio>

11.动态绑定验证



12.树形控件绑定

13.Date转换_实体类上定义

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

14.forEach前端循环判定boolean

_.each(infos,function (v) {
v.orgStatus = v.orgAuditStatus != null
})
若要判定 !=null 或者 != 2,转换思路,让 v.orgStatus = v.orgAuditStatus == 1 即可!!!!!!
{{r.creatorName ? r.creatorName : ‘无名氏’}}

15.如果数据有空格,SQL用trim去空

<if test="gradationId != null and gradationId != ''">
			AND trim(rb.gradation_id) = #{gradationId}
		</if>

18.处理由于http请求异步导致的返回数据未按顺序的情况;
18.1:先定义一个初始空数组———— vm.gradeTemp = Array.apply(null,{length:xhr.data.data.aaData.length})
该数组为空,长度为获取的返回结果的长度
18.2:定义一个obj对象,获取异步请求的结果:
let obj = new Object()
obj.id = id
obj.name=name;
obj.list = xhr.data.data;
18.3:运用slice将对应下标的内容替换;

vm.gradeTemp.splice(i,1,obj)——————————————————————在i处,删除1个,替换为obj

18.4:该问题主要是请求返回时间不同导致数据加载不一致

19.BigDecimal

19.1 在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
			1、用float或者double变量构建BigDecimal对象。
			2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
			3、把BigDecimal对象转换成float,double,int等类型。
	19.2 基本算法:
		1 public BigDecimal add(BigDecimal value);                        //加法
		2 public BigDecimal subtract(BigDecimal value);                   //减法 
		3 public BigDecimal multiply(BigDecimal value);                   //乘法
		4 public BigDecimal divide(BigDecimal value);                     //除法
	19.3 处理结果:
		BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
		BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
		add:	return b1.add(b2).doubleValue();
		sub:	return b1.subtract(b2).doubleValue();
		mul:	return b1.multiply(b2).doubleValue();
		divide:	return b1.divide(b2, scale).doubleValue();   
	19.4 比较大小:
		a.compareTo(b) 返回值为int  -1表示小于,0是等于,1是大于。

20.处理转换属性值:

let course = _.each(xhr.data.data,function (v) {
			v.id = v.code;
		})
		vm.searchItem[2].options = course

21.当页面数据出现初始返回undefined时,用v-if="xxx != undefined"处理渲染,
当需要的数据为undefined时,不渲染;后续数据同步到位,自动渲染。
22.SQL判断一条记录的多个字段是否相同:
23. lambda表达式:

 stream().mapToDouble(s->s.getScore()).sum()/resCommentListment.size();
	entityList.stream().mapToInt(s->s.getFileSize().intValue()).sum()
	listTea.stream().filter(s->!Strings.isNullOrEmpty(s.getGradeId())).map(s->s.getGradeId()).distinct().collect(Collectors.toList())

24.多个文件同时下载:

25.实体类处理信息拼接:

public String getTitle() {
    if(this.typeId.equals("0")){
        return this.title + "(共" + (this.subFiles == null ? "0" : this.subFiles) +"个文件)";
    }
    return title;
}
  1. beforeRouteEnter(to, from, next){
    http.get/post()
    .then(function(xhr){
    next(function(vm){

    		主要用于进行路由跳转控制,减少mounted作用写法
    		
    		)}
    	})
    

    }
    27.

     postConfirm(message, type, postUrl, data){
    	        let vm=this;
    	        MessageBox.confirm(message, type, {type: 'warning'})
    	          .then(function () {
    	            http.post(postUrl, data)
    	              .then(function (xhr) {
    	                if(xhr.data.code){
    	                  return;
    	                }
    	                vm.apiNameList(vm.aId)
    	              })
    	          })
    	          .catch(function () {
    	          })
    	      },
    		   postHttp(data, url){
    	        var vm = this
    	        http.post(url, data)
    	          .then(function (xhr) {
    	            if(xhr.data.code){
    	              return
    	            }
    	            vm.$router.push('/developer/plat_list')
    	          })
    	      },
    
  2. map取值为String[]类型,转为String方法:

    List roles = new ArrayList<>();
    if(map.get(“roleStr”) instanceof String){
    roles.add((String)map.get(“roleStr”));
    }
    if(map.get(“roleStr”) instanceof String[]){
    String[] roleList = (String[]) map.get(“roleStr”);
    roles.addAll(Arrays.asList(roleList));
    }

  3. list拼接成String:

String.join(",",list)
初始赋值list:
List list = new ArrayList(){
{
add(“nihao”);
add(“wohao”);
add(“dajihao”);
}
};

  1. rpc的配置:

  2. 循环赋值注意引用对象的问题
    在循环体里new对象赋值

  3. 检查rpc
    1.在serviceImpl加@Service注解,并装配于controller
    2.controller调用方法测试

  4. Mybatis调用存储过程时获取返回值的问题:

    A:

    call p_score_consume(
    #{userId,mode=IN,jdbcType=VARCHAR},
    #{funcCode,mode=IN,jdbcType=VARCHAR},
    #{businessId,mode=IN,jdbcType=VARCHAR},
    #{state,mode=OUT,jdbcType=INTEGER},
    #{msg,mode=OUT,jdbcType=VARCHAR}
    )

    void consumeScore(TransactionBean transactionBean);
    
    @Override
    public TransactionBean consumeIntegral(@Valid TransactionBean transactionBean) {
        TransactionBean validBean= valid(transactionBean);
        if (validBean!=null){
            return validBean;
        }
        scoreOpertionDao.consumeScore(transactionBean);
        return transactionBean;
    }
    
    B:
    <select id="consumeScore" parameterType="java.util.Map" statementType="CALLABLE">
        {call p_score_consume(
        #{userId,mode=IN,jdbcType=VARCHAR},
        #{funcCode,mode=IN,jdbcType=VARCHAR},
        #{businessId,mode=IN,jdbcType=VARCHAR},
        #{state,mode=OUT,jdbcType=INTEGER},
        #{msg,mode=OUT,jdbcType=VARCHAR}
        )
    </select>
    
    void consumeScore(Map map);
    
    @Override
    public TransactionBean consumeIntegral(@Valid TransactionBean transactionBean) {
        TransactionBean validBean= valid(transactionBean);
        if (validBean!=null){
            return validBean;
        }
       Map map = new HashMap();
        map.put("userId",transactionBean.getUserId());
        map.put("funcCode",transactionBean.getFuncCode());
        map.put("businessId",transactionBean.getBusinessId());
        scoreOpertionDao.consumeScore(transactionBean);
        return transactionBean;
    }
    
  5. java判定字符串、对象等的空值问题,尽量使用工具:
    如:Strings String 等

  6. <el-button slot=“buttons” type=“text” size=“small” icon=“arrow-left” @click=“goBack()”>返回
    //退回
    goBack(){
    this.$router.push(’/resIndex/res_index’)
    },

  7. swagger测试时,各种数据类型的格式:
    39.1 Object

    39.2 Map

    39.3 filter

  8. List中加入List对象
    和List<> list = new ArrayList<>()的泛型有关系
    若List,则 list.add(E e),是放入对象
    若List,则 list.add(List l),是可以放入list

  9. Jquery中进行数组的增删改
    push
    splice

  10. 引用组件时无法加载数据:
    先不让组件加载(设置显示false),当数据绑定后再改为true显示

  11. 取整,取余:
    /:
    %:

46.循环数组分配数据

主要注意被分配的下标j和商、余数挂钩
	46.1	平均分配
	if (vm.r == 0){
	  for (let i = 0; i < vm.pn.length; i++){                            //循环人员
		let list = new Array;
		vm.pn[i].file = vm.q
		for (let j = (i * vm.q); j < vm.q * (i + 1); j++){             //循环作品
		  list.push(vm.fn[j])
		}
		vm.pn[i].works = _.cloneDeep(list)
	  }
	}
	46.2	不均分配
	 if (vm.r != 0){
	  for (let i = 0; i < vm.pn.length; i++){
		if (i < vm.r){                                                            //前几位多一件作品
		  vm.pn[i].file = vm.q + 1
		  let list = new Array;
		  for (let j = (i * (vm.q + 1)); j < (vm.q + 1) * (i + 1); j++){         //循环作品
			list.push(vm.fn[j])
		  }
		  vm.pn[i].works = _.cloneDeep(list)
		}
		if (i >= vm.r){                                                                //正常分配数量
		  vm.pn[i].file = vm.q
		  let list = new Array;
		  for (let j = i * vm.q + vm.r; j < vm.q + (i * vm.q + vm.r); j++){             //循环作品
			list.push(vm.fn[j])
		  }
		  vm.pn[i].works = _.cloneDeep(list)
		}
	  }
	}
  1. Json和List相互转换:

47.1 List转Json

JSONArray jsonArray = JSONArray.fromObject( list );
47.2	Map转Json
JSONObject json = JSONObject.fromObject(map);
47.3	Bean转Json
JSONObject jsonObject = JSONObject.fromObject(new JsonBean());
  1. Json数据取值

    根据Key取值: JsonObject.fromObject(str).getString(key);
    
  2. Vue中数据的赋值问题:
    Vue只对data中的初始化数据进行变化监听,如果需要赋值,要直接对其本身进行;
    或者利用_.cloneDeep创建临时数据操作,再反赋值回目标数据

  3. 前端页面方法路径自动加入了时间戳的问题:

  4. 时间范围表单验证问题
    获取的数据是数组: [date1, date2]

  5. 跳转页面数据未及时刷新: this.$router.push()
    解决方案:

    1. 查看是否网络请求导致的错位运行:前端页面均为异步请求,可能是调整方法先执行,再执行其他请求
  6. Vue页面数据类型初始化问题:
    String:’’
    Array:[]
    Number:-1==========>初始化没有值的都适合
    Object:{}

  7. 某个功能的运行必须经由其他功能触发的bug(主要发生在编辑页面)
    确认是否初始化所有树形,是否被影响属性被覆盖或删除导致
    获取数据时,所有需求值都处理好再一次性赋值给目标对象,否则会因某个值不存在导致功能无法实现!!!
    58

    .List<String> ids = originalRecords.stream().filter(s->!Strings.isNullOrEmpty(s.getPersonID())).map(s-	>s.getPersonID()).distinct().collect(Collectors.toList());
    originalRecords.forEach(s->{
    	RpcUserInfo info = infos.stream().filter(f->!Strings.isNullOrEmpty(s.getPersonID()) && s.getPersonID().equals(f.getUserId())).findFirst().orElse(null);
    	if (info!= null){
    	s.setPersonName(info.getUserName());
    	}
    });
    
  8. 配置RPC调用方法,motan-client的(dev, local, product, test)xml都需要配置

  9. 配置oracle的jdbc.url格式====>base.jdbc.urls=jdbc:oracle:thin:@110.186.73.233:31521:base

  10. 8188环境部署:

    1. 先将后台代码推到dev
    2. 前端合并发布到dev/test均可
    3. 拉取已推送合并代码部署

65.Model类:
65.1 采用驼峰命名规则,和数据库字段进行对应匹配;
65.2 注意在写SQL语句时,如果Model类字段有变化,需要select出单个字段名,否则无法接收到对应数据
因此推荐SQL语句减少使用 SELECT *,尽量写全数据库对应字段
65.3 领域对象和领域模型
65.4
66.Dao层:
66.1 参数注解:
66.1.1 参数
@Param(“id”) String id 此写法Mapper的select必须写parameterType
@Param(value = “id”) String id 此写法Mapper的select不用写parameterType
对象,数组等 不加
66.2 Dao层的方法名对应Mapper里的id
67.Mapper:
67.1 select语句最好写完整,以防字段不匹配导致的数据获取不完整
67.2 INSERT INTO SELET FROM —Insert into Table2(field1,field2,…) select value1,value2,… from Table1
要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量
SELECT INTO FROM ------SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中
67.3 FULL JOIN/ INNER JOIN/ LEFT JOIN/ RIGHT JOIN
67.4 获取GUID:

	<selectKey keyProperty="id" resultType="String" order="BEFORE">
		SELECT SYS_GUID() FROM DUAL
	</selectKey>

68.Service层:
4.1 关于分页查询在service层全部处理以及分开service层和controller层分别处理的写法
4.2
69.Controller层:
5.1 RequestMapping:
5.1.1 @Controller
@RequestMapping(value = “developer”)
将这个class申明为一个bean,当web请求为developer时,跳转到这个class进行处理。
5.1.2 @RequestMapping(value = “user”,method = RequestMethod.GET)
使用@RequestMapping()注解,将Controller中的具体方法和请求方法名绑定起来。
5.1.3
@RequestMapping可以被标注类型申明和方法申明这两种方式上。
申明在类型定义上,那么@RequestMapping()括号里面的东西通常为请求的地址
申明在方法定义上,那么它用来表明当前方法定义是一个Web请求处理方法。
5.1.4 在spring——mvc中,通过url路径来访问控制器中的方法,可以在用@RequestMapping注解的路径中使用URI模板。
使用@PathVariable注解来指明方法中的参数应该对应URI模板中的变量
@RequestBody:用于接收对象
@PathVariable:用于接收单个参数,必须保证参数名和URI模板变量名一致才能自动赋值,想自定义参数变量需要在@PathVariable注解中加入参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值