BaseDAO使用
BaseDao接口的过人之处在于:一般是提供从数据库 增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的底层数据操作自定义类。
由于我们可能操作多个数据库表,这样就需要为每个表提供一个操作他的类 xxDAO, 这些DAO继承BaseDAO 就可以省略很多重复代码(从数据库 增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的代码)。
其次对于泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型在使用中还有一些规则和限制:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String);
一般在涉及DAO开发时,常用到的增删改查方法会封装到一个基类(BaseDAO),对于各个数据表的基本维护业务都需要用到增删改查等方法。
若对每张表都编写一套增删改差方法未必有些麻烦,并且不符合编码的基本准则。一般,我们可以将这些功能的所公用的部分封装为一个对象,或者是类,此类是所有DAO的基类,可以称为:BaseDAO。
由于此类接收到不同的操作对象,故需泛型的支持。
下面,我通过以下实例代码,为此知识进行展示,供大家参考
此例是基于ssh2的环境中进行搭建:
相关类:涉及到BaseDAO接口,接口实现类:BaseDAOImpl、两个数据表的操作对象及相应的接口:DAOA、DAOB、DAOAImpl、DAOBImpl
BaseDAO:接口代码,公共方法的接口类
- package base;
- import java.util.List;
- public interface BaseDao<T> {
- /**
- * 保存实体
- *
- * @param entity
- */
- void save(T entity);
- /**
- * 删除实体
- *
- * @param id
- */
- void delete(Long id);
- /**
- * 更新实体
- *
- * @param entity
- */
- void update(T entity);
- /**
- * 按id查询
- *
- * @param id
- * @return
- */
- T getById(Long id);
- /**
- * 按id查询
- *
- * @param ids
- * @return
- */
- List<T> getByIds(Long[] ids);
- /**
- * 查询所有
- *
- * @return
- */
- List<T> findAll();
- }
BaseDAOImpl:公共方法的实现类
- package base;
- import java.lang.reflect.ParameterizedType;
- import java.util.List;
- import javax.annotation.Resource;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- @SuppressWarnings("unchecked")
- public abstract class BaseDaoImpl<T> implements BaseDao<T> {
- @Resource
- private SessionFactory sessionFactory;
- private Class<T> clazz;
- public BaseDaoImpl() {
- // 使用反射技术得到T的真实类型
- ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型
- this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型
- System.out.println("clazz ---> " + clazz);
- }
- /**
- * 获取当前可用的Session
- *
- * @return
- */
- protected Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- public void save(T entity) {
- getSession().save(entity);
- }
- public void update(T entity) {
- getSession().update(entity);
- }
- public void delete(Long id) {
- Object obj = getById(id);
- if (obj != null) {
- getSession().delete(obj);
- }
- }
- public T getById(Long id) {
- return (T) getSession().get(clazz, id);
- }
- public List<T> getByIds(Long[] ids) {
- return getSession().createQuery(//
- "FROM User WHERE id IN (:ids)")//
- .setParameterList("ids", ids)//
- .list();
- }
- public List<T> findAll() {
- return getSession().createQuery(//
- "FROM " + clazz.getSimpleName())//
- .list();
- }
- }
DAOA:vo A的DAO接口类,此类需要继承BaseDAO接口,实现公共类,另外在此可以声明自己特有的方法
- package dao;
- import pojo.A;
- import base.BaseDao;
- public interface DAOA extends BaseDao<A>{
- //...
- }
DAOAImpl:vo A的DAO实现类,实现DAOA中声明的方法和BaseDAO的所以基本方法,为实现基本方法,故继承了BaseDaoImpl类
- package dao.impls;
- import org.springframework.stereotype.Repository;
- import pojo.A;
- import base.BaseDaoImpl;
- import dao.DAOA;
- @Repository
- public class DAOAImpl extends BaseDaoImpl<A> implements DAOA { //具体的实现类什么都不用去写 只需要实现dao(有了声明)继承daoImpl(有了实现 这样的话 无论后面有多少不要的dao及其实现都只需要继承实现一个共同的BaseDao及其Impl即可 把公共的操作封装的十分Good)
- }
同理,DAOB同上
以此,便完成了公共方法的继承与实现机制。
当中用到了泛型机制,通过继承父类来实现泛型的数据转换:
- public class DAOAImpl extends BaseDaoImpl<A>{} A为vo的模型类,以此在父类中可调用实现!!
通过使用泛型T减少Dao的冗余代码,当T继承某个对象时(T extends EntityDao)限制了参数类型必须继承该对象(EntityDao),并且ClassT必须要有泛型参数(De
BaseDAO使用的更多相关文章
- 【01-05】hibernate BaseDao
BaseDao接口定义 package org.alohaworld.util.dao; import java.io.Serializable; import java.util.List; imp ...
- orm映射 封装baseDao
是用orm映射封装自己封装dao层 思路:通过映射获得实体类的属性拼接sql语句 import java.lang.reflect.Field; import java.lang.reflect.In ...
- BaseDao代码,用于连接数据库实行增删改查等操作
在学习JavaWeb时会用到此代码,用于实行增删改查操作 1 package com.bdqn.dao; import java.sql.Connection; import java.sql.Dri ...
- java项目常用 BaseDao BaseService
java项目常用 BaseDao BaseService IBaseDao 1 package com.glht.sim.dao; 2 3 import java.util.List; 4 5 6 ...
- BaseDao
public class BaseDao { private static Log logger = LogFactory.getLog(BaseDao.class); // 查询数据 public ...
- ssh注解basedao简单的实现
@Repository public class BaseDao extends HibernateDaoSupport{ protected Class objectClass; protected ...
- baseDao 使用spring3+hibernate4方式
启动异常: java.lang.ClassCastException: org.springframework.orm.hibernate4.SessionHolder cannot be cast ...
- baseDao 使用spring3+hibernate3方式
package cn.zk.pic.service.dao; import java.io.Serializable; import java.util.List; import java.util. ...
- 一种好的持久层开发方法——建立BaseDao和BaseDaoImpl
使用hibernate开发持久层时,我们会发现:虽然entity类的含义和需求不同,其对应的Dao层类对应的方法也是不同的.但是有许多方法操作确实相同的.比如实体的增加,删除,修改更新,以及许多常用的 ...
- Hibernate的BaseDao辅助类
1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...
随机推荐
- bootstrap 强调相关的类
.text-muted:提示,使用浅灰色(#999) .text-primary:主要,使用蓝色(#428bca) .text-success:成功,使用浅绿色(#3c763d) .text-info ...
- 【C++ Primer 第十三章】4. 拷贝控制示例
拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> us ...
- C#中decimal ,double,float的区别
浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...
- A 暴力搜索 剪枝是关键
Description 盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:老师给了一个正整数 n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能 ...
- Codeforces Round #369 (Div. 2)-D Directed Roads
题目大意:给你n个点n条边的有向图,你可以任意地反转一条边的方向,也可以一条都不反转,问你有多少种反转的方法 使图中没有环. 思路:我们先把有向边全部变成无向边,每个连通图中肯定有且只有一个环,如果这 ...
- 微信小程序倒计时组件开发
今天给大家带来微信小程序倒计时组件具体开发步骤: 先来看下最终效果: git源:http://git.oschina.net/dotton/CountDown 分步骤-性子急的朋友,可以直接看最后那段 ...
- 算法竞赛入门经典-训练指南(10881-Piotr's Ants)
题目大意: 一根长度为L的木棍一堆蚂蚁爬,向左或向右,速度都为1,若两蚂蚁碰撞则同时转头(转身时间忽略不计),问T时间之后每只蚂蚁的位置: 输入:t,(t个样例),每个样例输入 L,T,n,接下来是n ...
- python界面Tkinter编程(tkMessageBox对话框使用)
python界面Tkinter编程(tkMessageBox对话框使用) 转载 https://blog.csdn.net/m_buddy/article/details/80105154 1 ...
- Spring Boot 项目实战(一)Maven 多模块项目搭建
一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...
- cmake使用笔记
目录 cmake使用笔记 基本使用方法 相较于makefile的优点 常用语法 cmake_minimum_required project PROJECT_SOURCE_DIR set includ ...