博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于泛型反射的案例
阅读量:5135 次
发布时间:2019-06-13

本文共 2931 字,大约阅读时间需要 9 分钟。

1.在创建数据库时创建两个表

CREATE TABLE users(    id INT PRIMARY KEY AUTO_INCREMENT,    userName VARCHAR(30),    pwd VARCHAR(30) )CREATE    TABLE accounts(    id INT AUTO_INCREMENT PRIMARY KEY,    money DOUBLE NOT NULL)

2.编写两个数据库的实体类设计

/** * Entity设计类:Accounts * @author Han * */public class Accounts {        private int id;    private double money;        public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public double getMoney() {        return money;    }    public void setMoney(double money) {        this.money = money;    }}
/** * Entity设计类:Users * @author Han * */public class Users {        private int id;    private String userName;    private String pwd;        public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPwd() {        return pwd;    }    public void setPwd(String pwd) {        this.pwd = pwd;    }}

3.两个方法拥有共同的方法:public Users/Accounts findById(int id)的方法,而这两个方法除了数据库表结构不同(表名)和封装的对象(Users,Accounts)不同,其余的地方都是一样的所以可以编写一个相同的父类,将相同的代码抽取出来,所以就会用到泛型反射,编写BaseDao<T>类。(关键)

/** * BaseDao方法设计,抽取各个Dao中的公用方法 * 各个Dao之间的不同有两点:1,表名,2.当前封装对象 * @author Han * * @param 
*/public class BaseDao
{ /** * 当前对象的类 */ private Class clazz; /** * 当前数据库表的名字(封装对象的类名)(注:表名和类名相同,表中字段与类中成员变量名字相同) */ private String tableName; public BaseDao() { //this 表示调用该方法对象:UsersDao/AccountsDao //this.getClass() 获取当前对象的字节码文件(UsersDao.Class/AccountsDao.Class) //this.getClass().getGenericSuperClass 获取当前运行类的父类 //即为BaseDao
/Base
Type type = this.getClass().getGenericSuperclass(); //强制转化为参数化类型BaseDao
/Base
ParameterizedType pt = (ParameterizedType) type; //获取类型集合types[]{Accounts/Users} Type[] types = pt.getActualTypeArguments(); clazz = (Class) types[0]; tableName = clazz.getSimpleName(); } public T findById(int id){ String sql = "select * from " + tableName + " where id=?"; try { //该处使用DBUtils的jar包和C3P0连接池,JdbcUtils工具类就不列出了 return JdbcUtils.getQuerrRunner().query(sql, new BeanHandler
(clazz), id); } catch (Exception e) { throw new RuntimeException(e); } } }

4.创建两个对象的Dao方法

/** * Dao:Users,将Users对象传入父类BaseDao * @author Han * */public class UsersDao extends BaseDao
{ }
/** * Dao:Accounts,将Accounts对象传入父类BaseDao * @author Han * */public class AccountsDao extends BaseDao
{ }

5.测试类

@Test    public void testDao() throws Exception {                UsersDao dao = new UsersDao();                System.out.println(dao.findById(1));    }

 

OK,测试成功!关于泛型和反射,还需要多多磨炼,多做些例子,才能更好的掌握!

转载于:https://www.cnblogs.com/a294098789/p/5241940.html

你可能感兴趣的文章
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>
企业级应用与互联网应用的区别
查看>>
itext jsp页面打印
查看>>
Perl正则表达式匹配
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>