泛型简介,自定义泛型的应用及泛型在Dao层的应用
来源:互联网 发布:淘宝虚拟专营入口 编辑:程序博客网 时间:2024/05/23 10:12
首先声明一点什么叫泛型
1.在逻辑上属于不同的类,但是实际上属于同一个类的类型叫做泛型(在Java中学名叫参数化类型)比如
ArrayList<String> a1与 ArrayList<Integer> a2在逻辑上是不同的类型但是实际上是一个类也就是System.out.println(a1.getClass()==a2.getClass());//输出true
2.它的重要作用是在不同的参数化类型的问题上将运行时异常转换为编译时异常。
这里有一篇不错的文章Java泛型总结大家可以参考参考。
当一个方法接收的是不确定的类型参数的时候我们可用自定义泛型来解决它
比如接下来我们写一个方法能够让任意类型的数组倒序输出
package generic;import java.util.Arrays;public class Demo2 <T>{ public static void main(String[] args) { Integer[] arr = {1,2,3,4,5};//在泛型中只接受对象类型的变量 reverse(arr); System.out.println(Arrays.asList(arr));//[5, 4, 3, 2, 1] } //静态方法的泛型要在方法上定义在类上面定义无效 public static <T> void reverse(T t[]){ int start = 0; int end = t.length-1; while(true){ if(start>end){ break; } T temp = t[0]; temp = t[start]; t[start] = t[end]; t[end] = temp; start++; end--; } }}
看完这个案例之后我们再谈谈泛型在Dao层的框架(herbinate)中的重要应用,在JDBC中我们用Dao层作为我们的数据与数据库交互的一层。但是有一件事很让人头疼,我们必须根据不同的操作对象去写不同的Dao层。但是在herbinate的情况下我们只需要用自定义参数类型(自定义泛型)写一个基础的Dao然后让其他的Dao继承基础Dao就能轻松实现不同操作对象的增删改查。下面请看代码
首先建一个Person类它将作为我们的操作类
package generic;public class Person {}
然后写好我们的Person操作类即PersonDao 并让他继承我们的BaseDao
package generic;import domain.Person;public class PersonDao extends BaseDao<Person>{}
接下来是重点创建BaseDao类(前提是在操作环境中导入herbinate的相关包)那么它是如何得到PersonDao类的操作类的呢?
首先由于 PersonDao在new一个新的对象的时候会调用父类BaseDao的构造器那么我们就会通过构造器拿到PersonDao这个类。Class clazz = this.getClass();
然后通过这个子类去拿他所继承的带参数的父类即BaseDao<Person>
最后通过getActualTypeArguments()[0]方法得到我们想要操作的类型Person,在这里也就是参数化类型的第一个参数
package generic;import java.lang.reflect.ParameterizedType;import org.hibernate.Session;public class BaseDao <T> { private Session session; private Class clazz; public BaseDao(){ Class clazz = this.getClass();//如果子类调用父类的这个构造器的话那么clazz将得到BaseDao的子类 ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass();//得到带参数的父类(学名叫参数化类型)在这里就是BaseDao<Person>, clazz = (Class) pt.getActualTypeArguments()[0];//得到上述类型中第一个参数在这里我们就得到了Person类 } public void add(T t){ session.save(t); } public void delete(String id){ T t = (T) session.get(clazz, id); session.delete(t); } public void update(T t){ session.update(t); } public T find(String id){ return (T) session.get(clazz, id); }}
最后附上测试代码
package generic;public class Test { public static void main(String[] args) { PersonDao pdao = new PersonDao(); pdao.add(new Person());//此时PersonDao已经有了BaseDao的所有方法 }}
如有错误恳请大家指出
最后再次感谢方立勋老师!
- 泛型简介,自定义泛型的应用及泛型在Dao层的应用
- 在项目的实际开发中,dao层java泛型的的应用(ssh)
- Java反射机制在DAO层的应用实例
- Dao层的复用和泛型
- 基于Hibernate框架的泛型DAO层---SwiftDAO
- 基于DAO层的泛型接口设计
- dao层的泛型实现(2种方法)
- 基于hibernate的泛型Dao层设计
- Hibernate DAO层 的BaseDao泛型写法
- DAO层使用泛型的两种方式
- DAO层使用泛型的两种方式
- DAO与Service层的泛型抽取与实现
- 范型 DAO范型的应用
- 泛型的基本应用、内部原理及更深应用
- 解决SSh中公共Dao使用泛型且Dao层无其他Dao,Service直接继承公共Dao,部署到tomcat可能会出现的错误。
- 利用泛型封装DAO层(万能DAO)
- 传智播客--进销存之项目架构,DAO层和Service层的泛型抽取和实现
- 泛型的思想及应用
- 【IO/NIO】Java NIO浅析
- Caffe基础系列【一】MNIST数据集的测试
- hadoop系列之一集群规划篇
- 函数模板不会进行自动的参数转换
- java面试题,各大企业常见的java笔试题之五
- 泛型简介,自定义泛型的应用及泛型在Dao层的应用
- linux常用工具命令
- 1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
- Webstorm打开失败,提示jdk版本太低
- 数模整数规划实例
- 机器学习和数据挖掘(8):偏见方差权衡
- idea中springmvc, mybatis, gradle环境搭建
- sbt基础
- 共用体判断大小端模式