您好,是这样的一个问题
问题有些复杂,要是我叙述不清楚 还请麻烦您看一下http://www.iteye.com/topic/223650这个帖子。
我有一个GameType类型,其对应MySQL之中的是Set类型。
所以对于业务要求:
1·将GameTyep类型减少一种(比如原来Set类型集合里面有RPG、ACT、TRL,需要变成RPG、ACT)
我的做法是:
1·先从数据库之中检索出来所有的TRL类型的Game类
2·将这些GameType类型之中抹去TRL
3·调用原生SQL语句:
ALTER TABLE downloadmanage
.game
MODIFY COLUMN game_type
SET('NONE','FTG','RAC','RTS','AVG','ACT') DEFAULT NULL
部分源码如下:
[code="java"]
/**
* 删除GameType之中对应的传入delTypes类型
* 如果原有元素属于这种类型,则从原有元素中去除这种类型
* @param delTypes
* @throws Exception
/
public void delTypes(List delTypes)throws Exception{
/*
* 1:检查输入的类型是否在xml之中有对应的类型
/
List rightDelTypes =verifyCinTypes(delTypes); //确认一下输入进来的Types的正确性
/*
* 2:找到所有的满足给定类型的Game类
*/
List ntcg = findInAllTypes(rightDelTypes);
/**
* 3:从所有找到的Game类的Types属性里面删除
* 需要从数据库set属性里面需要删除的types
*/
Iterator<Game> needToChangeGame = ntcg.iterator();
/**
* 遍历所有找到的Game类
*/
while(needToChangeGame.hasNext()){
Game game = needToChangeGame.next();// 当前被检测的Game类
String newGameType = ""; // 生成的新的Type类型
/**
* 遍历找到的所有Game类中的每个gameType中的所有元素
*/
StringTokenizer st = new StringTokenizer(game.getGameType(),",");
int i = 1;
while(st.hasMoreTokens()){
Iterator<String> dt = delTypes.iterator(); // 所有的需要删除的Types类型
String theType =st.nextToken(); //当前遍历到的Type类型
/**
* 让每个type都和给定的需要删除的Type进行比较
*
*/
boolean notDel = true;
while(dt.hasNext()){
/**
* 如果这个Type不是需要删除的
* 在新Typs里面加入该Types
*/
String del = dt.next();
if(theType.equals(del)){
notDel = false;
break; //所查找的元素在
}
}
if(notDel){
newGameType += theType;
if(i < st.countTokens()){
newGameType += ",";
}
}
i++;
}
/**
* 如果这个Game类的Type元素为空,则设置该类Type为“NONE”
*/
if(newGameType.equals("")){
newGameType = "NONE";
}
game.setGameType(newGameType);
}
//到此,所有GameType之中不包含所要删除的GameType类型
/**
* 4:生成新的set类型之中所有类型的集合
*/
List<String> oldAllTypes = getGameNames();
oldAllTypes.removeAll(rightDelTypes);
List<String> newAllTypes = oldAllTypes ;
/**
* 5:更新数据库中所有的查到的Game类
*/
Iterator<Game> changeedGame = ntcg.iterator();
while(changeedGame.hasNext()){
gameDao.update(changeedGame.next());
}
gameDao.flushSession(); // 清空Session之中的Game类
/**
* 6:更新数据库中Types类型
*/
gameDao.updateNewTypes(newAllTypes);;
/**
* 7:更新Xml文件中Types类型
*/
creatXML(newAllTypes);
}
[/code]
问题我解决了,就是在 第6步之前 调用 gameDao.flushSession(); // 清空Session之中的Game类
我的想法是 因为整个delTypes是在一个Session之中,要是我不调用flushSession() 后面的调用原生SQL语句
必然无法实现,因为还存在类型为TRL的元素(实事证明我是对的)
我想问的是,有没有简便方法。 或者说 我这样做 是最优的做法么? 谢谢
ps:我的积分都花出去了,自己又没有实力挣积分,所以没法给您分了 不好意思 呵呵。
[b]问题补充:[/b]
谢谢关注 呵呵
多对多 效率应该不如这个set类型, 因为这个set查询时候是用的二进制比较,效率应该是比较高的。
我在坛子里面发了完整的源码 不过没人理我 呵呵
ps:信心现在是一点都没有,学到越多发现自己就不会的越多 呵呵。
[b]问题补充:[/b]
你好:
我是这么理解这个问题
首先就像我在帖子里面说得一样
1·用到了Find_in_Set这个方法
2·使用了ALTER TABLE这种语句
这些都是不好的地方。
不过这个Game类以后主要的操作 大多都为查找操作,而这种更新删除Set类型的操作很少。
就我这个例子来说,只有当出现了新的游戏类型时候才存在由管理员添加新的类型的需求,同样类似的需求也会出现在别的业务领域里面。
而大多数情况下 都是由用户进行相应的查询操作,而我感觉用set集合进行类别方面的查询,要比使用many-to-many连接查询要快一些(未作试验),所以我这样是牺牲了一部分的移植性来加快了查找的效率。
不知道我这样的理解对不对。
[b]问题补充:[/b]
哦对, 关于Find_in_Set这个方法 我也可以操作SQL语句直接实现,因为我同时维护了一份xml文档如下:
<?xml version="1.0" encoding="UTF-8"?>
NONE
FTG
RAC
RTS
AVG
ACT
所以不存在find_in_set方面的问题。 我的主要出发点还是从效率角度想的
[b]问题补充:[/b]
呵呵
主要是我现在还不懂啥缓存的东西呢。
要不说自己没自信呢,就是懂的太少了 呵呵
谢谢帮助