当前位置: 首页 > news >正文

DAO和增删改查通用方法-BasicDao

文章目录

  • 一、BasicDao是什么?
  • 二、BasicDao分析
  • 三、BasicDao实现
    • (1)BasicDao
    • (2)ActorDao
    • (3)TestDao
  • 四、总结



一、BasicDao是什么?

在这里插入图片描述
BasicDao:基础的数据对象,可以完成通用的增删改查方法。
在这里插入图片描述
该方法的返回值类型是List, 但实际上的返回值类型是不确定的。在这里插入图片描述
这种设计理念体现一种思想:各司其职
在这里插入图片描述
各个部分之间的对应关系。
(1)DAO:数据访问对象。
(2)BasicDao是一个通用类,专门对数据库进行交互,完成对数据库(表)的CRUD操作。
(3)在BasicDao的基础上,实现 一张表对应一个Dao。

即Actor表 - Actor.java类(javaBean) - ActorDao.java。

二、BasicDao分析

在这里插入图片描述

dao包是写与数据库的crud操作。
test包是再这个基础上加入一些业务逻辑的判断。
domain实体类
utils工具类

在这里插入图片描述
在这里插入图片描述

三、BasicDao实现

在这里插入图片描述
先引入工具类,再创建表对应的实体类。然后将BasicDao实现。

(1)BasicDao

import com.hspedu.dao_.domain.Actor;
import com.hspedu.jdbc.datasource.JDBCUtilsByDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;/***开发BasicDao, 是其他DAO的父类。* Dao,数据访问对象。*/
public class BasicDao<T> {//泛型指定具体类型
private QueryRunner qr=new QueryRunner();
//开发通用的dml方法,针对任意的表 ,update方法,包含了insert ,delete ,updatepublic int update(String sql,Object... parameters){Connection connection=null;try {connection= JDBCUtilsByDruid.getConnection();int update = qr.update(connection,sql, parameters);return update;} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtilsByDruid.close(null,null,connection);}}
//返回值List<T> , 可以返回存放任意类型T的List集合。/**** @param sql* @param clazz 传入一个Class对象,比如Actor.class  Class<T>->反射->Class类* @param parameters 传入占位符?的具体的值,可以是多个* @return 根据Actor.class 返回对应的ArrayList的集合*/
//查询 多行结果 的通用方法public List<T> queryMulti(String sql,Class<T> clazz,Object... parameters){Connection connection=null;try {connection=JDBCUtilsByDruid.getConnection();List<T> query = qr.query(connection, sql, new BeanListHandler<>(clazz), parameters);return query;} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtilsByDruid.close(null,null,connection);}}/*Class类每个类只有1份,由系统创建。反射调用属性的过程:得到每个类的Class类,代码阶段,类加载阶段,允许阶段。String<T> ?不对,泛型是 在类或接口(引用) 定义的时候进行声明,在创建对象时具体的指定类型。String类定义时并没有使用泛型数组?集合中可以。Class<T> ,BasicDao<T> 表示传入该类的T类型,这样T类型就可以作属性,参数和返回值了。*///查询单行结果 的通用方法public T querySingle(String sql,Class<T> clazz,Object... parameters){Connection connection=null;try {connection= com.hspedu.dao_.utils.JDBCUtilsByDruid.getConnection();T query = qr.query(connection, sql, new BeanHandler<>(clazz), parameters);return query;} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtilsByDruid.close(null,null,connection);}}
//   查询单行单列记录。public Object queryScalar(String sql,Object... parameters){Connection connection=null;try {connection=JDBCUtilsByDruid.getConnection();Object query = qr.query(connection, sql, new ScalarHandler(), parameters);return query;} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtilsByDruid.close(null,null,connection);}}}

(2)ActorDao

public class ActorDao extends BasicDao<Actor> {
//1.就要BasicDao的方法
//2.根据业务需求,可以编写特有的方法。
}

(3)TestDao

import com.hspedu.dao_.dao.ActorDao;
import com.hspedu.dao_.dao.GoodsDao;
import com.hspedu.dao_.domain.Actor;
import com.hspedu.dao_.domain.Goods;
import org.junit.Test;import java.util.List;/****/
public class TestDao {//    测试ActorDao 对actor表的crud操作@Testpublic void testActorDao() {ActorDao actorDao = new ActorDao();
//        1.查询String sql = "select * from actor where id>=?";
//        使用泛型后,要查询那个表,只需要更换两个参数就可以了。List<Actor> actors = actorDao.queryMulti(sql, Actor.class, 1);System.out.println("=====查询结果=====");for (Actor actor : actors) {System.out.println(actor);}
//        2.查询单行记录
//        String sql2 = "select * from actor where id=?";
//        Actor actor = actorDao.querySingle(sql2, Actor.class, 3);
//        System.out.println("查询单行记录" + actor);
//3.查询单行单列记录
//        String sql3 = "select name from actor where id=?";
//        Object o = actorDao.queryScalar(sql3, 4);
//        System.out.println("查询单行单列记录 " + o);//        4.dml语句, insert ,update, delete
//        String sql4 = "update actor set name=? where id=?";
//        int n = actorDao.update(sql4, "张三", 3);
//        System.out.println((n > 0) ? "更新执行成功" : "执行没有影响到表");
//        String sql5 = "delete from actor where id=?";
//        int delete = actorDao.update(sql5, 4);
//        System.out.println((delete > 0) ? "删除成功" : "删除没有影响到表");
//        String sql6 = "insert into actor values(null,?,?,now(),null)";
//        int insert = actorDao.update(sql6, "王云", "女");
//        System.out.println((insert>0)?"添加成功":"添加没有影响到表");}
@Testpublic void testGoodsDao(){System.out.println("查询");String sql="select * from hsp_db01.goods";GoodsDao goodsDao = new GoodsDao();List<Goods> goods = goodsDao.queryMulti(sql, Goods.class);for (Goods goods1:goods){System.out.println(goods1);}//        sql="insert into hsp_db01.goods values(?,?,?)";
//    int n = goodsDao.update(sql, 700, "飞天摩托", 77777);
//    System.out.println((n>0)?"添加成功":"添加没有影响到表");//sql="update hsp_db01.goods set price=? where id=?";
//    int update = goodsDao.update(sql, 8888, 100);
//    System.out.println((update>0)?"更新成功":"更新失败");sql="delete from hsp_db01.goods where id=?";int update = goodsDao.update(sql, 700);System.out.println((update>0)?"删除成功":"删除失败");}
}

使用goods表的goodsDao和actor表的类似。

四、总结

使用BasicDao之后,可对任意表使用BasicDao上的方法执行crud操作。只需要传入sql语句和参数类型,非常灵活。并且查询多行记录得到的是结果集包装后的集合,无需连接也可使用。

相关文章:

  • PON网络应用场景
  • Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化
  • 一文看分布式锁
  • Node.js中的Buffer和Stream
  • CTF-PWN-堆- 【off-by-one】
  • 「Verilog学习笔记」实现3-8译码器①
  • MySQL存储架构
  • YoloV8改进策略:聚焦线性注意力重构YoloV8
  • 黑马程序员微服务 第五天课程 分布式搜索引擎2
  • 【详解】堡垒机和vpn是一个东西吗
  • 移远EC600U-CN开发板 11.17
  • ClickHouse的分片和副本
  • 【Ubuntu】安装Docker
  • 【VRTK】【VR开发】【Unity】6-设置interactor和虚拟手
  • Python-pptx教程之二操作已有PPT模板文件
  • .pyc 想到的一些问题
  • [case10]使用RSQL实现端到端的动态查询
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • leetcode386. Lexicographical Numbers
  • Redis 中的布隆过滤器
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 关于for循环的简单归纳
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 类orAPI - 收藏集 - 掘金
  • 聊聊flink的BlobWriter
  • 目录与文件属性:编写ls
  • 前端之React实战:创建跨平台的项目架构
  • 使用 @font-face
  • 自动记录MySQL慢查询快照脚本
  • ionic入门之数据绑定显示-1
  • 数据可视化之下发图实践
  • #Linux(make工具和makefile文件以及makefile语法)
  • #pragma预处理命令
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (蓝桥杯每日一题)love
  • (南京观海微电子)——COF介绍
  • (一)Thymeleaf用法——Thymeleaf简介
  • (译)2019年前端性能优化清单 — 下篇
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net framework4与其client profile版本的区别
  • .NET 设计一套高性能的弱事件机制
  • .NET企业级应用架构设计系列之技术选型
  • .Net中的集合
  • .net专家(张羿专栏)
  • @JsonSerialize注解的使用
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [20161214]如何确定dbid.txt
  • [2018-01-08] Python强化周的第一天
  • [51nod1610]路径计数
  • [android] 手机卫士黑名单功能(ListView优化)