分类:Java


Java实现字段脱敏处理


     /**
     * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>
     *
     * @param fullName
     * @return
     */
    public static String chineseName(String fullName) {
        if (StringUtils.isBlank(fullName)) {
            return "";
        }
        String name = StringUtils.left(fullName, 1);
        return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
    }

    /**
     * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>
     *
     * @param familyName
     * @param givenName
     * @return
     */
    public static String chineseName(String familyName, String givenName) {
        if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
            return "";
        }
        return chineseName(familyName + givenName);
    }

    /**
     * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
     *
     * @param id
     * @return
     */
    public static String idCardNum(String id) {
        if (StringUtils.isBlank(id)) {
            return "";
        }
        String num = StringUtils.right(id, 4);
        return StringUtils.leftPad(num, StringUtils.length(id), "*");
    }

    /**
     * [固定电话] 后四位,其他隐藏<例子:****1234>
     *
     * @param num
     * @return
     */
    public static String fixedPhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
    }

    /**
     * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
     *
     * @param num
     * @return
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
    }

    /**
     * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
     *
     * @param address
     * @param sensitiveSize
     *            敏感信息长度
     * @return
     */
    public static String address(String address, int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    }

    /**
     * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>
     *
     * @param email
     * @return
     */
    public static String email(String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        if (index <= 1) {
            return email;
        }else{
            return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
    }

    /**
     * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
     *
     * @param cardNum
     * @return
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    }

    /**
     * [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>
     *
     * @param code
     * @return
     */
    public static String cnapsCode(String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }
        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    }

Hibernate之Session操作


session.save(Object object); //增加
session.update(Object object);//修改
session.saveOrUpdate(Object object);//主键字段有值则修改,无则新增。
session.delete(Object object);//删除
session.createQuery(String HQL);//按HQL语句查询
session.createCriteria(Class entityClass);//按实体进行QBC查询 
session.load(Class entityClass,Serialize id); //根据id查询,延迟加载。
session.get(Class entityClass,Serialize id); //根据id查询,立即加载。
//Restrictions查询用法
HQL运算符	QBC运算符		含义
=		Restrictions.eq()	等于equal
<>		Restrictions.ne()	不等于not equal
>		Restrictions.gt()	大于greater than
>=		Restrictions.ge()	大于等于greater than or equal
<		Restrictions.lt()	小于less than
<=		Restrictions.le()	小于等于less than or equal
is null		Restrictions.isnull()	等于空值
is not null	Restrictions.isNotNull() 非空值
like		Restrictions.like()	字符串模式匹配
and		Restrictions.and()	逻辑与
and		Restrictions.conjunction() 逻辑与
or		Restrictions.or()	逻辑或
or		Restrictions.disjunction() 逻辑或
not		Restrictions.not()	逻辑非
in(列表)	Restrictions.in()	等于列表中的某一个值
not in(列表)	Restrictions.not(Restrictions.in()) 不等于列表中任意一个值
between x and y Restrictions.between()	闭区间xy中的任意值
not between x and y Restrictions.not(Restrictions..between()) 小于值X或者大于值y

application.properties中文乱码


原因:
当在程序中读取application.properties值时
默认是以ISO-8859-1的字符编码读取

解决办法:
1.添加配置
banner.charset=UTF-8
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8

2.设置文件字符编码
进入File -> Settings -> Editor -> File Encodings
将Properties Files (*.properties)下的Default encoding for properties files设置为UTF-8
将Transparent native-to-ascii conversion前的勾选上
点击ok

码云JavaDoc的使用


Gitee最近又推出了一个新的服务,JavaDoc
此服务的主要作用就是:
将打包时生成的javaDoc文档部署到对应路径
以便远程访问

注意:
1.项目pom文件需引入JavaDoc的Jar包
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>
</plugin>
2.项目设置中编程语言选中Java
否则服务中不会出现JavaDoc的选项

Idea手动安装插件


1.访问:http://plugins.jetbrains.com

2.搜索要下载的插件名称

3.点击下载按钮
注意版本号,可在idea的glugins中搜索查看版本号

4.下载成功后解压

5.点击开始找到idea右键属性点击打开文件位置

6.切换到plugins下

7.将解压的文件夹粘贴进去

8.重启idea搜索插件查看是否添加成功!

Dorado中间件DataGrid控件添加计算列


Dorado说明:

Dorado是锐道公司开发的一个中间件
使前后端完美对接,大大提高了开发速度

与原生安卓的使用方式比较类似,都是通过拉控件设置属性进行页面开发
假设以下是需要展示的表格:
姓名  数学   语文

张三  98     97
李四  88     87
王五  89     90

例如你需要显示数据额成绩和语文成绩的平均分

1.双击DataGrid设置showFooter的值为true
2.双击姓名列,打开onRenderFooterCell
3.在该事件中写入:
  arg.dom.innerText="平均分"
设置之后姓名列对应的显示为“平均分”
4.分别设置需要计算的两列的summaryType的值为average
5.该字段还有一些其他值,例如sum等
  设置后可分别对这些列进行相应的计算
6.设置后的计算列位于DataGrid的最下方,一般位于屏幕最下方
  (第一次搞的时候以为设置错了,一直以为这一列会追加在显示数据的后面!)

7.结果样例:

姓名   数学   语文

张三   88     97
李四   88     97
王五   88     97


平均分 88     97

自定义Java注解


注解的作用:

1.生成文档
这是最常见的,也是java 最早提供的注解。常用的有 @see @param @return 等

2.跟踪代码依赖性,实现替代配置文件功能
Spring中大量运用注解来简化配置文件

3.在编译时进行格式检查

如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出

实现一个简单的注解:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyTarget {
}
上面是一个最简单的注解实现,没有定义任何的属性
需要注意的是@Retention(RetentionPolicy.RUNTIME)是定义注解所必须的。
 
@Retention是注解的注解,称为注解的元注解。
括号里有一个枚举类型的值,即为注解内部定义的值。打开Retention的实现:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}
可以看到这里定义了一个变量value并且没有缺省值,所以不写这个value就会报错。 
继续打开RetentionPolicy:
public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}
可以发现这个枚举类定义了三个值,这三个值分别代表的是我们定义的MyTarget如何保持。

@Retention(RetentionPolicy.CLASS)
注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候

@Retention(RetentionPolicy.SOURCE)
注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中

@Retention(RetentionPolicy.RUNTIME)
注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时

还需要注意的是java的元注解一共有四个: 
@Document 
@Target 
@Retention 
@Inherited

各个的作用,读者自己查一下吧。

注解处理的一个基础:
 T getAnnotation(Class annotationClass): 
返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

Annotation[] getAnnotations():
返回该程序元素上存在的所有注解。

boolean is AnnotationPresent(Class annotationClass):
判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.

Annotation[] getDeclaredAnnotations():
返回直接存在于此元素上的所有注释。
与此接口中的其他方法不同,该方法将忽略继承的注释。
(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)
该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

实现为属性赋值的注解:
package com.justin.test.util;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface CarNameTarget {
    String name() default "";
}
package com.justin.test.util;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface CarSalerTarget {
    String salerName();

    int age() default 1;
}
package com.justin.test.entity;

import com.justin.test.util.CarNameTarget;
import com.justin.test.util.CarSalerTarget;

/**
 * 描述:
 * 汽车实体类
 *
 * @author 孫兵
 * @create 2018-05-15 10:16
 */
public class BnechCar {
    @CarNameTarget(name = "奔驰")
    private String name;

    @CarSalerTarget(salerName = "justin", age = 22)
    private String salerInfo;
}
package com.justin.test.util;

import java.lang.reflect.Field;

/**
 * 描述:
 * 汽车信息工具类
 *
 * @author 孫兵
 * @create 2018-05-15 10:19
 */
public class CarInfoUtil {

    public static void getFruitInfo(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(CarNameTarget.class)) {
                CarNameTarget carNameTarget = field.getAnnotation(CarNameTarget.class);
                String carColour = "汽车的中文名:" + carNameTarget.name();
                System.out.println(carColour);
            } else if (field.isAnnotationPresent(CarSalerTarget.class)) {
                CarSalerTarget carSalerTarget = field.getAnnotation(CarSalerTarget.class);
                String salerInfo = "销售员姓名:" + carSalerTarget.salerName() + ",年龄:" + carSalerTarget.age();
                System.out.println(salerInfo);
            }
        }
    }
}
/**
     * 自定义注解测试
     */
    private void targetTest() {
        CarInfoUtil.getFruitInfo(BnechCar.class);
    }

打印信息:

汽车的中文名:奔驰
销售员姓名:justin,年龄:22

Maven与lib文件夹并存引入异常的问题


1.此处使用开发环境为eclipse
2.项目为maven与lib并存项目(即引用jar包来自两个部分)
3.右键项目选中build path选中configure build path
可以看到maven引入资源中有引入失败的包

解决办法:
1.首选执行maven install,确保maven部分引入的包没有问题

2.确保引入异常的包存在于lib文件夹下

3.选中windows下的Preferences

4.选中maven选中Offline将在线状态改为本地状态点击OK

5.右键项目选中maven选中Update Project

6.此时界面内的Offline应已被选中

7.选中Force Update of Snapshots/Releases点击OK

8.项目更新后重新build path查看,包引入正常了

Eclipse Validating 缓慢的优化


1.点击windows选择preferences

2.选中validation

3.将右侧bulid下选中的勾全部取消

4.点击ok

Java异常No Hibernate Session bound to thread,…


报错信息:
No Hibernate Session bound to thread, 
and configuration does not allow creation of non-transactional one here

今天对一个已完成的项目进行开发,主要针对一张表进行增删改查操作

在开发时没有按照项目已有的格式,例如java的分类规则等

所编辑的代码也没有任何错误,但只要这部分代码被调用就报错

后将此部分代码改为与项目其他部分相同的规则重新调用就没有报错了

虽然写出来读一下感觉是很简单的错误,甚至不是错误
但在实际编码过程中因为一个小问题而影响开发进程的事是很常见的

所以,编码需谨慎!