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

news2024/10/6 20:33:58

文章目录

  • 一、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语句和参数类型,非常灵活。并且查询多行记录得到的是结果集包装后的集合,无需连接也可使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云轻量4核8G12M带宽服务器租用价格和S5实例报价

腾讯云4核8G服务器优惠价格表&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;阿腾云atengyun.com分享腾讯云4核8G服务器详细配置、优惠价格及限制条件&…

机器视觉选型-什么时候用远心镜头

物体厚 当被检测物体厚度较大&#xff0c;需要检测不止一个平面时&#xff0c;典型应用如食品盒&#xff0c;饮料瓶等。 物体位置变化 当被测物体的摆放位置不确定&#xff0c;可能跟镜头成一定角度时。 物体上下跳动 当被测物体在被检测过程中上下跳动&#xff0c;如生产线上下…

PPT基础入门

目录 相关设置快捷键shift 快捷键Ctrl 快捷键Ctrl Shift 组合快捷键快捷键总结 相关设置 设置撤回次数 自动保存 图片压缩 字体嵌入&#xff1a;目的是在不同的电脑上保留已经设置好的字体 多格式导出 &#xff08;1&#xff09;可以导出PDF &#xff08;2&#xff09;可以导…

try-with-resources(TWR)方式关闭流资源

使用传统的方式关闭流资源当然没问题&#xff0c;但是需要写的代码有点多&#xff0c;而try-with-resources是Java 7 之后的新语法糖&#xff0c;旨在减轻开发人员释放try块中使用的资源的压力。一时用TWR方式一时爽&#xff0c;一直用一直爽&#xff0c;但是有些情况也是不能使…

(二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据集二、导入数据以及展示部分1.导入数据集以及对数据集进行处理2.展示数据&#xff08;看看就好&#xff09; 三&#xff08;1&#xff09;、搭建网络进…

初学编程学习,计算机编程怎么自学,中文编程工具下载

初学编程学习&#xff0c;计算机编程怎么自学&#xff0c;中文编程工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如…

Hangfire.Pro 3.0 Crack

Hangfire.Pro 有限的存储支持 Hangfire Pro 是一组扩展包&#xff0c;允许使用批处理创建复杂的后台作业工作流程&#xff0c;并提供对超快速Redis作为作业存储的支持 请注意&#xff0c;仅在使用Hangfire.SqlServer、Hangfire.Pro.Redis或Hangfire.InMemory包作为作业存储时才…

SpringCloud 2022有哪些变化

目录 前提条件 AOT支持 Spring Native支持 前提条件 Spring Cloud 2022.0.0是构建在Spring Framework 6.0和Spring Boot 3.0 之上的一S个主要版本。 JDK要求最低需要是Java 17J2EE要求最低需要Jakarta EE 9 AOT支持 Spring cloud 2022支持AOT编译&#xff0c;它是将程序源…

【mysql】1153 - Got a packet bigger than ‘max_allowed_packet‘ bytes

执行mysql 语句出现&#xff1a;1153 - Got a packet bigger than max_allowed_packet bytes&#xff1b; 1153-得到一个大于“max_allowed_packet”字节的数据包。 数据包太大了怎么办。该配置吧。 查看max_allowed_packet show global variables like max_allowed_packet;…

用Java实现贪吃蛇小游戏

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为贪吃蛇。 其次在贪吃蛇项目下创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类&#xff0c;创建一个com.xxx.controller的包用来存放启…

js-webApi 笔记2之DOM事件

目录 1、表单事件 2、键盘事件 3、事件对象 4、排他思想 5、事件流 6、捕获和冒泡 7、阻止默认和冒泡 8、事件委托 9、事件解绑 10、窗口加载事件 11、窗口尺寸事件 12、元素尺寸和位置 13、窗口滚动事件 14、日期对象 15、节点 16、鼠标移入事件 1、表单事件 获取…

SourceTree提示128错误

错误&#xff1a; SourceTree打开报错&#xff1a;git log 失败&#xff0c;错误代码128 错误截图&#xff1a; 解决方法&#xff1a; 第一种&#xff1a; 打开电脑路径 C:\Users\Administrator &#xff0c;删除下面的【.gitconifg】文件 第二种&#xff1a; 如果上述方法…

场景交互与场景漫游-场景漫游器(6)

场景漫游 在浏览整个三维场景时&#xff0c;矩阵变换是非常关键的&#xff0c;通过适当的矩阵变换可以获得各种移动或者渲染效果。因此&#xff0c;在编写自己的场景漫游操作器时&#xff0c;如何作出符合逻辑的矩阵操作器是非常重要的&#xff0c;但这对初学者来说还是有一定难…

黑马React18: 基础Part 1

黑马React: 基础1 Date: November 15, 2023 Sum: React介绍、JSX、事件绑定、组件、useState、B站评论 React介绍 概念: React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 优势: 1-组件化的开发方式 2-优秀的性能 3-丰富的生态 4-跨平台开发 开发环境搭…

鸿蒙ToastDialog内嵌一个xml页面会弹跳到一个新页面《解决》

ToastDialog 土司组件 1.问题展示2.代码展示3.问题分析 1.问题展示 0.理想效果 错误效果: 1.首页展示页面 (未点击按钮前) 2.点击按钮之后&#xff0c;弹窗不在同一个位置 2.代码展示 1.点击按钮的 <?xml version"1.0" encoding"utf-8"?> <…

Jmeter 如何监控目标服务的系统资源

下载Jmeter插件管理下载 perfmon 将这个插件管理放到Jmeter的\lib\ext目录下 然后重启Jmeter jmeter-plugins-manager-1.10.jar 下载 perfmon插件 添加 io 内存 磁盘的监听 并且添加监听 在宿主机中安装代理监听程序 并启动 ServerAgent.tar.gz

Linux常用命令——bzcat命令

在线Linux命令查询工具 bzcat 解压缩指定的.bz2文件 补充说明 bzcat命令解压缩指定的.bz2文件&#xff0c;并显示解压缩后的文件内容。保留原压缩文件&#xff0c;并且不生成解压缩后的文件。 语法 bzcat(参数)参数 .bz2压缩文件&#xff1a;指定要显示内容的.bz2压缩文…

任正非说:公司要逐步实行分灶吃饭,我们在管理上不能过于整齐划一,否则缺少战斗力。

你好&#xff01;这是华研荟【任正非说】系列的第42篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、我们必须在混沌中寻找战略方向。规划就是要抓住机会点&#xff0c;委员会是火花荟萃的地方&#xff0c;它预研的方向是可做…

贝加莱MQTT功能

贝加莱实现MQTT Client端的功能库和例程 导入库和例程&#xff0c;AS Logical View中分别通过Add Object—Library&#xff0c;Add—Program插入MQTT库和例程。 将例程Sample放置于CPU循环周期中 定义证书存放路径&#xff0c;在AS Physical View 中&#xff0c;右击PLC—Con…

聚观早报 |零跑C10亮相广州车展;小鹏X9亮相广州车展

【聚观365】11月18日消息 零跑C10亮相广州车展 小鹏X9亮相广州车展 坦克700 Hi4-T开启预售 超A级家轿五菱星光正式预售 哪吒汽车发布山海平台2.0 零跑C10亮相广州车展 零跑汽车首款全球车型C10在广州车展首次亮相&#xff0c;同时该车也是零跑LEAP 3.0技术架构下的首款全…