Monthly Archive for 八月, 2009

整理下思路,别让后续的开发越走越远

后台的基本开发目前是一个阶段了,对基本数据的增删改都完成了,以及对全局变量的控制等等,写个日志,记录点东西,要不按照现在这个写法的话,回头的代码只会越写越,还是记录下,整理下思路。
现在的代码已经远离开始设计的初衷了,时间的仓促让一些想法得不到实现就暂时解决了,这样下去只会造成离设想的差距越来越大,心目中完美的程序应该是可以模块化定制的,可以对不同的信息分别进行设置,文章就是文章的模型,专题就是专题的模型等等,帝国在这块不错,自定义每个模块的字段,但是这个在java下的实现好像比较困难,java的持久层把所有的表已经实例化了,就算能够中间修改的话,但是配置文件的加载好像还是个问题,具体没有研究,但是想过用配置表的方法来解决,具体实现还没考虑好,是个问题。
Continue reading ‘整理下思路,别让后续的开发越走越远’

MYSQL-FRONT注册码

临时放一下,省得每次还都要去网上搜。
bq46P9OyfEA3YyUakUy5YLvf7GEVjwYOk
rpYm3ws6GRPXiviP3I0gqHa86lvXkBot5
1saI5iSx3+STo7s/x1Qf+ps13XYKCZ9cL
yHKWYIGkndpDNfraTtQISaoW6me8QjE3n
UwLKsqHmYWNdVUT6f7zFU5A5EYBcmohdD
ggpHiPY2MWkDB3dcJnEvFkVT1VOwYDXAb
TngNwvYYaWm1STf5si549bmp1Cnk6ISVS
t4AMLXLkWhh5XTJP03SykDUdgOw7Gj1/g
gZfRTlNJkna3ig==

扩展ibatis,使ibatis支持数据库物理分页

这期快乐女生,黄英看样子要被PK下去。但我估计会是李霄云诶.- -#

老婆在看快乐女生,本来说陪老婆看今天不弄了,不过还是放心不下,时间太短,只好又打开电脑,把这几天一直在考虑的一件事情给弄了,使ibatis支持数据库物理分页,要不然的话,回头等到东西都弄完后再整更麻烦。

本来想还需要看下ibatis的代码,跟着瞅下中间的实现机制,结果网上Google了下发现,N多的方法,已经有达人解决这个问题了,嘿,看来逻辑分页大家都不喜欢诶,正好,赶时间,直接先copy过来,回头整理的时间再看看能有否扩充没吧。

把代码整个copy过来,大家也可以参考下。(最原始的出处已经不详了,搜索了下,应该出处自:http://blog.csdn.net/duanaiguo/archive/2006/11/23/1408398.aspx此篇文章,但此篇文章已经打不开,博主貌似转到了javaeye了,随后跟进到javaeye,结果很遗憾,javaeye打不开,貌似今天一天都打不开了,但估计原创作者应该是此位duanaiguo,希望大家如有转载能保留以下链接,谢谢!内容不包含对ibatis的源码分析,只列出解决的步骤)

转载自:http://duanaiguo.javaeye.com
作者:duanaiguo

1.覆盖ibatis默认的SQL执行方法,覆盖executeQuery

package com.javaing.dao.ibatis.ext;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.javaing.dao.ibatis.Dialect;
import com.ibatis.sqlmap.engine.execution.SqlExecutor;
import com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback;
import com.ibatis.sqlmap.engine.scope.RequestScope;

public class LimitSqlExecutor extends SqlExecutor {

private static final Log logger = LogFactory.getLog(LimitSqlExecutor.class);

private Dialect dialect;

private boolean enableLimit = true;

public Dialect getDialect() {
return dialect;
}

public void setDialect(Dialect dialect) {
this.dialect = dialect;
}

public boolean isEnableLimit() {
return enableLimit;
}

public void setEnableLimit(boolean enableLimit) {
this.enableLimit = enableLimit;
}

@Override
public void executeQuery(RequestScope request, Connection conn, String sql,
Object[] parameters, int skipResults, int maxResults,
RowHandlerCallback callback) throws SQLException {
if ((skipResults != NO_SKIPPED_RESULTS || maxResults != NO_MAXIMUM_RESULTS)
&& supportsLimit()) {
sql = dialect.getLimitString(sql, skipResults, maxResults);
if (logger.isDebugEnabled()) {
logger.debug(sql);
}
skipResults = NO_SKIPPED_RESULTS;
maxResults = NO_MAXIMUM_RESULTS;
}
super.executeQuery(request, conn, sql, parameters, skipResults,
maxResults, callback);
}

public boolean supportsLimit() {
if (enableLimit && dialect != null) {
return dialect.supportsLimit();
}
return false;
}

}

2.创建Dialect接口,如果以后需要扩展oracle或者其他,实现此中方法

package com.javaing.dao.ibatis;

public interface Dialect {

public boolean supportsLimit();

public String getLimitString(String sql, boolean hasOffset);

public String getLimitString(String sql, int offset, int limit);
}

3.实现Dialect接口mysql下的实现

package com.javaing.dao.ibatis;

public class JavaingMySQLDialect implements Dialect {
protected static final String SQL_END_DELIMITER = ";";

public String getLimitString(String sql, boolean hasOffset) {
return new StringBuffer(sql.length() + 20).append(trim(sql)).append(
hasOffset ? " limit ?,?" : " limit ?")
.append(SQL_END_DELIMITER).toString();
}

public String getLimitString(String sql, int offset, int limit) {
sql = trim(sql);
StringBuffer sb = new StringBuffer(sql.length() + 20);
sb.append(sql);
if (offset > 0) {
sb.append(" limit ").append(offset).append(',').append(limit)
.append(SQL_END_DELIMITER);
} else {
sb.append(" limit ").append(limit).append(SQL_END_DELIMITER);
}
return sb.toString();
}

public boolean supportsLimit() {
return true;
}

private String trim(String sql) {
sql = sql.trim();
if (sql.endsWith(SQL_END_DELIMITER)) {
sql = sql.substring(0, sql.length() - 1
- SQL_END_DELIMITER.length());
}
return sql;
}

}

4.把LimitSqlExecutor注入到Spring中去

package com.javaing.dao.ibatis;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.engine.execution.SqlExecutor;
import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient;
import com.javaing.dao.ibatis.ext.LimitSqlExecutor;

public abstract class BaseDaoiBatis extends SqlMapClientDaoSupport {

private SqlExecutor sqlExecutor;

public SqlExecutor getSqlExecutor() {
return sqlExecutor;
}

public void setSqlExecutor(SqlExecutor sqlExecutor) {
this.sqlExecutor = sqlExecutor;
}

public void setEnableLimit(boolean enableLimit) {
if (sqlExecutor instanceof LimitSqlExecutor) {
((LimitSqlExecutor) sqlExecutor).setEnableLimit(enableLimit);
}
}

public void initialize() throws Exception {
if (sqlExecutor != null) {
SqlMapClient sqlMapClient = getSqlMapClientTemplate()
.getSqlMapClient();
if (sqlMapClient instanceof ExtendedSqlMapClient) {
ReflectUtil.setFieldValue(((ExtendedSqlMapClient) sqlMapClient)
.getDelegate(), "sqlExecutor", SqlExecutor.class,
sqlExecutor);
}
}
}
}

5.利用initialize方法执行注入,在spring中配置init就可以了,然后因为sqlExecutor是私有成员,没有set方法此处只能利用反射机制

package com.javaing.dao.ibatis;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ReflectUtil {

private static final Log logger = LogFactory.getLog(ReflectUtil.class);

public static void setFieldValue(Object target, String fname,
Class<?> ftype, Object fvalue) {
if (target == null
|| fname == null
|| "".equals(fname)
|| (fvalue != null && !ftype
.isAssignableFrom(fvalue.getClass()))) {
return;
}
Class<?> clazz = target.getClass();
try {
Method method = clazz.getDeclaredMethod("set"
+ Character.toUpperCase(fname.charAt(0))
+ fname.substring(1), ftype);
if (!Modifier.isPublic(method.getModifiers())) {
method.setAccessible(true);
}
method.invoke(target, fvalue);

} catch (Exception me) {
if (logger.isDebugEnabled()) {
logger.debug(me);
}
try {
Field field = clazz.getDeclaredField(fname);
if (!Modifier.isPublic(field.getModifiers())) {
field.setAccessible(true);
}
field.set(target, fvalue);
} catch (Exception fe) {
if (logger.isDebugEnabled()) {
logger.debug(fe);
}
}
}
}
}

6.配置spring bean

<!-- 父类DAO,所有dao类基于此类 -->
<bean id="baseDao" abstract="true"
class="com.javaing.dao.ibatis.BaseDaoiBatis"
init-method="initialize">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="sqlMapClient">
<ref bean="sqlMapClient" />
</property>
<property name="sqlExecutor">
<ref bean="sqlExecutor" />
</property>
</bean>

OK,就这么多,后面直接使用就可以了,因为以前的DAO都是继承SqlMapClientDaoSupport类的,现在直接继承自BaseDaoiBatis就可以了,使用queryForList方法直接分页查询就可以了,可以debug下看看输出日志,嘿,这下心里爽多了,明天把代码修改下,然后增加上以前的一个分页标记,OK!

忙里偷闲,上来写个日志

1.关于代码
经过了几番修改,目前代码的基础环境应该没什么大的问题了,在后期的修改以及功能扩充上,应该不至于说有太大的问题,无法预知的问题或许还有,不过像前两天能搞上一天去解决的问题应该不多了,刚想了下,在于前台结合的时间,确定用FreeMarker的话,那么关于前台的Action或许就要换种方法来写了,统一的一个action,然后根据不同类型自动转向,对于在view中需要调用的数据,就用模板标记在解析时自动来调用,这样的话,很大程度上减少了后期的工作量,而且对于模板日后的维护也会很方便。
Continue reading ‘忙里偷闲,上来写个日志’

整合了一个所见即所得编辑器,增加上传功能

加班的时间网上搜了下一些编辑器,不想用功能那么多的,太强大了也没什么用,系统中无非就是一些文章和图片而已,能稍微排版就可以了,估计加诺也用不到code高亮功能,结果搜索了一部分发现,要么是很庞大的一个,要么就是太精简了。- -#,精简的让人有点接受不了,无奈,难道还要用FCK?非常不喜欢这个编辑器,太大了,虽然angel精简的有几个版本,不过老感觉怪怪的,而且代码看起来也很头疼,没有头绪,就在这个时候,找到了偶要的编辑器了。
很小,但是功能很强悍,而且对于浏览器支持很不错,IE6,7,8,FF,Chrome,Opera都正常,而且加载速度很快,关键是,这个的代码看着很清新,- -#,至少偶能改改,呵呵。搞了几个钟头,又写了个Struts2的上传类,然后整合到编辑器中,哦也,搞定,剩下的一个就是关于多图片的批量上传了,封装下上传类,然后List集合搞定吧。不能那么费时间去研究细节了,时间紧迫啊。:(
恩,不错,看着这个编辑器挺喜欢,哈哈,以后就是御用编辑器勒,吼吼,回头整理完了放上来。
睡觉睡觉,连着几天都1点多睡,中午还要值班,顶不住了。=.=

好困,睡觉了,暂时记录下

分页那块的看看能剥离出来不能,剥离不了的话,就暂时先用逻辑分页算了,效率的问题回头再解决,记得以前好像写个一个专用的分页标签的,回头找找看直接套进去可以不.
ibatis今天可折磨死人了,和spring之间的一个注入问题,搞死我了,啥时候出错信息也能像hibernate那样直观就好了,明明是配置获取实例的问题,直接抛个空指针异常,然后Debug看了下错误介绍,说是SQL文件配置出错,找啊找,找啊找,就差把代码删除全部重新写了.你直接报错出来没有注入某个实例,然后位空不就OK了么.R!顺便Fuck下那些垃圾站,Google搜了下,千篇一律的都是一段相同的代码,奶奶的,还好找了个源码debug下去瞅瞅,才找到问题.- -#
Continue reading ‘好困,睡觉了,暂时记录下’

当幸福来敲门

克里斯最后还是成功了,当被证卷公司告知明天就结束实习期,变为正式员工的时候,克里斯的眼眶红了,是的,他哭了,或许这是一个男人,一个父亲,一个丈夫,在渴望得到幸福而得到所谓的幸福后最直接的一个诠释.
当幸福来敲门,这部电影在刚上映的时间就看了,2006年,那个时候,还没有为了生计而四处奔波,每个月还拿着家里给的钱,然后黑天黑夜的泡在电脑前,不知道在做什么,理所当然的看了后只觉得是不励志片,但所有的压力似乎和我还没有很大的关系,尽管嘴上说压力很大.而如今,时隔三年后再看这部电影时,突然感觉,克里斯就像他儿子说的一样,是个很伟大的父亲,所有的重担,就像他每天都不离身的"大箱子",统统这些的压力.
Continue reading ‘当幸福来敲门’

唯爱工作室,我的婚纱照经历

好吧,我承认,这个标题是为了给唯爱工作室打广告,同时也是给自己做个关键字而已,虽然唯爱工作室已经把这个关键字做了,:),恩,当然了,还是有点实际性的内容的.如果近段时间有童鞋需要照婚纱照的话,不妨看看这篇博,或许对你有些帮助,如果在郑州的话,当然直接推荐唯爱了,嘿嘿.
耐于老婆压力,本人于7月底8月初开始考虑照婚纱照,在咨询了N多同事后发现,这个东西是个无底洞,还是不照的好,不过还好,偶知道从网上先搜索下看看,了解一些情况以及所谓的内幕,很不幸,90%的资料貌似都是不利的,总结一下,貌似最多的问题就是,婚纱照的后期消费不透明,谈好的价钱,在最后或许会翻了好几倍.恩,夸张点说,开始谈好的3K或许最后会到1W,恩,一个K一个W,级别就不一样了.在照相的时间,什么定妆啦,衣服啦,通通都要再加钱,然后本来应该外景的,结果用室内给代替,用假景,出来后效果看起来很假,等等吧,N多的问题.也可能这些通病,造成了像我这样的童鞋有了对婚纱照的恐惧吧,好了,现在不用怕了,有了摄影工作室,上面的所有担心不用怕了.下面开始我们的正文,我在唯爱摄影的经历.(好像有点像广告了.- -#)
Continue reading ‘唯爱工作室,我的婚纱照经历’


无觅相关文章插件,快速提升流量