• Home

  • 归档

  • 分类

  • 标签
Keep Coding
Keep Coding

01月
08
Mybatis

Mybatis 的配置

发表于 2018-01-08 • 分类于 Mybatis

使用 XML 配置 MyBatis

构建 SqlSessionFactory 最常见的方式是基于 XML 配置(的构造方式)。下面的 mybatis-config.xml 展示了一个典型的 MyBatis 配置文件的样子:

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
  <properties resource="application.properties">  
    <property name="username" value="db_user" />  
    <property name="password" value="verysecurepwd" />  
  </properties>  
  <settings>  
    <setting name="cacheEnabled" value="true" />  
  </settings>  
  <typeAliases>  
    <typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" />  
    <package name="com.mybatis3.domain" />  
  </typeAliases>  
  <typeHandlers>  
    <typeHandler handler="com.mybatis3.typehandlers. PhoneTypeHandler" />  
    <package name="com.mybatis3.typehandlers" />  
  </typeHandlers>  
  <environments default="development">  
    <environment id="development">  
      <transactionManager type="JDBC" />  
      <dataSource type="POOLED">  
        <property name="driver" value="${jdbc.driverClassName}" />  
        <property name="url" value="${jdbc.url}" />  
        <property name="username" value="${jdbc.username}" />  
        <property name="password" value="${jdbc.password}" />  
      </dataSource>  
    </environment>  
    <environment id="production">  
      <transactionManager type="MANAGED" />  
      <dataSource type="JNDI">  
        <property name="data_source" value="java:comp/jdbc/MyBatisDemoDS" />  
      </dataSource>  
    </environment>  
  </environments>  
  <mappers>  
    <mapper resource="com/mybatis3/mappers/StudentMapper.xml" />  
    <mapper url="file:///D:/mybatisdemo/mappers/TutorMapper.xml" />  
    <mapper class="com.mybatis3.mappers.TutorMapper" />  
  </mappers>  
</configuration>
阅读全文 »
01月
05
Java

Difference between Comparator and Comparable in Java

发表于 2018-01-05 • 分类于 Java

Difference between Comparator and Comparable in Java

One of the common interview question is ‘What are differences between Comparator and Comparable’. or ‘How will you sort collection of employee objects by its id or name’.For that we can use two interfaces.i.e. Comparator and Comparable.Before we actually see differences,let me give you brief introduction of both.

Comparable interface: Class whose objects to be sorted must implement this interface.In this,we have to implement compareTo(Object) method.

For example:

public class Country implements Comparable {
    @Override
    public int compareTo(Object arg0) {
        Country country=(Country) arg0;
        return (this.countryId < country.countryId ) ? -1: (this.countryId > country.countryId ) ? 1:0 ;
}} 

If any class implements comparable inteface then collection of that object can be sorted automatically using Collection.sort() or Arrays.sort().Object will be sort on the basis of compareTo method in that class.

Objects which implement Comparable in java can be used as keys in a SortedMap like TreeMap or SortedSet like TreeSet without implementing any other interface.

Comparator interface: Class whose objects to be sorted do not need to implement this interface.Some third class can implement this interface to sort.e.g.CountrySortByIdComparator class can implement Comparator interface to sort collection of country object by id. For example:

public class CountrySortByIdComparator implements Comparator<Country> {
    @Override
    public int compare(Country country1, Country country2) {
        return (country1.getCountryId() < country2.getCountryId() ) ? -1: (country1.getCountryId() > country2.getCountryId() ) ? 1:0 ;
    }
}

Using Comparator interface,we can write different sorting based on different attributes of objects to be sorted.You can use anonymous comparator to compare at particular line of code. For example:

阅读全文 »
12月
20
Java

Java 8 日期/时间(Date Time)API指南

发表于 2017-12-20 • 分类于 Java

转载自 http://www.codeceo.com/article/java-8-date-time-api.html

为什么我们需要新的Java日期/时间API?

在开始研究Java 8日期/时间API之前,让我们先来看一下为什么我们需要这样一个新的API。在Java中,现有的与日期和时间相关的类存在诸多问题,其中有:

  1. Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。
  2. java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
  3. 对于时间、时间戳、格式化以及解析,并没有一些明确定义的类。对于格式化和解析的需求,我们有java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求。
  4. 所有的日期类都是可变的,因此他们都不是线程安全的,这是Java日期类最大的问题之一。
  5. 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

在现有的日期和日历类中定义的方法还存在一些其他的问题,但以上问题已经很清晰地表明:Java需要一个健壮的日期/时间类。这也是为什么Joda Time在Java日期/时间需求中扮演了高质量替换的重要角色。

阅读全文 »
12月
05
Spring

Spring 验证和国际化

发表于 2017-12-05 • 分类于 Spring

Validator 国际化

SpringMVC表单验证器

在 ProductCommand 类中添加 name 属性的验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Size(min = 1, max = 10)
@Pattern(regexp = "^[\\u4e00-\\u9fa5]*$")
private String name;
```
当验证不通过时会产生默认的错误信息,如上面的验证分别会产生下面的两条默认错误信息:
```
个数必须在1和10之间
需要匹配正则表达式"^[\u4e00-\u9fa5]*$"
```
也可以在注解上面加上自定义的默认错误信息,例如在 @Pattern 注解上加上默认错误信息:
```
@Size(min = 1, max = 10)
@Pattern(regexp = "^[\\u4e00-\\u9fa5]*$", message = "产品名称格式不正确")
private String name;
```
这样如果 name 属性值不匹配正则的话就会显示:
```
产品名称格式不正确

还可以将默认错误信息国际化:

@Size(min = 1, max = 10)
@Pattern(regexp = "^[\\u4e00-\\u9fa5]*$", message = "{product.name.pattern}")
private String name;

在项目 resources 目录下新建类似ValidationMessages_xx.properties 文件名的国际化文件,如ValidationMessages_zh_CN.properties表示中文国际化文件。 在ValidationMessages_zh_CN.properties 文件中将product.name.pattern 配置相对应的错误信息:

# 产品名称格式不正确
product.name.pattern=\u4ea7\u54c1\u540d\u79f0\u683c\u5f0f\u4e0d\u6b63\u786e

国际化文件里面要将中文转成Unicode(Unicode编码转换),不然显示时会乱码。

使用 SpringBoot,spring-boot-starter-web 会自动引入hiberante-validator, validation-api 依赖。

因为 Spring 的国际化默认是以 messages 开头的(org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration),而上面的修改会将所有的国际化文件都指示以 ValidationMessages 开头,所以为了避免冲突,都以 messages 开头。

SpringBoot 默认的国际化文件的 baseName 是 i18n/messages,所以将验证信息的国际化放在 i18n/messages 里也可以。

阅读全文 »
12月
02
Go

Go 语言的安装和配置

发表于 2017-12-02 • 分类于 Go

安装和配置

下载安装包,由于官网需要访问不了,所以可以到 Go 语言中文网(https://studygolang.com/dl)下载安装包。

将下载的源码包解压至 /usr/local目录。

1
$ tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz

解压完成后,在 /usr/local 目录下生成 go 目录。

配置环境变量

$ vim /etc/profile 

将 /usr/local/go/bin 目录加入至 PATH 环境变量

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin 

编译生效

$ source /etc/profile 

验证 Go 环境配置成功

$ go version 

如果正确打印出 Go 语言版本号,则表示安装和配置成功:

go version go1.9.2 linux/amd64 
阅读全文 »
11月
22
Java

Java Collection

发表于 2017-11-22 • 分类于 Java

List

ArrayList

LinkedList

Map

HashMap

对于 HashMap 而言,系统 key-value 当成一个Entry对象进行处理。它采用 Hash 算法来决定集合中元素的存储位置。当系统开始初始化 HashMap 时,系统会创建一个长度为 capacity 的 Entry 数组,这个数组里可以存储元素的位置被称为 “桶(bucket)”,每个 bucket 都有其指定索引,系统可以根据其索引快速访问该 bucket 里存储的元素。
无论何时,HashMap 的每个 “桶” 只存储一个元素(也就是一个 Entry),由于 Entry 对象可以包含一个引用变量(就是 Entry 构造器的的最后一个参数)用于指向下一个 Entry,因此可能出现的情况是:HashMap 的 bucket 中只有一个 Entry,但这个 Entry 指向另一个 Entry ——这就形成了一个 Entry 链。
当程序试图将一个 key-value 对放入 HashMap 中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但 key 不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部。

LinkedHashMap

Java集合之LinkedHashMap

SortedMap

TreeMap

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列。

HashTable

Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

Set

HashSet

对于 HashSet 而言,它是基于 HashMap 实现的。它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。
所以 HashSet 在查找元素时需要调用到其集合元素的 hashcode() 和 equals() 方法。

HashMap 与 HashSet 摘自:https://www.ibm.com/developerworks/cn/java/j-lo-hash/index.html

LinkedHashSet

SortedSet

TreeSet

集合用法

集合遍历时,如果要删除元素,唯一正确的方法时先将集合转换成迭代器,再使用iterator.remove() 方法,如:

1
2
3
4
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
it.remove();
}

Java 不允许集合遍历时删除元素,因为集合遍历底层是使用 Iterator,Iterator 是工作在一个独立的线程中,并且拥有一个互斥锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

关于 List 比较好玩的操作

阅读全文 »
11月
22
Java

Java 内部类

发表于 2017-11-22 • 分类于 Java

内部类

Java内部类详解

Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结

四种java内部类总结

创建内部类的典型的方式是在一个方法体的里面创建,局部内部类不能有访问说明符,因为它不是外部类的一部分,但是它可以访问当前代码块内的常量, 以及此外部类的所有成员。使用内部类的优点是内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象。

阅读全文 »
11月
22
Java

Java Thread

发表于 2017-11-22 • 分类于 Java

Future模式
Java 中的 Runnable、Callable、Future、FutureTask 的区别与示例

阅读全文 »
11月
22
Java

Java Enum

发表于 2017-11-22 • 分类于 Java

java enum(枚举)使用详解 + 总结

Enum、EnumMap、EnumSet的用法讲解

enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。

  1. 原始的接口定义常量

  2. 语法(定义)

  3. enum 对象的常用方法介绍

  4. 给 enum 自定义属性和方法

  5. enum 的原理分析

  6. enum 对象常用操作使用

  7. EnumSet,EnumMap 的应用

阅读全文 »
11月
22
问题记录

Java Serializable

发表于 2017-11-22 • 分类于 问题记录

serialVersionUID的作用

Java基础篇 - Serializable与serialVersionUID的简单说明

关于Java Serial Version UID的一些说明

Java序列化与static

在网络传输Java对象、将Java对象存储到文件、将Java对象以BLOB形式存储到数据库中时,需要对Java对象进行序列化及反序列化,标准模式是实现Serializable接口。
实现上述接口时,需要提供一个Serial Version UID,该UID用于标识类的版本。一个对象被序列化后,只要其版本不变,都可以进行反序列化,一旦
改变造成版本不一致,会抛出InvalidClassException异常。
建议显示定义UID,如果不显示定义,JVM会自动产生一个值,这个值和编译器的实现有关,不稳定,可能在不同JVM环境下出现反序列化抛出InvalidClassException异常的情况。
在Eclipse中,提供两种方式显示定义UID,一种是“add default serial version ID”,默认值为1L;另一种是“add generated serial version ID”,默认值是一个很大的数,是根据
类的具体属性而生成,当类属性有变动时,该值会更改。
建议采用第一种自动生成方法,当对类进行了不兼容性修改时,需要修改UID。
采用第二种方法时,如果修改了属性,不重新生成UID时,默认值是不会变的,也可以正常反序列化,但不推荐,毕竟UID的值与实际不符。
对类进行兼容性和不兼容性修改的情况请参见 Versioning of Serializable Objects。
Hibernate的pojo类建议也采用上述方法,便于扩展。
对于继承关系,父类实现序列化接口,子类可以继承接口的实现,但需显示定义UID,因为父类UID类型为private static,不可被继承,同时子类作为单独的类需要单独的UID。

阅读全文 »
1…345678
wuchao

72 日志
18 分类
Creative Commons

博客已萌萌哒运行(●'◡'●)ノ♥

© 2020 Keep Coding. 由 Hexo 强力驱动. Theme By Sagiri v0.0.4.

Made with by wuchao.