basedao使用

starskyhu starskyhu     2022-09-30     259

关键词:

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:接口代码,公共方法的接口类

 

[java] view plain copy
 
  1. package base;  
  2.   
  3. import java.util.List;  
  4.   
  5. public interface BaseDao<T> {  
  6.   
  7.     /** 
  8.      * 保存实体 
  9.      *  
  10.      * @param entity 
  11.      */  
  12.     void save(T entity);  
  13.   
  14.     /** 
  15.      * 删除实体 
  16.      *  
  17.      * @param id 
  18.      */  
  19.     void delete(Long id);  
  20.   
  21.     /** 
  22.      * 更新实体 
  23.      *  
  24.      * @param entity 
  25.      */  
  26.     void update(T entity);  
  27.   
  28.     /** 
  29.      * 按id查询 
  30.      *  
  31.      * @param id 
  32.      * @return 
  33.      */  
  34.     T getById(Long id);  
  35.   
  36.     /** 
  37.      * 按id查询 
  38.      *  
  39.      * @param ids 
  40.      * @return 
  41.      */  
  42.     List<T> getByIds(Long[] ids);  
  43.   
  44.     /** 
  45.      * 查询所有 
  46.      *  
  47.      * @return 
  48.      */  
  49.     List<T> findAll();  
  50.   
  51. }  

BaseDAOImpl:公共方法的实现类

 

 

[java] view plain copy
 
  1. package base;  
  2.   
  3. import java.lang.reflect.ParameterizedType;  
  4. import java.util.List;  
  5.   
  6. import javax.annotation.Resource;  
  7.   
  8. import org.hibernate.Session;  
  9. import org.hibernate.SessionFactory;  
  10.   
  11. @SuppressWarnings("unchecked")  
  12. public abstract class BaseDaoImpl<T> implements BaseDao<T> {  
  13.   
  14.     @Resource  
  15.     private SessionFactory sessionFactory;  
  16.     private Class<T> clazz;  
  17.   
  18.     public BaseDaoImpl() {  
  19.         // 使用反射技术得到T的真实类型  
  20.         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型  
  21.         this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型  
  22.         System.out.println("clazz ---> " + clazz);  
  23.           
  24.     }  
  25.   
  26.     /** 
  27.      * 获取当前可用的Session 
  28.      *  
  29.      * @return 
  30.      */  
  31.     protected Session getSession() {  
  32.         return sessionFactory.getCurrentSession();  
  33.     }  
  34.   
  35.     public void save(T entity) {  
  36.         getSession().save(entity);  
  37.     }  
  38.   
  39.     public void update(T entity) {  
  40.         getSession().update(entity);  
  41.     }  
  42.   
  43.     public void delete(Long id) {  
  44.         Object obj = getById(id);  
  45.         if (obj != null) {  
  46.             getSession().delete(obj);  
  47.         }  
  48.     }  
  49.   
  50.     public T getById(Long id) {  
  51.         return (T) getSession().get(clazz, id);  
  52.     }  
  53.   
  54.     public List<T> getByIds(Long[] ids) {  
  55.         return getSession().createQuery(//  
  56.                 "FROM User WHERE id IN (:ids)")//  
  57.                 .setParameterList("ids", ids)//  
  58.                 .list();  
  59.     }  
  60.   
  61.     public List<T> findAll() {  
  62.         return getSession().createQuery(//  
  63.                 "FROM " + clazz.getSimpleName())//  
  64.                 .list();  
  65.     }  
  66.   
  67. }  


DAOA:vo A的DAO接口类,此类需要继承BaseDAO接口,实现公共类,另外在此可以声明自己特有的方法

 

 

[java] view plain copy
 
  1. package dao;  
  2.   
  3. import pojo.A;  
  4. import base.BaseDao;  
  5.   
  6. public interface DAOA extends BaseDao<A>{  
  7. //...  
  8. }  

DAOAImpl:vo A的DAO实现类,实现DAOA中声明的方法和BaseDAO的所以基本方法,为实现基本方法,故继承了BaseDaoImpl类

[java] view plain copy
 
  1. package dao.impls;  
  2.   
  3. import org.springframework.stereotype.Repository;  
  4.   
  5. import pojo.A;  
  6. import base.BaseDaoImpl;  
  7. import dao.DAOA;  
  8. @Repository  
  9. public class DAOAImpl extends BaseDaoImpl<A> implements DAOA {     //具体的实现类什么都不用去写  只需要实现dao(有了声明)继承daoImpl(有了实现   这样的话   无论后面有多少不要的dao及其实现都只需要继承实现一个共同的BaseDao及其Impl即可     把公共的操作封装的十分Good)
  10.   
  11. }  


同理,DAOB同上

 

以此,便完成了公共方法的继承与实现机制。

当中用到了泛型机制,通过继承父类来实现泛型的数据转换:

[java] view plain copy
 
  1. public class DAOAImpl extends BaseDaoImpl<A>{}  A为vo的模型类,以此在父类中可调用实现!!  

 

通过使用泛型T减少Dao的冗余代码,当T继承某个对象时(T extends EntityDao)限制了参数类型必须继承该对象(EntityDao),并且ClassT必须要有泛型参数(De

封装basedao

packagecom.huawei.common;importjava.sql.ResultSet;importjava.sql.SQLException;publicinterfaceCallBack{ voidexecute(ResultSetrs)throwsSQLException;} packagecom.huawei.utils;importjava.lang.reflect 查看详情

连接池技术-basedao写法

packagecn.bdqn.basedao;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.naming.Context;importjavax.naming.InitialContext;impo 查看详情

大数据必学java基础(一百零一):basedao抽取(代码片段)

文章目录BaseDAO抽取一、BaseDAO代码二、实现类代码BaseDAO抽取一、BaseDAO代码packagecom.lanson.dao;importcom.lanson.pojo.Emp;importjava.lang.reflect.Field;importjava.sql.*;importjava.util.ArrayList;importjava.util.List;/***@Au 查看详情

基础basedao

packagecn.easybuy.util;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importcn.easybuy.tool.ConfigManager; 查看详情

dao层抽取basedao

结构图 BaseDao.javaimportjava.io.Serializable;importjava.util.List;importorg.hibernate.criterion.DetachedCriteria;publicinterfaceBaseDao<T>{//增voidsave(Tt);//删voiddelete(Tt);//删voiddelete(Seri 查看详情

封装basedao

packagecom.huawei.base;importjava.io.Serializable;importjava.lang.reflect.Array;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.lang.reflect.ParameterizedType;importjava.sql.Co 查看详情

基于泛型的basedao,baseservice实现增强版

第1步:编写接口BaseDaopublic interface BaseDao<ID extends Serializable, T extends AbstractEntity, I extends BaseDao<?, ?, ?>> boolean& 查看详情

数据访问类basedao实现

packagedao;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;publicclassBaseDao{ privateStringdriver="com.mysql.jdbc.Driver"; privateStri 查看详情

dao操作的抽取,basedao

...连接2.创建stmt3.执行sqla)更新b)查询4.关闭/异常 代码:BaseDao/***通用的dao,自己写的所有的dao都继承此类;*此类定义了2个通用的方法:*1.更新*2.查询*@authorJie.Yuan**/publicclassBaseDao{//初始化参数privateConnectioncon;privatePrepa 查看详情

编写基类basedao

 DAO基类中配备增删改查的操作。1publicinterfaceBaseDao<T>{2//新增3publicvoidsave(Tentity);4//更新5publicvoidupdate(Tentity);6//根据id删除7publicvoiddelete(Serializableid);8//根据id查找9publicTfindObjectById(Serializ 查看详情

懒汉单例安全basedao

packageDao;importjava.sql.*;publicclassBaseDaoprivateStringdrname="com.mysql.jdbc.Driver";privateStringurl="jdbc:mysql://localhost:3306/jdhb";privateStringname="root";privateStringpwd="root";privates 查看详情

day01搭建环境+抽取dao(整合ssh+设计basedao和basedaoimpl)

OA项目:SSH+JBPM框架(本项目使用注解方式开发) ============================================ OA办公自动化系统BBS论坛系统CRM客户关系管理系统CMS内容管理系统 一、什么是OA    辅助办公、提高办公效率的软件系统。&n... 查看详情

hibernate4basedao的封装

1.BaseDao.java基础类接口  packagecom.itv.launcher.util; importjava.io.Serializable;importjava.util.Collection;importjava.util.List;  /** *@ClassName:IBaseDao *@Descriptio 查看详情

开源组件:用元数据和beanutils写一个简单的orm映射basedao.java

1、JDBC元数据 在jdbc中可以使用:数据库元数据、参数元数据、结果集元数据(1)数据库元数据通过Connection对象的getMetaData()方法可以得到DatabaseMetaData对象。DatabaseMetaData对象包含了数据库的元信息。DatabaseMetaDatajava.sql.Connection.getMeta... 查看详情

实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?

】实现BaseDao的多个Daos的存储库类委托-可能吗?【英文标题】:RepositoryClassDelegationtoMultipleDaosthatimplementBaseDao-Possible?【发布时间】:2019-10-1205:48:49【问题描述】:我的Android应用程序有一个Room数据库。我的FooDao和BarDao都实现了Base... 查看详情

手动建立数据库连接的basedao

packagecom.chinasoft.julong.dao;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassBaseDAO{privateC 查看详情

spring注解问题。。。

...ServiceImpl">     <property name="baseDao" ref="baseDao"/> </bean> public class ProjectServiceImpl implements ProjectService  private BaseDAO baseDao; public BaseDAO&nb 查看详情

mysql----basedao工具类(代码片段)

packagecom.zjw.dao;importjava.sql.*;/***工具类*/publicclassBaseDaostaticfinalStringDB_URL="jdbc:mysql://localhost:3306/数据库";staticfinalStringusername="用户名";staticfinalStringpaw="密码";protectedConnectionconn;protectedResultSetrs;protectedPreparedStatementps;/***数据库的连接**@... 查看详情