006 代码抽取 - bos

一、基于Hibernate的Dao层代码的抽取

1.定义BaseDao接口,其他Dao接口继承该接口

2.在Dao接口定定义基本的增删改查和分页有关的方法

public interface BaseDao<T> {
/**
* 保存实体
* @param entity
*/
void save(T entity);
/**
* 删除实体
* @param entity
*/
void delete(T entity);
/**
* 根据实体Id删除实体
* @param id
*/
void deleteById(Serializable id);
/**
* 更新实体信息
* @param entity
*/
void update(T entity);
/**
* 根据Id查询实体
* @param id
* @return
*/
T findById(Serializable id);
/**
* 查询所有实体信息
* @return
*/
List<T> list();
/**
* 查询实体的总数
* @param dc
* @return
*/
Integer getTotalCount(DetachedCriteria dc);
/**
* 分页查询实体
* @param dc 离线查询条件
* @param start 查询起始下标
* @param pageSize 每页的记录条数
* @return
*/
List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize);
}

2.定义BaseDaoImpl,继承HibernateDaoSupport,实现BaseDao接口,主要要注入SessionFactory对象

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {

private Class<T> entityClass;

@SuppressWarnings("unchecked")
public BaseDaoImpl() {
// 获取子类对象的父类类型
ParameterizedType superClass = (ParameterizedType) this.getClass()
.getGenericSuperclass();
// 获得在父类类型上声明的反省数组
Type[] genericTypes = superClass.getActualTypeArguments();
// 第一个泛型即为实体类型
entityClass = (Class<T>) genericTypes[0];
}

@Override
public void save(T entity) {
getHibernateTemplate().save(entity);
}

@Override
public void delete(T entity) {
getHibernateTemplate().delete(entity);
}

@Override
public void deleteById(Serializable id) {
T entity = getHibernateTemplate().load(entityClass, id);
getHibernateTemplate().delete(entity);
}

@Override
public void update(T entity) {
getHibernateTemplate().update(entity);
}

@Override
public T findById(Serializable id) {
return getHibernateTemplate().get(entityClass, id);
}

@Override
public List<T> list() {
return getHibernateTemplate().loadAll(entityClass);
}

@Override
public Integer getTotalCount(DetachedCriteria dc) {
//设置查询的聚合函数,总记录数
dc.setProjection(Projections.rowCount());
@SuppressWarnings("unchecked")
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
//清空之前设置的聚合函数
dc.setProjection(null);

if(list!=null && list.size()>0){
Long count = list.get(0);
return count.intValue();
}else{
return null;
}
}

@Override
public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
@SuppressWarnings("unchecked")
List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
return list;
}

/**
* HibernateDao接口在使用前必须注入SessionFactory
*
* @param sessionFactory
*/
@Autowired
public void setSF(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
}

3.其他的Dao接口继承BaseDao接口,定义额外的方法

4.其他的Dao实现类继承BaseDaoImpl,实现Dao接口定义的方法

二、基于Struts2的Action层的抽取

1.抽取BaseAction,定义基本的内容,供其他Action继承

public class BaseAction<T> extends ActionSupport implements ModelDriven<T>,
RequestAware, SessionAware {

private static final long serialVersionUID = 1L;

protected Map<String, Object> request;
protected Map<String, Object> session;
protected T model;

@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}

@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}

@Override
public T getModel() {
return model;
}

public BaseAction() {
// 获取父类
ParameterizedType genericSuperclass = (ParameterizedType) this
.getClass().getGenericSuperclass();
// 获取父类的泛型数组
Type[] types = genericSuperclass.getActualTypeArguments();
// 取得第一个泛型,即Model的类型
@SuppressWarnings("unchecked")
Class<T> entityClass = (Class<T>) types[0];
try {
model = entityClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

}

2.其他Action类继承该类即可

时间: 2024-11-05 09:34:11

006 代码抽取 - bos的相关文章

Java Web项目中的经典代码抽取

前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内朋友参考. 代码抽取原理图如下: 这个图主要展示开发中的2个业务,账号(Account)管理跟类别(Category)管理,具体代码实现比较简单就不附上了.从上面的UML图中我们只需要抽象出BaseService接口并且实现BaseServiceImpl类,其他业务的实现一概继承BaseServic

9.代码抽取(adapter)

1  抽取Adapter 共性的方法 2  把getView方法里 和holder相关的逻辑 摘取到Holder代码中 3  把Holder 相关的代码 抽取到BaseHolder中 4  把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder BaseHolder 所有holder的基类 DefaultAdapter 所有adapter 的基类 B

非代码抽取的dex加固脱壳

常见的非代码抽取的dex加固,可以通过修改或者hook源码中的dex解析函数拿到目标dex完成脱壳.该dex解析函数为DexFile* dexFileParse(const u1* data, size_t length, int flags),位于src4.4.4_r1/dalvik/libdex/DexFile.cpp文件. 1.修改源码,编译系统,实现脱壳,使用该方法的代表工具--“DexExtractor”.对其的介绍和使用教程见一大牛博客: http://www.wjdiankong.

Dao接口和实现类以及Service接口和实现类代码抽取

紧接着上次无线点餐项目的文档,我们进行Dao层抽取. 6.Dao接口以及实现类代码抽取 对于BoardDao和CuisineDao的处理接口和实现类,除了定义自己的特有方法外,其他基本功能的CRUD方法都一样,只是操作的实体对象不一样.为了代码的复用,简化代码,我们可以将公共的CRUD方法提取到BaseDao中,只需要实现接口即可. 同理, 不同的实现类,实现CRUD相同的业务逻辑的时, 除了操作的实体不同,其他都是相同的, 所以我们可以把相同的业务逻辑实现,抽取出来,放到BaseSericeI

Thymeleaf静态资源引入方式及公共页面代码抽取

静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href="bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> <!-- 引用webjars的方式引入静态资源 --> <link th:href="@{/webjars/bootstrap/

mybatis公用代码抽取到单独的mapper.xml文件

同任何的代码库一样,在mapper中,通常也会有一些公共的sql代码段会被很多业务mapper.xml引用到,比如最常用的可能是分页和数据权限过滤了,尤其是在oracle中的分页语法.为了减少骨架性代码,通常将它们抽象到sql中,但是肯定又不能在每个mapper中也包含,这样就没有意义了.此时,可以将这部分移到专门的mapper.xml中,比如common.xml,其中包含如下: <?xml version="1.0" encoding="UTF-8"?>

网络加载数据及单例工具类的代码抽取

今天给大家分享一一下网络加载数据:先看代码吧-------------------------- - (void)diseaseNumWithFinishedBlock:(FinishedBlocks)finishedBlock{ NSString *urlStr = @"http://数据接口"; NSDictionary *prama = @{响应参数}; [[NetWorkTool sharedNetWorkTool] POST:urlStr parameters:prama p

Flask项目架构之代码抽取

# manage.py 文件 from flask_script import Manager from flask_migrate import Migrate,MigrateCommand from .info import app,db manager = Manager(app) # 用于数据库迁移 Migrate(app, db) manager.add_command('db',MigrateCommand) if __name__ == '__main__': # app.run(

JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建

1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree(重点) 3.数据库建模工具PowerDesigner使用方式 4.myeclipse翻转引擎插件使用(了解) 5.项目底层代码构建(重点) n 持久层代码抽取 n 表现层代码抽取 6.实现BOS项目登录和注销功能 2 jQuery easyUI中动态添加选项卡 l 用于动态添加一个选项卡 l 选中指