【JDBC】DAO和增删改查通用方法 | 案例

news2024/12/23 17:57:06

九、DAO和增删改查通用方法

DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息

作用:为了实现功能的模块化,更有利于代码的维护和升级。

1、DAO接口

package com.atguigu.dao;

import com.atguigu.bean.User;

public interface UserDAO {

    /**

     * 根据用户名和密码获取数据库中的记录

     *

     * @param user

     * @return User:用户名和密码正确 null:用户名或密码不正确

     */

    public User getUser(User user);

    /**

     * 根据用户名获取数据库中的记录

     *

     * @param user

     * @return true:用户名已存在, false:用户名可用

     */

    public boolean checkUserName(User user);

    /**

     * 将用户保存到数据库

     *

     * @param user

     */

    public void saveUser(User user);

}

package com.atguigu.dao;

import java.util.List;

import com.atguigu.bean.Book;

public interface BookDAO {

    /**

     * 获取所有图书的方法

     *

     * @return

     */

    public List<Book> getBooks();

    /**

     * 添加图书的方法

     *

     * @param book

     */

    public void addBook(Book book);

    /**

     * 根据图书的id删除图书的方法

     *

     * @param bookId

     */

    public void deleteBookById(String bookId);

    /**

     * 根据图书的id获取图书信息

     *

     * @param bookId

     * @return

     */

    public Book getBookById(String bookId);

    /**

     * 更新图书信息的方法

     *

     * @param book

     */

    public void updateBook(Book book);

    /**

     * 批量更新图书的库存和销量

     *

     * @param params

     */

    public void batchUpdateSalesAndStock(Object[][] params);

}

package com.atguigu.dao;

import java.util.List;

import com.atguigu.bean.Order;

public interface OrderDAO {

    /**

     * 保存订单的方法

     *

     * @param order

     */

    public void saveOrder(Order order);

    /**

     * 获取所用订单的方法

     *

     * @return

     */

    public List<Order> getOrders();

    /**

     * 获取我的订单的方法

     *

     * @param userId

     * @return

     */

    public List<Order> getMyOrders(int userId);

    /**

     * 更新订单的状态的方法,例如已发货、确认收货等

     *

     * @param orderId

     * @param state

     */

    public void updateOrderState(String orderId, int state);

}

package com.atguigu.dao;

import java.util.List;

import com.atguigu.bean.OrderItem;

public interface OrderItemDAO {

    /**

     * 根据订单号获取对应的订单项

     *

     * @param orderId

     * @return

     */

    public List<OrderItem> getOrderItemsByOrderId(String orderId);

    /**

     * 批量插入订单项的方法

     *

     * @param params

     */

    public void batchInsertOrderItems(Object[][] params);

}

2、BasicDAOImpl

package com.atguigu.dao.impl;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.List;

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 com.atguigu.util.JDBCTools;

/**

 * 定义一个用来被继承的对数据库进行基本操作的Dao

 */

public class BasicDAOImpl {

    private QueryRunner queryRunner = new QueryRunner();

    /**

     * 通用的增删改操作

     *

     * @param sql

     * @param params

     * @return

     */

    public int update(String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        int count = 0;

        try {

             count = queryRunner.update(connection, sql, params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return count;

    }

    /**

     * 获取一个对象

     *

     * @param sql

     * @param params

     * @return

     */

    public <T> T getBean(Class<T> type,String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        T t = null;

        try {

             t = queryRunner.query(connection, sql, new BeanHandler<T>(type), params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return t;

    }

    /**

     * 获取所有对象

     *

     * @param sql

     * @param params

     * @return

     */

    public <T> List<T> getBeanList(Class<T> type,String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        List<T> list = null;

        try {

             list = queryRunner.query(connection, sql, new BeanListHandler<T>(type), params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return list;

    }

    /**

     * 获取一个单一值的方法,专门用来执行像select count(*)... 这样的sql语句

     *

     * @param sql

     * @param params

     * @return

     */

    public Object getSingleValue(String sql, Object... params) {

        // 获取连接

        Connection connection = JDBCTools.getConnection();

        Object value = null;

        try {

             value = queryRunner.query(connection, sql, new ScalarHandler(), params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

        return value;

    }

    /**

     * 进行批处理的方法

     * 关于二维数组Object[][] params

     *      二维数组的第一维是sql语句要执行的次数

     *      二维数组的第二维就是每条sql语句中要填充的占位符

     *

     * @param sql

     * @param params

     */

    public void batchUpdate(String sql , Object[][] params){

        //获取连接

        Connection connection = JDBCTools.getConnection();

        try {

             queryRunner.batch(connection ,sql, params);

        } catch (SQLException e) {

             //将编译时异常转换为运行时异常向上抛

             throw new RuntimeException(e);

        }

    }

}

3、DAO实现类

package com.atguigu.dao.impl;

import com.atguigu.bean.User;

import com.atguigu.dao.UserDAO;

public class UserDAOImpl extends BasicDAOImpl implements UserDAO{

    @Override

    public User getUser(User user) {

        // 写查询数据库的sql语句

        String sql = "select id , username , password , email from users where username = ? and password = ?";

        // 调用BaseDao中的getBean方法

        User bean = getBean(User.class, sql, user.getUsername(), user.getPassword());

        return bean;

    }

    @Override

    public boolean checkUserName(User user) {

        // 写查询数据库的sql语句

        String sql = "select id , username , password , email from users where username = ?";

        // 调用BaseDao中的getBean方法

        User bean = getBean(User.class, sql, user.getUsername());

        return bean!=null;//不为空,说明已存在,返回true,如果bEan是空的,没找到,bean!=null返回false,说明不存在

    }

    @Override

    public void saveUser(User user) {

        //写添加数据到数据库的sql语句

        String sql = "insert into users(username,password,email) values(?,?,?)";

        //调用BaseDao中通用的增删改的方法

        update(sql, user.getUsername(),user.getPassword(),user.getEmail());

    }

}

十、案例:

一、向customers表中插入数据,效果如下:

请输入编号:55

请输入姓名:上官红

请输入邮箱:shangguan@126.com

请输入生日(要求按xxxx-xx-xx格式):1988-11-11

插入成功!

二、修改指定客户

请输入待修改的客户编号:3

请输入新的客户姓名:林小玲

修改成功!

三、查询所有客户信息

四、根据编号,查询客户的详细信息,效果如下:

请输入编号:1

---------------------------------------------------------------------------------

编号        姓名        邮箱        生日

1      汪峰        wf@126.com  2010-2-2

五、根据姓名,查询客户的详细信息,效果如下:

请输入姓名:王菲

---------------------------------------------------------------------------------

查无此人

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

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

相关文章

【推荐100个unity插件之30】只需拖放即可实现Unity UI动画——AnimationUI插件的视野

地址 github&#xff1a;https://github.com/DhafinFawwaz/Unity-AnimationUI gitee&#xff1a;https://gitee.com/xiangyuphp/Unity-AnimationUI 介绍 AnimationUI是一个统一的工具&#xff0c;可以轻松创建UI动画&#xff0c;无需代码。您可以简单地拖放来创建一些平滑的…

鸿蒙开发5.0【基于Swiper的页面布局】

场景一&#xff1a;Swiper页面支持自定义动画 方案&#xff1a; 给Swiper组件设置.nextMargin(50).prevMargin(50)属性。 给Swiper组件添加onChange事件&#xff0c;设置当前this.currentIndexindex&#xff0c;当currentIndex为首页或者尾页时&#xff0c;设置上一张以及下一…

“喂饭级”教程!建筑AI生成设计Stable Diffusion看这篇就够了!

前言 你最近是否看过这样的“魔法案例”&#xff0c;由一张简单的SU体块图片&#xff0c;快速生成多个设计方案&#xff0c;就像这样&#xff1a; ©绘图空间 而看过之后&#xff0c;你是否也在心里想着——“教练&#xff01;我要学这个&#xff01;” 今天我们就将带你…

YOLOv7输出层之间的热力图

我们经常看到一些论文里绘制了不同的热力图&#xff0c;来直观的感受其模型的有效性。特别是使用了注意力模块的网络&#xff0c;热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上&#xff0c;以便对模型的有效性和合理性进行评估。 例如Centralized Feature Pyra…

青蛙跳台阶与汉诺塔问题

hello&#xff0c;各位小伙伴们上次我们复习了C语言小tip之函数递归&#xff0c;这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题&#xff01; 青蛙跳台阶问题 青蛙跳台阶问题&#xff1a;一只青蛙跳n阶台阶&#xff0c;一次可以跳1阶或者两阶&#xff0c;问有多少种情况…

【精选】基于Hadoop的热点事件分析的设计与实现(全网最新定制,独一无二)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Ubuntu 24.04 LTS源码安装doccano

引言 doccano是一款面向机器学习从业者的开源数据标记工具。您可以使用 doccano 执行不同类型的标记任务&#xff0c;支持多种数据格式。要了解 doccano 的功能&#xff0c;请试用doccano 演示版。 1.软件下载 git clone https://github.com/doccano/doccano.git cd doccano …

python学习——爬虫之session请求处理cookie

import requestssessionrequests.session() url"https://passport.17k.com/ck/user/login" data{"loginName": "19139186287","password":"2001022600hzk"} ressession.post(url,datadata) print(res.text)# session通过会话…

vue-创建项目、工程

安装node.js 自己百度 安装vue-cli 在cmd 命令行窗口输入 npm install --global vue-cli,vue-cli是创建脚手架的工具 安装完成之后&#xff0c;输入 vue -V 查看版本号,出现版本号说明安装成功 创建vue项目 默认创建 首先创建一个test测试文件夹 然后在文件内的地址栏输入…

Kimi 化身为你的私人翻译神器

在这个全球化的时代&#xff0c;无论是职场上的无缝沟通、学习资料的快速获取&#xff0c;还是日常生活中的轻松跨语言交流&#xff0c;我们都渴望拥有一个强大且便捷的翻译伙伴。Kimi&#xff0c;正是这样一位值得信赖的翻译神器。今天&#xff0c;就让我们一同探索如何高效地…

使用nvitop来监控 NVIDIA GPU 的使用情况

1.安装nvitop&#xff1a; pip install nvitop2.运行 nvitop: nvitop显示如下&#xff1a; 显示信息含义 1. 顶部信息栏 当前时间&#xff1a;显示当前的系统时间&#xff08;Sat Aug 31 16:33:03 2024&#xff09;。提示信息&#xff1a;提示可以按 h 键获取帮助或按 q 键…

论文4解析(复现):带有初速度的S形路径轨迹规划方法

论文&#xff1a;带有初速度的S形路径轨迹规划方法&#xff0c;史伟民 论文介绍了一种带有初速度的情况下进行轨迹规划的方法。 总得来说&#xff0c;是可以实现在运动过程中重新进行轨迹规划。 指数加减速&#xff1a;..... 直线型加减速&#xff1a;..... S形加减速&…

中仕公考:公务员考试缺考有影响吗?

公务员考试缺考的影响根据考试阶段的不同又所区别&#xff0c;中仕为大家介绍一下&#xff1a; 笔试阶段的缺考后果&#xff1a; 在公务员考试中&#xff0c;若考生未能按时参加笔试&#xff0c;将自动视为放弃该次考试机会。此行为不会对考生的个人信用产生任何负面效应&…

2024最新软件测试面试题(含答案解析+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到…

软件测试面试八股文(答案解析+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到…

LlamaIndex 工作流

LlamaIndex 内部提供了一个简单的工作流引擎&#xff0c;为什么要有工作流引擎&#xff1f;做过 OA 的同学都了解工作流引擎&#xff0c;工作流的优势在于模块化开发&#xff0c;把业务节点进行抽象&#xff0c;流程于业务逻辑分离&#xff0c;方便进行业务节点组装&#xff0c…

还在为低效工作烦恼?Kimi使用指南,让你的效率飞跃提升

在这个信息爆炸的时代&#xff0c;效率成为了我们追求的重要目标。今天&#xff0c;我要为大家介绍一个能够显著提升工作效率的智能助手——Kimi。Kimi不仅能够理解复杂的指令&#xff0c;还能处理多种文件格式&#xff0c;甚至还能进行网页内容解析。这篇文章将带你一文看懂Ki…

如何打开终端?

终端也叫黑窗口&#xff0c;命令行&#xff0c;可以用代码命令的方式控制计算机&#xff0c;如何打开呢&#xff1f; 输入WinR 在左下角输入cmd 点击确定 出现这个界面证明打开

住宅物业满意度计算方式中满意率和满意度指数的区别

满意率和满意度指数是用于计算住宅物业满意度的两种不同方式&#xff0c;它们的区别如下&#xff1a; 1、满意率&#xff1a;满意率是通过计算满意的居民人数与总参与调查的居民人数之间的比例来衡量满意度。它以百分比形式表示&#xff0c;可以直观地了解居民对物业管理的整体…

关于lua调用DLL的c/c++动态库(相关搜索:数据库)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…