一.基础实体类部分:BaseEntity<T>
@SupTreeList
又定义一个抽象类BaseEntity,该抽象类实现接口Serializable
public abstract class BaseEntity<T> implements Serializable{
private static final long serialVersionUID = 1L;
//先记住id属性,这是最重要的
protected String id;
//这个五个属性先忽略
protected User currentUser;
protected Page<T> page;
protected Map<String,String> sqlMap;
protected Map<String,List<Object>> inSqlMap;
protected boolean isNewRecord = flase;
//再知道这里的三个常量属性:DEL_FLAG_NORMAL,DEL_FLAG_DELETE,DEL_FLAG_AUDIT
public static final String DEL_FLAG_NORMAL = "0";
public static final String DEL_FLAG_DELETE = "1";
public static final String DEL_FLAG_AUDIT = "2";
//定义无参构造方法:BaseEntity()
在何时调用?在哪里调用?调用后做了什么?
public BaseEntity(){}
//定义有参构造方法:BaseEntity(String id)
在何时调用?在哪里调用?调用后做什么?
public BaseEntity(String id){
this();//调用无参构造方法!为什么在这里调用呢?
this.id = id;
}
//id属性的getter方法getId():多了1个注解,问题:注解做了什么?
@SupCol(isUnique="true",isHide="true")
public String getId(){
return this.id;
}
//id属性的setter方法setId():正常
public void setId(String id){
this.id = id;
}
//currentUser属性的getter方法:getCurrentUser():1.多了两个注解;2.与一般的setter不同,不是直接返回,而是初始化之后再返回!
//两种返回的区别在哪里
@JsonIgnore
@XmlTransient
public User getCurrentUser(){
//先忽略这个代码:
if(this.currentUser == null){
//初始化currentUser属性:值从哪来呢?
this.currentUser = UserUtils.getUser();
//为什么要初始化呢?
//之前的为什么都没有初始化呢?
//如果没有初始化,可能调用该getter方法取到的值就是空
//先初始化无非就是让该方法不返回空值
}
return this.currentUser;
}
//currentUser属性的setter方法setCurrentUser():正常
//该方法在何时调用?在哪里调用?由谁调用?
public void setCurrentUser(User currentUser){
this.currentUser = currentUser;
}
//page属性的getter方法 getPage():1.多了两个注解;2.与一般getter不同,不是直接返回,而是先初始化再返回!两种返回的区别在哪里?
@JsonIgnore
@XmlTransient
//任何时候取page属性值时,都不允许取空值
//该方法在何时调用?在哪里调用?由谁调用?
public Page<T> getPage(){
if(this.page == null){
//初始化:值从哪里来呢?
this.page = new Page();
}
//然后再返回
return this.page;
}
//page属性的setter方法setPage():有返回值!
//为什么page属性的setter方法会有返回值呢?
//莫非该方法调用后,还能用到返回值?
public Page<T> setPage(Page<T> page){
this.page = page;
return page;
}
//sqlMap属性的getter方法getSqlMap():1.多了两个注解;2.先初始化,再返回!
@JsonIgnore
@XmlTransient
//不允许sqlMap取空值
public Map<String,string> getSqlMap(){
if(this.sqlMap == null){
//先初始化
this.sqlMap = Maps.newHashMap();
}
return this.sqlMap;
}
//setInSqlMap属性的setter方法:setSqlMap()正常
public void setSqlMap(Map<String,String> sqlMap){
this.sqlMap = sqlMap;
}
//定义getInSqlMap()方法 getInSqlMap():1.该方法多了两个注解;其他都正常!
@JsonIgnore
@XmlTransient
//该方法允许获取空值?还是一般情况下,inSqlMap不为空值?
public Map<String,List<Object>> getInSqlMap(){
return this.inSqlMap;
}
//定义setInSqlMap()方法setInSqlMap():十分不正常
public void setInSqlMap(Map<String,List<Object>> inSqlMap){
if(inSqlMap == null){
return;//结束本方法的执行,前提:inSqlMap为null
}
//只有inSqlMap不为空值才进行设置操作
//忽略
StringBuffer sqlIn = new StringBuffer();
//忽略
StringBuffer sqlInKeySet = inSqlMap.keySet();
for(String key : sqlInKeySet){
List<Obeject> values = (List)inSqlMap.get(key);
if(values.size() >= 1){
for(int i = 0; i < values.size(); i++){
if(i == values.size() - 1){
sqlIn.append("'" + values.get(i) + "'");
}else{
sqlIn.append("'" + values.get(i) + "',");
}
}
sqlIn.insert(0,"AND" + key + "IN(");
sqlIn.append(")");
}
getSqlMap().put("IN",sqlIn.toString());
}
this.inSqlMap = inSqlMap;
}
//先把方法都挨个定义出来,再逐一完善
//再定义一个setInSqlMap方法(与上面参数不同)
//定义preInsert()方法:先忽略这个方法
public abstract void preInsert();
//定义preUpdate()方法:先忽略这个方法
public abstract void preUpdate();
//定义getIsNewRecord()方法
@JsonIgnore
public boolean getIsNewRecord(){
}
//定义setIsNewRecord()方法
public void setIsNewRecord(){
}
//定义Global属性的getter方法:先忽略这个方法
@JsonIgnore
public Global getGlobal(){
}
//定义Dbname属性的getter方法:先忽略这个方法
public String getDbname(){
}
//定义equals方法:先忽略这个方法
public boolean equals(){
}
//定义toString方法:先忽略这个方法
public String toString(){
return ReflectionToStringBuilder.toString(this);
}
}
总结:首先这个类定义的属性有:id;currentUser;page;sqlMap;inSqlMap;isNewRecord;DEL_FLAG_NORMAL;DEL_FLAG_DELETE;DEL_FLAG_AUDIT
//这个BaseEntity中定义的在结构上与其他实体类共同的方法有:实体类的构造方法,属性的getter和setter方法
//在属性的getter方法中,如何才能让gett方法不取空值?在方法中先初始化该属性!注意:在这里初始化有前提条件:该属性为空值null
//也就是说,逻辑是这样:如果该属性为null,那么就先初始化该属性!
//除此之外还定义的方法有:
1.getGlobal()
2.getDbname()
3.equals()
4.toString()
5.preInsert()
6.preUpdate()
//这里5和6两种方法是抽象方法
现在重点研究一下Map类
Map类是一个接口类:
其中,K和V表示两种数据类型!
接口类中只能定义方法:定义属性也没用的,又不能被实例化
Map类定义的方法有:
size();isEmpty();containsKey(Object key);containsValue(Object value);这些都叫查询操作!
get(Object key);put(K key, V value);remove(Object key);这些都叫更改操作
putAll(Map<? extends K, ? extends V> m);clear();这些叫批量操作
keySet();values();entrySet();
equals(Object o);hashCode();比较和hash操作!!
public interface Map<K,V> {
// Query Operations(查询操作)
//int size()方法的说明
/**
* Returns the number of key-value mappings in this map. If the
(返回当前映射map实例中,键值映射对的数量;如果当前映射实例map中包含的元素的数量)
* map contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
(超过了Integer.MAX_VALUE,那么调用该方法将只会返回Integer.MAX_VALUE)
* <tt>Integer.MAX_VALUE</tt>.
*
* @return the number of key-value mappings in this map
*/(对返回值的说明:返回当前映射实例map中键值对映射的数量)
int size();
/**isEmpty()方法的说明
* Returns <tt>true</tt> if this map contains no key-value mappings.
* (如果该映射实例map中包含的键值对映射的数目为0,那么将会返回true)
* @return <tt>true</tt> if this map contains no key-value mappings
*/(对返回值的说明:如果该映射实例map中包含的键值对映射的数目为0,那么将会返回true)
boolean isEmpty();
/**containsKey(Object key)方法的说明
* Returns <tt>true</tt> if this map contains a mapping for the specified
(如果当前映射实例map中一个有这个指定的key的映射对的话,就返回true)
* key. More formally, returns <tt>true</tt> if and only if
(更正式的表达是:当且仅当这个映射实例map含有一个对该key的映射时,)
* this map contains a mapping for a key <tt>k</tt> such that
(比如:如果key为null,那就检测map实例中的k有没有为null的)
* <tt>(key==null ? k==null : key.equals(k))</tt>. (There can be
(如果有,就返回true,如果key不为null,就将key和k做相等比较)
* at most one such mapping.)
*
* @param key key whose presence in this map is to be tested
* @return <tt>true</tt> if this map contains a mapping for the specified
* key
* @throws ClassCastException if the key is of an inappropriate type for
* this map
* (<a href="Collection.html#optional-restrictions">optional</a>)
* @throws NullPointerException if the specified key is null and this map
* does not permit null