月份:2018年5月


Oracle数据库Date格式化及Select时Case的使用


--Date格式化片段
to_char(create_date,'YYYYMMDD') as date

--格式化系统当前日期
select to_char(sysdate,'YYYYMMDD') from dual;

--Select时Case片段
select case 
when item_a like 'A%' and item_b = 'b' then 'one'
when item_a like 'A%' and item_b = 'B' then 'two'
else 'other' end as type
from table_name

自定义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

修改CSS样式或JS之后F12发现资源没有改变


原因:浏览器已缓存过文件,之后浏览器只获取本地文件,不再远程下载

解决办法:
1.修改浏览器缓存设置
2.不知道怎么设置就手动清楚浏览器缓存
3.如清除浏览器缓存无效,则为引用添加版本号

例如:
<link rel="stylesheet" type="text/css" href="CSS/main.css?v2">

注意:
1.问号后可随意编写,但不要重复
2.使用Idea热部署更新会出现错误
4.执行Ctrl+F5重新从服务器端获取资源(作者认为是最简便的方式)

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查看,包引入正常了

NavicatPremium创建Oracle连接失败


创建连接失败,原因:
1.IP错误
2.Port错误
3.服务名或服务ID错误
4.用户名或密码错误

那么能够到去网上搜的情况一般都不会是前四种
5.本地没有安装Oracle客户端

这种情况就导致:
Navicat获取到的连接支持只是它自己的默认支持
无法与远程Oracle匹配

解决办法:
1.去官方下载客户端(优点:可操作本地Oracle数据库)

2.下载精简版客户端(优点:安装部署方便)
Instant Client 是Oracle 公司推出的精简版客户端。
32位下载地址:
http://www.oracle.com/technetwork/topics/winsoft-085727.html

注意:
不管你的Navicat是32位的还是64位的,
你的Instant Client都要下载32位的,
因为Navicat只支持32位的客户端。

2.1解压下载的压缩包
2.2获取压缩包内的oci.dll路径,例如F:/instantclient_12_1/oci.dll
2.3打开Navicat选中工具,选中OCI,将oci.dll路径输入到OCI library
2.4重启Navicat重新尝试连接

Eclipse Validating 缓慢的优化


1.点击windows选择preferences

2.选中validation

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

4.点击ok

SQLServer数据库转MySQL数据库


准备工作:
1.安装的有SQLServer服务并有对应的数据库
2.安装的有Mysql数据库并创建一个与SQLServer数据库同名的数据库
3.安装的有Navicat Premium数据库可视化工具

开始转换:
1.打开Navicat并配置两个数据库的连接
2.打开刚创建的MySQL数据库并点击右侧的“导入向导”
3.选中ODBC点击下一步
4.选中导入从中的Microsoft OLE DB Provider for SQL Server并点击下一步
5.输入用户名和密码并选择对应的数据库测试连接
6.如连接成功就可疯狂下一步
7.在下一步的过程中我们可以对要同步的表进行筛选
8.确认表之后向导会对表结构进行预测,你可以确认下是否有要调整的
9.向导提供条件查询,如果有太多不想要的数据或者字段类型有问题导致导入出错可以设置这里。
10.最后向导模式选择添加
11.大功告成

补充:
这个东西对SQLServer转MySQL数据类型转换的支持不是很好,要手动设置。

但是导入数据没有问题,最好的方式是:
先使用工具:mss2sql将SQLServer的表转换成MYSQL的表,然后在使用此工具的ODBC导数据。
http://blog.csdn.net/andrew_wx/article/details/6832404

问题记录:
1.SQLServer数据导入到MySQL时,mss2sql对bit类型的处理不太好,
所以有bit类型的字段表导入后要更改长度为8,否则后续的导入操作将会失败。
2.数据导入的时候,如果是局域网数据库,那么要选择的类型为:
SQL Native Client
3.选择连接属性时要慎重,如果中间不正确则确认其它几种属性的作用
选择正确的属性

4.SQL要修改的地方
Insert自增列要给Null(如果是简写不写列名的话);
分页大致上都要改为MySQL的Limit;
表名不要出现dbo.等前缀;

5.主键自增等字段设置会出现丢失,切记检查一下

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的分类规则等

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

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

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

所以,编码需谨慎!

Eclipse打开项目jar文件全都在项目根目录下的解决方案


1.首先确定这些jar文件的位置
我的是WEB-INF下的lib下的文件

2.右键项目选中build path下的configure build path

3.选中Libraries可看到根目录下多余的jar

4.选中这些jar文件,点击右侧Remove

5.选中Add Library,选中User Library,选中User Libraries

6.点击New 输入Refrence Libriary(自定义)点击ok

7.选中Refrence Libriary点击右侧的Add JARs
选择刚刚删除掉的jar文件路径
点击ok

8.此时回到刚刚删除jar文件的页面,
如果新建的Refrence Libriary已经存在,则直接ok即可

否则
选中Add Library,选中User Library,选中User Libraries
选中刚刚创建的项,点击ok

启动项目出现异常Unsupported major.minor version 52.0


原因:
当你使用了高版本的 JRE(如1.8) 编译出.class 文件,但是运行的时候反而使用低版本的 JRE

major version:

Java SE 8 = 52(当前), 
Java SE 7 = 51, 
Java SE 5.0 = 49, 
JDK 1.4 = 48, 
JDK 1.3 = 47, 
JDK 1.2 = 46

解决方案:

1、使用高版本的 JRE 运行,如当报错为Unsupported major.minor version 52.0时,使用 1.8 运行 
基本适用所有情况

2、适用于自己编译的.class文件时,如若是第三方 jar 包引起的报错,那么可以使用以下方式
using java -target 1.6 option

以下为intellij IDEA解决此问题的步骤,同样适用于Android Studio 
1、安装 JDK 1.8 
2、更改 java compiler 

打开Settings找到java compiler 
设置project bytecode version:1.8
设置Pre-module bytecode version:对应module的version为1.8

3.更改project sdk
打开project Structure
选中project 设置project SDK为1.8
(如没有1.8选项,请在下方SDKs中添加)
设置project language level:
8-Lambdas,...

4.点击apply,ok完成