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 ,update
    public 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操作
    @Test
    public 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)?"添加成功":"添加没有影响到表");
    }
@Test
    public 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语句和参数类型,非常灵活。并且查询多行记录得到的是结果集包装后的集合,无需连接也可使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/160354.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vmware workstation pro 17.5 安装 macos 13.5.2 虚拟机超详细图文教程

前言 本文很细&#xff0c;甚至有点墨迹&#xff0c;主要为了方便从来没用过 vmware 的新人&#xff0c;其实大部分步骤和正常安装虚拟机没有区别&#xff0c;详细贴图以方便大家对比细节 参考文章 感谢大佬们的无私分享 https://blog.csdn.net/qq_19731521/article/details…

【LeetCode刷题-滑动窗口】-- 795.区间子数组个数

795.区间子数组个数 class Solution {public int numSubarrayBoundedMax(int[] nums, int left, int right) {return lessEqualsThan(nums,right) - lessEqualsThan(nums,left - 1);}private int lessEqualsThan(int[] nums,int k){int len nums.length;int res 0,left 0,ri…

三十、W5100S/W5500+RP2040树莓派Pico<PPPoE>

文章目录 1 前言2 简介2 .1 什么是PPPoE&#xff1f;2.2 PPPoE的优点2.3 PPPoE数据交互原理2.4 PPPOE应用场景 3 WIZnet以太网芯片4 PPPOE示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 PPPoE是一种在以太…

需求管理>需求的变更流程

1.需求的变更流程 一个大型软件系统的需求总是有变化的。为了降低项目开发的风险&#xff0c;需要一个好的变更控制过程。如下图所示为需求变更管理过程。 在需求管理过程中需求的变更是受严格管控的&#xff0c;其流程为&#xff1a; 1、问题分析和变更描述。这是识别和分析需…

三十分钟学会Linux

Linux 一、配置虚拟机 企业级应用&#xff1a;RHEL/CentOS 桌面平台&#xff1a;Ubuntu 开源服务器&#xff1a;CentOS 1.配置网络 路径可以通过TAB键自动补齐 vi /etc/sysconfig/network-scripts/ifcfg-ens332.克隆虚拟机 链接克隆&#xff1a; 当前节点文件夹只存储差…

四、程序员指南:数据平面开发套件

REORDER LIBRARY 重排序库提供了根据其序列号对mbuf进行重排序的机制。 16.1 操作 重排序库本质上是一个对mbuf进行重新排序的缓冲区。用户将乱序的mbuf插入重排序缓冲区&#xff0c;并从中提取顺序正确的mbuf。 在任何给定时刻&#xff0c;重排序缓冲区包含其序列号位于序列…

人工智能Keras的第一个图像分类器(CNN卷积神经网络的图片识别)

CNN卷积神经网络是人工智能的开端,CNN卷积神经网络让计算机能够认识图片,文字,甚至音频与视频。CNN卷积神经网络的基础知识,可以参考:CNN卷积神经网络 LetNet体系结构是卷积神经网络的“第一个图像分类器”。最初设计用于对手写数字进行分类,上期文章我们分享了如何使用k…

西南科技大学814考研二

C语言数据结构与算法 线性表 顺序表(静态分配内存) #include <stdio.h> #include <stdbool.h> //静态顺序表 #define MAX_SIZE 8 //顺序表储存的数据类型 typedef int ElemType; typedef struct {ElemType data[MAX_SIZE];int length; }SeqList; //初始化顺序表…

解决 vite 4 开发环境和生产环境打包后空白、配置axios跨域、nginx代理本地后端接口问题

1、解决打包本地无法访问空白 首先是pnpm build 打包后直接在dist访问&#xff0c;是访问不了的&#xff0c;需要开启服务 终端输入 npm install -g serve 然后再输入 serve -s dist 就可以访问了 但要保证 路由模式是&#xff1a;createWebHashHistory 和vite.conffig.j…

移动机器人路径规划(四)--- 考虑机器人模型下的运动规划KINODYNAMIC PATHFINDING

目录 1 动力学概念简介 2 State Lattice Planning 3 Boundary Value Problem 4 混合A*算法 Hybrid A* 5 Kinodynamic RRT* 1 动力学概念简介 一种生成机器人的运动同时受限制于运动学的约束&#xff08;避障&#xff09;以及动力学的约束&#xff08;在速度加速度力的约束…

构建自定义ChatGPT,微软推出Copilot Studio

11月16日&#xff0c;微软在美国西雅图举办“Microsoft Ignite 2023”全球开发者大会。本次人工智能成为重要主题&#xff0c;微软几乎把所有产品都集成了生成式AI功能并发布了一系列全新产品。 其中&#xff0c;微软重磅推出了Copilot Studio&#xff08;预览版&#xff09;&…

IO流-打印流

一&#xff0c;打印流 二&#xff0c;常用方法 三&#xff0c;案例 package Print.sd;import java.io.FileNotFoundException; import java.io.PrintStream; import java.nio.charset.Charset;public class Main {public static void main(String[] args) throws FileNotFound…

RasberryPi 3B+ 树莓派 初识

关于香橙派的学习暂时告一段落&#xff0c;从本节开始学习树莓派3B&#xff01; 我在亚马逊官网购买了3b和壳子&#xff0c;安装完成后大概长这样&#xff1a; &#xff08;感觉的确像一台小型电脑主机了&#xff09; 树莓派的引脚功能图 图参&#xff1a;树莓派3B 引脚图说明…

SELF-RAG: 让LLM集检索,生成跟评判等多种能力于一身

SELF-RAG: 让LLM集检索&#xff0c;生成跟评判等多种能力于一身 提纲 1 简介 2 SELF-RAG 3 实验结论 4 讨论 参考文献 1 简介 尽管基础能力出众&#xff0c;但是大模型只能依赖于被压缩到模型参数中的知识&#xff0c;所以经常会生成不符合事实的回复。针对这种事实性错…

Devart dotConnect ADO.NET Data Providers Crack

开发数据相关 .NET 应用程序的终极解决方案&#xff1a;快速、灵活、全面、功能丰富、支持 ORM 的 ADO.NET 提供程序 概述 实体框架 连接字符串 博客 高性能 ADO.NET 数据提供程序 dotConnect 是基于 ADO.NET 架构和采用多项创新技术的开发框架构建的增强型数据连接解决方​​…

C++初阶-内存管理

内存管理 一、C/C内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、C内存管理方式new/delete操作内置类型new和delete操作自定义类型 四、operator new与operator delete函数operator new与operator delete函数 五、new和delete的实现原理内置类…

数据同步策略解读

前言 我们都知道在大多数情况下&#xff0c;通过浏览器查询到的数据都是缓存数据&#xff0c;如果缓存数据与数据库的数据存在较大差异的话&#xff0c;可能会产生比较严重的后果的。对此&#xff0c;我们应该也必须保证数据库数据、缓存数据的一致性&#xff0c;也就是就是缓…

新版JetBrains ToolBox【Windows】修改应用安装位置

WIndows下新版的JetBrainse ToolBox 无法修改应用安装路径 关闭 ToolBox 应用修改配置文件.settings.json 路径&#xff1a;C:\Users\用户名\AppData\Local\JetBrains\Toolbox "install_location": "xxx",

【Hello Go】Go语言工程管理

工程管理 工作区工作区介绍GOPATH设置 包自定义包main包main函数和init函数导入包点操作别名操作_操作 测试案例GOPATH配置go install使用 在我们实际的工作中 直接运用到编译器进行编译链接的场景少之又少 这是因为 在工程中不会只有一个源文件 并且源文件之间也有着相互依赖…

调试/抓包工具

一、Fiddler【推荐window使用】 介绍&#xff1a;个人认为是 Windows 平台最好用的抓包工具&#xff1b; 下载&#xff1a;Fiddler | Web Debugging Proxy and Troubleshooting Solutions 使用方式&#xff1a;这一篇文章写的很全&#xff0c;认真看完就够用了 Fiddler 抓包工…