0%

Mysql账户体系

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> use mysql;
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| procs_priv |
| proxies_priv |
| tables_priv |
| user |
+---------------------------+
31 rows in set (0.00 sec)
阅读全文 »

使用集合需要考虑几个关注点:

  1. 线程安全性
  2. 是否有序
  3. 是否重复
  4. 关注查询还是关注写入
  5. equals和hashCode方法的重写需要同步
  6. 使用接口返回集合数据
阅读全文 »

概述

  1. HashMap是一种使用数组+链表+红黑树数据结构实现的Map
  2. HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序不确定。
  3. HashMap只允许一个key为null,允许多个value为null
  4. HashMap 非线程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。
阅读全文 »

概述

这里的Type指java.lang.reflect.Type, 是Java中所有类型的公共高级接口, 代表了Java中的所有类型. Type体系中类型的包括:数组类型(GenericArrayType)、参数化类型(ParameterizedType)、类型变量(TypeVariable)、通配符类型(WildcardType)、原始类型(Class)、基本类型(Class), 以上这些类型都实现Type接口.

Type 表示的全部类型而每个Class对象表示一个具体类型的实例,如String.class仅代表String类型。由此看来Type与 Class 表示类型几乎是相同的(Class实现接口Type),只不过 Type表示的范围比Class要广得多而已。当然Type还有其他子类。

  1. 参数化类型(ParameterizedType):有原始类型和具体的类型参数,泛型List、Map;
  2. 数组类型(GenericArrayType):不是数组String[] 、byte[],而是带有泛型的数组,即T[] ;
  3. 通配符类型(WildcardType): 指的是<?>, <? extends T>等等
  4. 原始类型(Class): 不仅仅包含我们平常所指的类,还包括枚举、数组、注解等;
  5. 基本类型(Class), 也就是我们所说的java的基本类型,即int,float,double等
  6. 类型变量(TypeVariable):表示类型参数,可以有上界,比如:T extends Number
阅读全文 »

String介绍

API描述

java.lang.String的源码中明确说明,String类表示字符串,Java中所有的字符串传字面值(如:”abc”)都是该类的实例;并且字符串是常量,一旦创建之后则不可以改变,String buffers支持可变的字符串。因为String对象是不可变的,但是可以共享。

1
2
3
4
5
6
7
8
9
10
11
12
 * The {@code String} class represents character strings. All
* string literals in Java programs, such as {@code "abc"}, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared.

public final class String
implements java.io.Serializable,
Comparable<String>, CharSequence {
}

通过API定义总结以下信息:

  1. 使用final修饰,则不能被继承(该类中的成员方法默认都是final)
  2. 实现接口Serializable,说明可以进行序列化
  3. 实现接口Comparable,说明可以大小比较
  4. 实现接口CharSequence,说明String本身就是char类型的数组,而且通过成员变量定义可以进行佐证
  5. 通过char字符数组实现
阅读全文 »

在Java中的方法调用使用的都是值传递,Java 中的所有自变量或参数传递都是通过传递句柄进行的。也就是说,当我们传递“一个对象”时,实际传递的只是指向位于方法外部的那个对象的“一个句柄”。所以一旦要对那个句柄进行任何修改,便相当于修改外部对象。此外:

  1. ■参数传递过程中会自动产生别名问题
  2. ■不存在本地对象,只有本地句柄
  3. ■句柄有自己的作用域,而对象没有
  4. ■对象的“存在时间”在 Java 里不是个问题
  5. ■没有语言上的支持(如常量)可防止对象被修改(以避免别名的副作用)
阅读全文 »

所谓克隆就是对原有对象复用的复用,Java语言中克隆针对的是类的实例(对象),在Java中一共有三种方式实现。

  1. 直接赋值
  2. 浅拷贝
  3. 深拷贝
阅读全文 »

session.find/load

hibernate中session.find/load方法都能通过指定实体类名和id从数据库中读取指定的记录,并且返回与之对映的实体对象。但是它们也有很大的区别 ,find()和load()方法在执行检索时的区别:

  1. find()在类检索级别时总是执行立即检索而且如果检索不到相关的对象的话会返回null,load()方法则会抛出一个ObjectNotException

  2. load()方法可返回一个实体代理类类型,而find()方法直接返回的是实体类对象。

  3. load()方法可以充分利用内部缓存和二级缓存,而find()方法会忽略二级缓存,若内部缓存没有查询到会到数据库中去查询。

阅读全文 »

N+1问题

所谓N+1问题,使用hibernate查询数据,首先返回数据的id信息,并没有返回所有的对象信息,只有在真正使用的时候,在使用这个id对数据库中查询数据,一次查询多次调用数据库(缓存)的情况,就是所谓的N+1问题。以下方法或者策略会出现N+1问题:

使用iterate()方法

存在iterator的原因是,有可能会在一个session中查询两次数据,如果使用list每一次都会把所有的对象查询上来,如果使用iterator仅仅只会查询id,此时所有的对象已经存储在一级缓存(session的缓存)中,可以直接获取

1
2
3
4
5
6
7
8
9
10
11
/**
* Return the query results as an <tt>Iterator</tt>. If the query
* contains multiple results per row, the results are returned in
* an instance of <tt>Object[]</tt>.<br>
* <br>
* Entities returned as results are initialized on demand. The first
* SQL query returns identifiers only.<br>
*
* @return the result iterator
*/
Iterator<R> iterate();
阅读全文 »

概述

   状态       说明   
   临时状态(Transient)       刚创建的对象(new)还没有被Session持久化、缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID。   
   持久状态(Persistent)       对象经过Session持久化操作,缓存中存在这个对象的数据为持久状态并且数据库中存在这个对象对应的数据为持久状态这个时候有OID。   
   游离状态(Detached)       已经被持久化,但不处于session的缓存中。   当Session关闭,缓存中不存在这个对象数据而数据库中有这个对象的数据并且有OID为游离状态。   
阅读全文 »