JDBC的Dao层设计

news2024/11/15 12:45:03

前言

在前面的博文中JDBC基础使用写增删改查会出现很多重复代码,可以将重复代码提取出来。

一、设计JDBC

  • 层次结构:
    在这里插入图片描述
  • 项目结构:
    在这里插入图片描述

二、BaseDao

2.1、将资源提取到文件

  • 在database.properties中将需要的资源放入其中:
mysqlDriver=com.mysql.cj.jdbc.Driver
mysqlUrl=jdbc:mysql://192.168.136.204:3306/jdbcdb
mysqlUser=root
mysqlPwd=root
  • 创建一个jdbc的基层类BaseDao(读取配置文件放入其中):
	private static String mysqlDriver;
    private static String mysqlUrl;
    private static String mysqlUser;
    private static String mysqlPwd;
    static {
        Properties properties = new Properties();
        InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mysqlDriver = properties.getProperty("mysqlDriver");
        mysqlUrl = properties.getProperty("mysqlUrl");
        mysqlUser = properties.getProperty("mysqlUser");
        mysqlPwd = properties.getProperty("mysqlPwd");
//        System.out.println(mysqlDriver);
//        System.out.println(mysqlUrl);
//        System.out.println(mysqlUser);
//        System.out.println(mysqlPwd);
    }

将读取配置文件放入static代码块中,在BaseDao类加载的时候就会获取到资源文件中的资源

2.2、建立连接数据库提取方法

    /**
     * 建立connection链接
     * @return Connection
     */
    public Connection getConnection(){
        Connection connection = null;
        try {
            Class.forName(mysqlDriver);
            connection = DriverManager.getConnection(mysqlUrl, mysqlUser, mysqlPwd);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return connection;
    }

2.3、释放资源提取方法

        /**
     * 重载 释放资源
     * @param resultSet 返回值
     * @param preparedStatement Statement
     * @param connection connection连接
     */
    public void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection){
        try {
            if (null!=resultSet)
                resultSet.close();
            if (null!=preparedStatement)
                preparedStatement.close();
            if (null!=connection)
                connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    public void close(PreparedStatement preparedStatement,Connection connection){
        this.close(null,preparedStatement,connection);
    }
    public void close(Connection connection){
        this.close(null,connection);
    }

此处使用了重载(方法名相同,参数列表不同,功能相似)

2.4、将增删改提取方法

    /**
     * 增删改
     * @param sql sql语句
     * @param params 传参
     * @return 操作的条数
     */
    public Integer executeUpdate(String sql, Object... params){
        Integer num = -1;
        Connection connection = this.getConnection();
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            if (null!=params) {
                for (int i = 0; i < params.length; i++) {
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            num = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {

            this.close(preparedStatement,connection);
        }
        if (num>0){
            System.out.println("操作成功");
        }
        return num;
    }
  • 此处使用了传不定值的参使用(Object… params)
  • 调用此方法只需要将sql语句和参数就可操作数据

2.5、提取查询一条数据的方法

    public T selectObjectById(RowMapper<T> row,String sql,Object... params){
        Connection connection = this.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            if (params!=null) {
                for (int i = 0; i < params.length; i++) {
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                return row.mapper(resultSet);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            this.close(resultSet,preparedStatement,connection);
        }

        return null;
    }
  • 这里用到了泛型(由于返回的值不能直接确定),传接口(将resultSet处理方法实现接口此处就可直接返回需要的值)
  • 调用此方法将处理resultSet的lambda、sql语句和参数即可获取所需的数据

2.6、提取查询多条数据的方法

public List<T> selectObjectList(RowMapper<T> row, String sql, Object... params){

        Connection connection = this.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<T> ts = new ArrayList<T>();
        try {
            preparedStatement = connection.prepareStatement(sql);
            if (params!=null) {
                for (int i = 0; i < params.length; i++) {
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                ts.add(row.mapper(resultSet));
            }
            return ts;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            this.close(resultSet,preparedStatement,connection);
        }

    }

与查询一条类似,但是处理数据不同。

三、StudentDao接口


import org.example.demo.mysql.pojo.Student;

import java.util.List;

/**
 * @program: jdbcMy
 * @interfaceName StudentDao
 * @description:
 * @author: 太白
 * @create: 2023-01-03 14:21
 **/
public interface StudentDao {

    Integer saveStudent(Student student);

    Integer deleteStudent(String sid);

    Integer updateStudent(Student student);

    Student selectStudentById(String sid);

    List<Student> selectStudentList();
}

四、RowMapper工具接口

package org.example.demo.mysql.utils;

import java.sql.ResultSet;

/**
 * @program: jdbcMy
 * @interfaceName RowMapper
 * @description:
 * @author: 太白
 * @create: 2023-01-04 19:57
 **/
public interface RowMapper<T> {

    T mapper(ResultSet resultSet);
}

五、StudentDaoImpl实现类

package org.example.demo.mysql.dao2;

import org.example.demo.mysql.dao.StudentDao;
import org.example.demo.mysql.pojo.Student;
import org.example.demo.mysql.utils.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * @program: jdbcMy
 * @interfaceName StudentDao2
 * @description:
 * @author: 太白
 * @create: 2023-01-04 20:00
 **/
public class StudentDao2Impl extends BaseDao2<Student> implements StudentDao {
//   增
    public Integer saveStudent(Student student) {
        String sql = "insert into student (sid,sname,sage,ssex) value (?,?,?,?)";
        Integer integer = super.executeUpdate(sql,student.getSid(),student.getSname(),student.getSage(),student.getSsex());
        return integer;
    }
//  删
    public Integer deleteStudent(String sid) {
        String sql = "delete from student where sid = ?";
        Integer integer = super.executeUpdate(sql,sid);
        return integer;
    }
//  改
    public Integer updateStudent(Student student) {
        String sql = "update student set sname=?,sage=?,ssex=? where sid=?";
        Integer integer = super.executeUpdate(sql,student.getSname(),student.getSage(),student.getSsex(),student.getSid());
        return integer;
    }
//  查一条数据
    public Student selectStudentById(String sid) {
        String sql = "select sid,sname,sage,ssex from student where sid = ?";
        Student student = super.selectObjectById(row, sql, sid);
        return student;
    }

//    实现处理result的接口方法(lambda表达式)
    RowMapper<Student> row = new RowMapper<Student>() {
        public Student mapper(ResultSet resultSet) {
            Student student = new Student();
            try {
                student.setSid(resultSet.getString("sid"));
                student.setSname(resultSet.getString("sname"));
                student.setSage(resultSet.getDate("sage"));
                student.setSsex(resultSet.getString("ssex"));
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

            return student;
        }
    };
//    查多条数据
    public List<Student> selectStudentList() {
        String sql = "select sid,sname,sage,ssex from student";

        List<Student> students = super.selectObjectList(row, sql);
        return students;
    }


}

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

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

相关文章

安科瑞医疗IT系统在医院安全用电中的应用实例

【摘要】根据现代医院建筑发展的趋势和特点&#xff0c;结合医疗 IT系统的工作原理&#xff0c;对医疗 IT系统作了简要介绍&#xff0c;并对IT系统在医院安全用电的具体应用进行了分析。通过工程实例详细探讨了医疗 IT系统在安装和配电方面应注意的问题和细节。 【关键词】IT…

C++ 语法基础课6 —— 函数

文章目录1. 函数基础1.1 编写函数1.2 调用函数1.3 形参和实参1.4 函数的形参列表1.5 函数返回类型1.6 局部变量、全局变量与静态变量2. 参数传递2.1 传值参数2.2 传引用参数(可以改变实参)2.3 数组形参(可以修改函数外数组)2.3.1 一维数组形参2.3.2 多维数组形参2.4 函数重载2.…

expdp导sys用户表时报错ORA-39166、ORA-31655

问题描述&#xff1a;expdp导sys用户表时报错ORA-39166、ORA-31655&#xff0c;如下所示&#xff1a; [oracleoel~]$ expdp \/ as sysdba\ directoryDATA_PUMP_DIR dumpfiletest.dmplogfileexpdp.log tablestest Export:Release 11.2.0.4.0 - Production on Tue Nov 29 14:08:…

麒麟 docker 自启动失败

docker 问题描述&#xff1a; 自启动时出现超时问题 start operation timed out. Terminating 排查流程&#xff1a; journalctl -u docker.service .... modulegrpc Jan 04 11:17:13 control03-55 dockerd[4466]: time"2023-01-04T11:17:13.30274997408:00" leve…

隔离认证、安全标准。

目的&#xff1a; 隔离认证、安全标准。 工业安全标准与隔离组件规格关系 功能隔离、基本隔离和增强型隔离等级 安全标准定义 系统级和组件级认证 测试器件获得高压安全性 器件行业标准 高电压系统隔离&#xff0c;认证、安全标准 了解组件级与系统级标准、隔离等级…

阿里云前端专家冯军:前端用户体验该如何优化

2022 年 9 月 28 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 11 期活动在深圳举办。活动现场&#xff0c;阿里云前端专家冯军&#xff0c;向参会企业代表分享了前端用户体验该如何优化&#xff1f;本文根据演讲内容整理而成。 大家好&#xff0c;我叫冯军&#…

HTML a标签打开新标签页避免出现安全漏洞,请使用“noopener”

新标签页中打开一个网址如何出现安全漏洞 让我们在网站上的新标签页中打开一个网址&#xff0c;HTML如下 <a href"https://malicious-domain.netlify.com" target"_blank">访问恶意网站&#xff01; </a> 这里我们有一个指向恶意网站的 href…

当malloc为string等容器开内存时候产生的问题,malloc和new最本质的区别

报内存错误的代码: 顺利执行的代码: 可以看到在malloc为a开好空间&#xff0c;然后对自定义类型对象a中的string a成员进行赋值的时候&#xff0c;发生了内存错误&#xff0c;但是经过测试&#xff0c;使用new为string a开空间就不会发生错误; new和malloc最本质的区别 最主要…

uniCloud云开发----6、uniapp配置tabbar底部导航栏和去掉uni-app顶部标题

uniapp配置tabbar底部导航栏、去掉uni-app顶部标题前言效果图1、创建页面并声明注册2、配置pages.json--tabBar3、通过pages.json来去掉uni-app顶部标题全部页面都去掉单个页面去掉前言 tabbar文档 在 pages.json 中提供 tabBar 配置&#xff0c;不仅仅是为了方便快速开发导航…

Elasticsearch入门,持续更新中

目录elasticsearch简介elasticsearch下载问题分析解决启动可视化界面Kibana下载配置启动进入kibana的控制台elasticsearch简介 懂得都懂 elasticsearch下载 官网下载地址 链接: https://www.elastic.co/cn/downloads/elasticsearch 本人准备安装在win10上&#xff0c;本地…

IB学习阶段所需的教材有哪些?

IB课程即国际文凭组织IBO&#xff08;International Baccalaureate Organization&#xff09;&#xff0c;是为全球学生开设从幼儿园到大学预科的课程&#xff0c;为3-19岁的学生提供智力&#xff0c;情感&#xff0c;个人发展&#xff0c;社会技能等方面的教育&#xff0c;使其…

可以同时解析多个binlog吗

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 叶金荣文章来源&#xff1a;GreatSQL社区原创 1.可以同时解析多个binlog吗 2.innodb_buffer_pool_instances设…

【C语言进阶】指针的进阶(1)

作者:匿名者Unit 目录一.数组指针1.定义2.使用二.数组、指针传参1.一维数组传参2.二维数组传参3.一级指针传参4.二级指针传参三.函数指针一.数组指针 1.定义 数组指针&#xff0c;顾名思义是指向数组的指针&#xff0c;那数组指针是如何定义的呢 int (*p)[10]; //解释&#x…

JavaSE从基础到入门:异常的学习

1. 异常的概念与体系结构 1.异常的概念 异常&#xff08;Exception&#xff09;指不期而至的各种状况&#xff0c;异常发生的原因有很多&#xff0c;通常包含以下几大类&#xff1a; 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断&#xff0c;或者JVM内存溢出…

HDMI1.4/2.0 Subsystem官方例程的建立

HDMI1.4/2.0 Subsystem官方例程的建立1、 项目背景明德扬(MDY)为某研究所研制的视频接口转换模块&#xff0c;该模块将HDMI视频转成LVDS7:1视频。视频输入接口采用的是HDMI 4K输入&#xff0c;基于Xilinx K7325t的高速收发器,特点是无需外围HDMI接收芯片&#xff0c;大大简化了…

SpringBoot+VUE前后端分离项目学习笔记 - 【13 SpringBoot和Vue实现导入和导出】

hutool工具 引入Hutool工具使用ExcelWriter&#xff0c;可以将数据写出到EXCEL https://www.hutool.cn/docs/#/poi/Excel%E5%B7%A5%E5%85%B7-ExcelUtil 引入pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactI…

项目中不容忽视的图表报表

在项目工作中&#xff0c;报表可是少不了的好帮手&#xff0c;可以帮助我们向合作者以及领导直观地展示项目情况进展。项目报表的作用可以从多维度监控项目的运行&#xff0c;保障项目的顺利进行。让数据可视化&#xff0c;辅助管理者进行合理决策。及时与合作者共享项目信息&a…

使用ros从realsence相机中获取图像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、使用ros从realsence相机中获取录制的视频并播放1.开启ros内核2.打开realsense相机3.查看当前话题4.在相机界面显示RGB图像和depth图像4.1 添加Image4.2 填入…

智能高效的Go IDE——GoLand v2022.3全新发布

GoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

javac和java命令详解

javac 是java语言编程编译器。全称java compiler。相信大家在学习java编程的时候&#xff0c;一定使用过javac和java这两个命令。大家在安装JDK的时候&#xff0c;验证是否安装成功&#xff0c;都会在命令行里输入java和javac命令来验证&#xff0c;这就是我们第一次使用java和…