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

news/2024/7/7 12:32:59

文章目录

  • 一、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://lihuaxi.xjx100.cn/news/1803264.html

相关文章

【Linux】Alibaba Cloud Linux 3 安装 PHP8.1

一、系统安装 请参考 【Linux】Alibaba Cloud Linux 3 中第二硬盘、MySQL8.、MySQL7.、Redis、Nginx、Java 系统安装 二、安装源 rpm -ivh --nodeps https://rpms.remirepo.net/enterprise/remi-release-8.rpm sed -i s/PLATFORM_ID"platform:al8"/PLATFORM_ID&q…

RPC(远程过程调用)

RPC&#xff08;远程过程调用&#xff09;是一种用于不同计算机之间进行通信的协议和技术。它允许一个计算机程序调用远程计算机上的子程序或服务&#xff0c;就像调用本地计算机上的函数一样。 RPC出现的原因是为了解决多计算机环境下的分布式计算问题。在分布式系统中&#…

信息学奥赛一本通 1435:【例题3】曲线 | 洛谷 洛谷 P1883 函数

【题目链接】 ybt 1435&#xff1a;【例题3】曲线 洛谷 P1883 函数 【题目考点】 1. 三分 【解题思路】 每个 S i ( x ) S_i(x) Si​(x)是一个二次函数&#xff0c; F ( x ) m a x ( S i ( x ) ) F(x) max(S_i(x)) F(x)max(Si​(x))&#xff0c;即为所有二次函数当自变量…

NJU操作系统公开课笔记(1)

目录 一.计算机系统概述 二.计算机硬件系统 三.计算机软件系统 四.计算机操作技术的发展 五.计算机OS 1.资源管理的角度 2. 程序控制的角度 3.OS控制计算机的角度 4.人机交互的角度 5.程序接口的角度 6.系统结构的角度 单道批处理系统 多道批处理系统 分时系统 …

python时间变化与字符串替换技术及读JSON文件等实践笔记

1. 需求描述 根据预测出结果发出指令的秒级时间&#xff0c;使用时间戳&#xff0c;也就是设定时间&#xff08;字符串&#xff09;转为数字时间戳。时间计算转换过程中&#xff0c;出现单个整数&#xff08;例如8点&#xff09;&#xff0c;按字符串格式补齐两位“08”。字符…

算法笔记-第九章-树的遍历(未完成-待整理)

算法笔记-第九章-树的遍历 树遍历的知识点emplace_back()用法top和pop的用法 树的先根遍历理解本题思路 树的后跟遍历树的层序遍历树的循环队列遍历 树的高度树的高度分析题目 树的结点层号 树遍历的知识点 大佬总结的实在是太好了 大佬讲解数遍历 &#xff08;遍历树的前序&…

Pytorch torch.dot、torch.mv、torch.mm、torch.norm的用法详解

torch.dot的用法&#xff1a; 使用numpy求点积&#xff0c;对于二维的且一个二维的维数为1 torch.mv的用法&#xff1a; torch.mm的用法 torch.norm 名词解释&#xff1a;L2范数也就是向量的模&#xff0c;L1范数就是各个元素的绝对值之和例如&#xff1a;

再学动态规划

先用一张图来理一下动态规划大纲 参考&#xff1a;https://www.zhihu.com/question/291280715/answer/1007691283 动态规划五个步骤 参考&#xff1a;https://www.zhihu.com/question/25814123 ①判断题目能否用动规解法 ②确定状态 最后一步 子问题 ③转移方程 ④确定初始条…