学习springside过程跟踪之一“熟悉例子helloworld代码”

本文介绍SpringSide框架中的CRUD操作实现,通过继承HibernateEntityDao获得默认的增删改查功能,减少编码负担。
学习最快的方式看代码是一个很好的方法,到springside网站下栽springside-2.0-RC1-allinone.zip,看最简单的例子helloword,
包结构很清晰,典型的mvc三层架构,model、service、web.

看一眼mode.User.java,数据库的实体bean,没什么可说的。

第二眼service.UserManager.java,心里想肯定是逻辑层中的Dao对数据库的操作,增加、读取、更新和删除,editpus完后出乎我的意料
之外,里面没有方法的实现
/**
* 用户管理业务类.
* <p/>
* 继承于HibernateEntityDao,不需任何代码即拥有默认的对User对象的CRUD函数. 如果想了解不继承于EntityDao,自行编写CRUD的写法, 参考{@link UserManagerNativeVersion}.
*
* @author calvin
* @see HibernateEntityDao
* @see org.springside.core.dao.HibernateGenericDao
* @see UserManagerNativeVersion
*/
public class UserManager extends HibernateEntityDao<User> {
// ....CRUD以外的其它商业方法
}
这里面出现了CRUD看完了才知道就是增加、读取、更新和删除几个单词的首字母简写 即Create,Read,Update,Delete四个单词的缩写。是数据库操作的基本功,往往是程序员的入门级课程之一,也是最无聊的工作,在ROR中,这种工作被简化了好多,很多很牛的Java程序员也自己写了机器人去完成这些工作,这里的HibernateEntityDao<User>
肯定就是机器人了.
下面看机器人HibernateEntityDAO,查springside参考手册知道它已存在默认的CRUD函数,子类只要用泛型语法声明自己管理的Entity类型即可,如果你的Manager是简单的CRUD类,没有其他的商业方法,那就恭喜了,上面的代码就是全部。
SpringSide是如何对进行Hibernate封装的呢?看相关文档如下:
SpringSide对Hibernate做了三层封装:

第一层:HibernateGenericDao,基于spring的HibernateDaoSupport,但加入了分页函数与各种Finder函数,并使用泛型避免了返回值强制类型转换。

第二层:HibernateEntityDao,基于HibernateGenericDao,用泛型声明Dao所管理的Entity类,默认拥有该entity的CRUD方法。

第三层:HibernateExtendDao,基于HibernateEntityDao,主要扩展各种选择性的功能。

关于三个类的详细注解请看JavaDoc,大致描述如下:

1 HibernateGenericDao
在Spring HibernateDaoSupport基础上封装的DAO,功能如下:

1.应用泛型:使得find(), get() 这些函数不再返回Object,而是返回T,不再需要强制类型转换。

2.提供各种finder的简便函数
应用了JDK5可变参数的hsql查询函数:List find(String hql, Object... values),支持find(hql),find(hql, param1); find(hql,param1,param2);find(hql,new Object[] {param1,param2}) 四种接口。

简单查询的简化函数:findBy(Class entityClass,String name,Object value) ,findUniqueBy(Class entityClass,String name, Object value),findByLike(Class entityClass,String name,Object value)

3.获得设置好的Query和Criteria:createQuery(String hql,Object... values) 和 createCriteria(Class<T> entityClass,Criterion... criterions)

Spring并没有很好的接口封装支持firstResult, maxResult, fetchsize,cache,cacheRegion 等多个查询参数,所以springside宁愿返回已设置好查询条件的Query和Criteria,让大家继续剩下的参数设置,最后再执行list(),注意那几个参数可以连续设置的,如:

createQuery(hql,param1).setFirstResult(10).setMaxResult(20).llist();
4.分页函数:Page pagedQuery(Criteria criteria, int pageNo, int pageSize) 和Page pagedQuery(String hql, int pageNo, int pageSize, Object... args)

Page是SpringSide自行封装的一个典型Page类,pagedQuery与hibernate自身分页查询的差别是先运行一次count,获得符合条件的总记录数。

如果查询不需要总记录数,用普通的hibernate API,加上setFirstResult(),setMaxResult()就解决,不需要pagedQuery()。

5.判别对象属性在数据库中唯一的函数:isUnique(Class<T> entityClass,Object entity,String names)。

2. HibernateEntityDao
所有UserManager, ProductManager之类只管理一类对象的Manager类的基类,只需要在类定义处声明Entity类型即可

public class BookManager extends HibernateEntityDao<Book> {
}
通过<Book>的定义,避免了HibernateGenericDao类各方法中必有的Class entityClass参数。

如果需要操作其他的Entity,比如BookManager可能需要处理Category(图书目录),可以注入CategoryManager。无需担心事务的问题,JavaEE的默认事务模型已能很好处理。

如果没有对应的CategoryManager,或者各种原因不想注入的话,可以使用BookManager继承自HibernateGenericDao的带entityClass参数的函数来操作Category的增删改,如Category category= this.get(Category.class, 1);

3. HibernateExtendDao
此类演示SpringSide 所作的一些扩展,大家可以按照自己的需要进行修改和扩展。

1. 支持对象不能被直接删除,只能设置状态列为无效。
接口UndeleteableEntityOperation,定义了要支持此功能必须实现的函数。

可以有接口(UndeletableEntity)和annotation(@Undeletable)两种形式来定义无效列,annotation列形式还可以定义标识对象已删除的状态属性的名称,用接口则必须实现setStatus()接口,在里面操作实际的状态属性。

两种方式的异同见侵入,非侵入?Interface vs Annotation。

2. 重载save(),在保存前先调用onValid() 函数
3. 增加find(Map map) 接口
默认查找与map中全部条件相同的entity。

条件的比较运算符默认为相同,用户也可以为属性名加上like_,largerthen_ 这样的前缀,则使用相应的运算符作比较(未完成)
第三眼 看web.UserAction.java,心想应该和struts里的acition一样,editpuls完后得到
/**
* 用户管理Controller.
* <p/>
* 继承于StrutsEntityAction,不需编码就拥有默认的对User对象的CRUD响应函数. 如果想了解不继承于EntityAction,自行编写CRUD的写法, 参考{@link UserActionNativeVersion}.
*
* @author calvin
* @see org.springside.core.web.StrutsEntityAction
* @see org.springside.core.web.StrutsAction
* @see UserActionNativeVersion
*/
public class UserAction extends StrutsEntityAction<User, UserManager> {

@SuppressWarnings("unused")
private UserManager userManager; //看到serviceContext.xml中面有userManager应该是spring的注入

public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}

第四眼 看了web.xml、struts-config.xml、applicationContext.xml、dataAccessContext.xml、serviceContext.xml 五个配置文件。
接下来调试程序,用运成功。
采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值