泛型

1、泛型的定义

1、泛型是一种类型
    1、关于Type
            //是一个标示接口,该标示接口描述的意义是代表所有的类型
        public interface Type {
        }
    2、Type的分类
          Class<T>
          ParameterizedType  泛型
          ......

2、泛型的结构

public Person<T>{
    
    }
    public interface ParameterizedType extends Type {
        Type[] getActualTypeArguments();  <T>
        Type getRawType();                Person
        Type getOwnerType();              Person<T>
    }

3、参数的传递

1、第一种
        ArrayList<E>
        ArrayList<Person> al = new ArrayList<Person>();  在执行该代码的时候就把Person传递给E了
    2、第二种情况
        public interface BaseDao<T>{
        
        }
        public class BaseDaoImpl<T> implements BaseDao<T>{
        
        }
        public class PersonDaoImpl extends BaseDaoImpl<Person>{}

各个类的组成

1、BaseDao

对crud的接口进行了抽象设计

import java.io.Serializable;
import java.util.Collection;
import java.util.Set; public interface BaseDao<T>{
public void saveEntry(T t);
public void deleteEntry(Serializable id);
public void updateEntry(T t);
public Collection<T> queryEntry();
public T getEntryById(Serializable id);
public Set<T> getEntrysByIds(Serializable[] ids);
}

BaseDao.java

2、BaseDaoImpl

对crud做一个公共的实现

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import org.springframework.orm.hibernate3.HibernateTemplate; import com.itheima09.oa.dao.base.BaseDao; /**
* 该类不能被实例化
* @author zd
*
* @param <T>
*/
public abstract class BaseDaoImpl<T> implements BaseDao<T>{
@Resource(name="hibernateTemplate")
public HibernateTemplate hibernateTemplate; private Class entityClass; //实体bean的class形式
//持久化类的 标示符的名称
private String identifierPropertyName; /**
* 该init方法是由spring容器来调用的
*/
@PostConstruct
public void init(){
/*
* 获取到实体bean的标示符的属性的名称
*/
this.identifierPropertyName = this.hibernateTemplate.getSessionFactory()
.getClassMetadata(entityClass)
.getIdentifierPropertyName();
} public BaseDaoImpl(){
//this代表具体的类的对象
//this.getClass().getGenericSuperclass() = BaseDaoImpl<T>
/**
* 如果该类被实例化,则this代表BaseDaoImpl的对象
* this.getClass就是该对象的字节码的形式
* this.getClass().getGenericSuperclass()代表该对象的父类即Object
* 所以这行代码得出的是一个Class而不是一个ParameterizedType
*/
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
//得到参数的部分
this.entityClass = (Class)type.getActualTypeArguments()[0];
System.out.println(type.getRawType());//rawType=BaseDaoImpl
} @Override
public void saveEntry(T t) {
// TODO Auto-generated method stub
this.hibernateTemplate.save(t);
} @Override
public void deleteEntry(Serializable id) {
// TODO Auto-generated method stub
T t = (T)this.hibernateTemplate.get(this.entityClass, id);
this.hibernateTemplate.delete(t);
} @Override
public void updateEntry(T t) {
// TODO Auto-generated method stub
this.hibernateTemplate.update(t);
} @Override
public Collection<T> queryEntry() {
// TODO Auto-generated method stub
return this.hibernateTemplate.find("from "+this.entityClass.getName());
} @Override
public T getEntryById(Serializable id) {
// TODO Auto-generated method stub
return (T)this.hibernateTemplate.get(this.entityClass, id);
} public Set<T> getEntrysByIds(Serializable[] ids){
StringBuffer buffer = new StringBuffer();
buffer.append("from "+this.entityClass.getName());
buffer.append(" where "+this.identifierPropertyName+" in(");
for(int i=0;i<ids.length;i++){
if(i==ids.length-1){
buffer.append(ids[i]);
}else{
buffer.append(ids[i]+",");
}
}
buffer.append(")");
return new HashSet<T>(this.hibernateTemplate.find(buffer.toString()));
}
}

BaseDaoImpl.java

3、PersonDao

是一个具体的dao

import com.itheima09.oa.dao.base.BaseDao;
import com.itheima09.oa.domain.Person; public interface PersonDao extends BaseDao<Person>{ }

PersonDao.java

4、PersonDaoImpl

是一个具体的dao的实现

import org.springframework.stereotype.Repository;

import com.itheima09.oa.dao.PersonDao;
import com.itheima09.oa.dao.base.impl.BaseDaoImpl;
import com.itheima09.oa.domain.Person; @Repository("personDao")
public class PersonDaoImpl extends BaseDaoImpl<Person> implements PersonDao{ }

PersonDaoImpl.java

5、BaseService

对crud进行声明

public interface BaseService<T> {
public void saveEntry(T t);
public void deleteEntry(Serializable id);
public void updateEntry(T t);
public Collection<T> queryEntry();
public T getEntryById(Serializable id);
}

BaseService.jav

6、BaseServiceImpl

调用baseDao,对BaseService进行crud的实现

import java.io.Serializable;
import java.util.Collection; import org.springframework.transaction.annotation.Transactional; import com.itheima09.oa.dao.base.BaseDao;
import com.itheima09.oa.service.base.BaseService; public abstract class BaseServiceImpl<T> implements BaseService<T>{ //声明一个抽象方法,用于子类进行实现
public abstract BaseDao<T> getBaseDao(); @Transactional
public void saveEntry(T t) {
// TODO Auto-generated method stub
this.getBaseDao().saveEntry(t);
} @Transactional
public void deleteEntry(Serializable id) {
// TODO Auto-generated method stub
this.getBaseDao().deleteEntry(id);
} @Transactional
public void updateEntry(T t) {
// TODO Auto-generated method stub
this.getBaseDao().updateEntry(t);
} @Transactional(readOnly=true)
public Collection<T> queryEntry() {
// TODO Auto-generated method stub
return this.getBaseDao().queryEntry();
} @Transactional(readOnly=true)
public T getEntryById(Serializable id) {
// TODO Auto-generated method stub
return this.getBaseDao().getEntryById(id);
}
}

BaseServiceImpl.java

7、PersonService

import com.itheima09.oa.domain.Person;
import com.itheima09.oa.service.base.BaseService; public interface PersonService extends BaseService<Person>{
}

PersonService.java

8、PersonServiceImpl

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.itheima09.oa.dao.PersonDao;
import com.itheima09.oa.dao.base.BaseDao;
import com.itheima09.oa.domain.Person;
import com.itheima09.oa.service.PersonService;
import com.itheima09.oa.service.base.impl.BaseServiceImpl; @Service("personService")
public class PersonServiceImpl extends BaseServiceImpl<Person> implements PersonService{
@Resource(name="personDao")
private PersonDao personDao; @Override
public BaseDao<Person> getBaseDao() {
// TODO Auto-generated method stub
return this.personDao;
}
}

PersonServiceImpl.java

9、 BaseAction

import java.lang.reflect.ParameterizedType;
import java.util.Collection; import org.springframework.beans.BeanUtils; import com.itheima09.oa.service.base.BaseService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{ //public abstract BaseService<T> getBaseService(); private Class modelDriverClass;
private Long id; //跳转到列表页面的常量
public static final String LISTACTION = "listAction";
//跳转到更新页面的常量
public static final String UPDATEUI = "updateUI";
//跳转到增加页面的常量
public static final String ADDUI = "addUI";
//action跳转到action
public static final String ACTION2ACTION = "action2action"; public String listAction = LISTACTION;
public String addUI = ADDUI;
public String updateUI = UPDATEUI;
public String action2action = ACTION2ACTION; public void setId(Long id) {
this.id = id;
} private T t; public BaseAction() {
//获取 BaseAction<T>
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
//获取T的class形式
this.modelDriverClass = (Class)type.getActualTypeArguments()[0];
try {
this.t = (T) this.modelDriverClass.newInstance();//为t创建对象
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Override
public T getModel() {
// TODO Auto-generated method stub
return this.t;
} /**
* 查询
*/
public String showData(){
//Collection<T> dataList = this.getBaseService().queryEntry();
//System.out.println(dataList.size());
ActionContext.getContext().put("dataList", null);
return "list";
} /**
* 跳转到增加的页面
*/
public String addUI(){
return "addUI";
} /**
* 增加
*/
public String add() throws Exception{
Object obj = this.modelDriverClass.newInstance();
BeanUtils.copyProperties(this.getModel(), obj);
T t = (T)obj;
//this.getBaseService().saveEntry(t);
return "action2action";
} /**
* 跳转到修改的页面
*/
// public String updateUI(){
// //T t = this.getBaseService().getEntryById(this.id);
// ActionContext.getContext().getValueStack().push(t);
// return "updateUI";
// }
}

BaseAction.java

10、PersonAction

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; import com.itheima09.oa.domain.Person;
import com.itheima09.oa.service.PersonService;
import com.itheima09.oa.service.base.BaseService;
import com.itheima09.oa.struts2.action.base.BaseAction; @Controller("personAction")
@Scope("prototype")
public class PersonAction extends BaseAction<Person>{ @Resource(name="personService")
private PersonService personService; // @Override
// public BaseService<Person> getBaseService() {
// // TODO Auto-generated method stub
// return this.personService;
// } }

PersonAction.java

类与类之间的关系

  类实现了某一个接口
  类继承了某一个类
  引用

SSH项目Dao层和Service层及Action的重用的更多相关文章

  1. 搭建DAO层和Service层代码

    第一部分建立实体和映射文件 1 通过数据库生成的实体,此步骤跳过,关于如何查看生成反向工程实体类查看SSH框架搭建教程-反向工程章节 Tmenu和AbstractorTmenu是按照数据库表反向工程形 ...

  2. 分层 DAO层,Service层,Controller层、View层

    前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...

  3. Java中Action层、Service层、Modle层和Dao层的功能区分

    一.Java中Action层.Service层.Modle层和Dao层的功能区分: 首先,这是现在最基本的分层方式,结合了SSH架构. modle层就是对应的数据库表的实体类.(即domain) Da ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. DAO层,Service层,Controller层、View层 的分工合作

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  6. [转]DAO层,Service层,Controller层、View层

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  7. DAO层,Service层,Controller层、View层

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  8. DAO层,Service层,Controller层、View层介绍

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  9. DAO层,Service层,Controller层、View层协同工作机制

    转自 http://www.blogdaren.com/post-2024.html DAO层:DAO层主要是做数据持久层的工 作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计D ...

  10. DAO层,Service层,Controller层、View层、entity层

    1.DAO(mapper)层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就 ...

随机推荐

  1. 微信小程序--缓存,支持过期时间的二次开发封装

    简介 微信小程序提供了缓存的api,包括同步和异步两种,具体api不多说明,可自行查看官方文档 现在微信小程序缓存api存在一个问题就是没有设定过期时间,下面给大家介绍一下对小程序缓存的二次封装,使其 ...

  2. Python socket day5

    下载文件 程序04,05 服务端在接收到文件名时应该用try来打开文件,不应该用with open来打开否则,如果文件名不存在,用with open 会出错误 客户端要判断服务端发送的数据是否为空,不 ...

  3. MYSQL内置函数【转】

    一.MySQL 字符串函数 函数 描述 实例 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码. 返回 CustomerName 字段第一个字母的 ASCII 码: SELECT AS ...

  4. JavaScript自学笔记(1)---表单验证,let和const,JSON文件

    今天开个JS自学笔记,本身JS的语法很简单,如果学过Java或者C系的都很容易,就不讨论了.主要是讨论实际应用的问题. 1.表单验证: a.html自动验证: HTML 表单验证可以通过浏览器来自动完 ...

  5. linux下使用bower时提示bower ESUDO Cannot be run with sudo解决办法

    今天准备在使用bower安装一些东西的时候,废了老半天劲,因为需要node环境以及bower平台,安装不顺利,通过百度,最解决了这些问题: 在执行bower命令的时候,总是会报错,原来需要在命令后添加 ...

  6. 201771010135 杨蓉庆《面对对象程序设计(java)》第十五周学习总结

    1.实验目的与要求 (1) 掌握Java应用程序的打包操作: (2) 了解应用程序存储配置信息的两种方法: (3) 掌握基于JNLP协议的java Web Start应用程序的发布方法: (5) 掌握 ...

  7. 四、Python文件操作

    描述:Python的文件操作涉及对文件的读/写与编码的处理. 1.两种写法 1.1 第一种 1 f = open('文件路径', '文件操作方式', encoding='utf-8') 2 对文件操作 ...

  8. oracle错误代码大全(超详细)

    本篇文章是对oracle错误代码进行了详细的总结与分析,需要的朋友参考下 ORA-00001: 违反唯一约束条件 (.)ORA-00017: 请求会话以设置跟踪事件ORA-00018: 超出最大会话数 ...

  9. python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数。如果不存在这样一对整数,则输入一条消息进行说明。

    python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数.如果不存在这样一对整数,则输入一条消息 ...

  10. 如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

    这篇博文主要针对浏览器中绘制椭圆的方法扩展.在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷.其中有压缩法,计算法,贝塞尔曲线法等多种方式.但是都不能很好的绘制出椭圆.所有我就对这个绘制椭圆的方式进行 ...