mysql基础(jdbc)

news2024/12/26 5:41:06

1.Java连接数据库步骤

1.注册驱动

Class<?> driverManager=Class.forName("com.mysql.cj.jdbc.Driver");

2.获取连接

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/studymysql","root","123456");

3.执行sql

String sql="select * from  emp";
PreparedStatement ps=con.prepareStatement(sql);

4.返回sql执行结果

ResultSet rs=ps.executeQuery();
while (rs.next()){
System.out.println("员工Id"+rs.getInt("empno")+"\t员工姓名"+rs.getString("ename"));
}

2.JDBC工具类

  • 1.先创建db.properties文件

    # Database configuration properties
    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/studymysql
    username=root
    password=123456
  • 2.然后创建jdbc工具类读取properties文件,获取连接对象

    package com.pyb.utils;
    ​
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    import com.zaxxer.hikari.HikariConfig;
    import com.zaxxer.hikari.HikariDataSource;
    public class JdbcUtils {
        private static final HikariDataSource dataSource;
        static {
            Properties props = new Properties();
            try (InputStream input = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties")) {
                props.load(input);
                HikariConfig config = new HikariConfig();
                config.setDriverClassName(props.getProperty("driver"));
                config.setJdbcUrl(props.getProperty("url"));
                config.setUsername(props.getProperty("username"));
                config.setPassword(props.getProperty("password"));
                // 可选配置项,可以根据需要添加更多配置
                // config.setMaximumPoolSize(10); // 设置最大连接数
    ​
                dataSource = new HikariDataSource(config);
            } catch (IOException e) {
                throw new RuntimeException("Error loading database properties.", e);
            }
        }
        /**
         * 获取数据库连接对象
         * @return 数据库连接对象
         */
        public static Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
        /**
         * 关闭数据库相关资源
         */
        public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
            if (rs != null) {
                try { rs.close(); } catch (SQLException ignored) {}
            }
            if (ps != null) {
                try { ps.close(); } catch (SQLException ignored) {}
            }
            if (conn != null) {
                try { conn.close(); } catch (SQLException ignored) {}
            }
        }
        // 你可以根据需要保留其他重载的 close 方法
        // 确保在应用关闭时正确关闭数据源
        public static void destroy() {
            if (dataSource != null) {
                dataSource.close();
            }
        }
    }

3.写持久层业务逻辑实现增删改查

  • 1.先准备好sql表

    /*
     Navicat Premium Data Transfer
    ​
     Source Server         : localhost_3306
     Source Server Type    : MySQL
     Source Server Version : 80037 (8.0.37)
     Source Host           : localhost:3306
     Source Schema         : studymysql
    ​
     Target Server Type    : MySQL
     Target Server Version : 80037 (8.0.37)
     File Encoding         : 65001
    ​
     Date: 24/12/2024 11:32:08
    */
    ​
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    ​
    -- ----------------------------
    -- Table structure for emp
    -- ----------------------------
    DROP TABLE IF EXISTS `emp`;
    CREATE TABLE `emp`  (
      `empno` int NOT NULL AUTO_INCREMENT COMMENT '雇员编号',
      `ename` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '雇员姓名',
      `job` varchar(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '表示工作职位',
      `mgr` int NULL DEFAULT NULL COMMENT '表示一个雇员的领导编号',
      `hiredate` datetime NULL DEFAULT NULL COMMENT '表示雇佣日期',
      `sal` double NULL DEFAULT NULL COMMENT '表示月薪,工资',
      `comm` double NULL DEFAULT NULL COMMENT '表示奖金或佣金',
      `deptno` int NULL DEFAULT NULL,
      PRIMARY KEY (`empno`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
    ​
    -- ----------------------------
    -- Records of emp
    -- ----------------------------
    ​
    SET FOREIGN_KEY_CHECKS = 1;
    ​
  • 2.编写pojo映射数据库属性

    package com.pyb.pojo;
    ​
    /**
     * @version 1.0
     * @Author 彭彦彬
     * @Date 2024/12/24 15:07
     * @注释
     */
    public class Emp {
        private int empNo;
        private String eName;
        private String job;
        private int mgr;
        private String hireDate;
        private double sal;
        private double comm;
        private int deptNo;
    ​
        public Emp(int empNo, String eName, String job, int mgr, String hireDate, double sal, double comm, int deptNo) {
            this.empNo = empNo;
            this.eName = eName;
            this.job = job;
            this.mgr = mgr;
            this.hireDate = hireDate;
            this.sal = sal;
            this.comm = comm;
            this.deptNo = deptNo;
        }
    ​
        public Emp(String eName, String job, int mgr, String hireDate, double sal, int deptNo, double comm) {
            this.eName = eName;
            this.job = job;
            this.mgr = mgr;
            this.hireDate = hireDate;
            this.sal = sal;
            this.deptNo = deptNo;
            this.comm = comm;
        }
    ​
        @Override
        public String toString() {
            return "Emp{" +
                    "empNo=" + empNo +
                    ", eName='" + eName + '\'' +
                    ", job='" + job + '\'' +
                    ", mgr=" + mgr +
                    ", hireDate='" + hireDate + '\'' +
                    ", sal=" + sal +
                    ", comm=" + comm +
                    ", deptNo=" + deptNo +
                    '}';
        }
    ​
        public Emp() {
        }
    ​
        public int getEmpNo() {
            return empNo;
        }
    ​
        public void setEmpNo(int empNo) {
            this.empNo = empNo;
        }
    ​
        public String geteName() {
            return eName;
        }
    ​
        public void seteName(String eName) {
            this.eName = eName;
        }
    ​
        public String getJob() {
            return job;
        }
    ​
        public void setJob(String job) {
            this.job = job;
        }
    ​
        public int getMgr() {
            return mgr;
        }
    ​
        public void setMgr(int mgr) {
            this.mgr = mgr;
        }
    ​
        public String getHireDate() {
            return hireDate;
        }
    ​
        public void setHireDate(String hireDate) {
            this.hireDate = hireDate;
        }
    ​
        public double getSal() {
            return sal;
        }
    ​
        public void setSal(double sal) {
            this.sal = sal;
        }
    ​
        public double getComm() {
            return comm;
        }
    ​
        public void setComm(double comm) {
            this.comm = comm;
        }
    ​
        public int getDeptNo() {
            return deptNo;
        }
    ​
        public void setDeptNo(int deptNo) {
            this.deptNo = deptNo;
        }
    }
  • 3.dao层接口

    package com.pyb.dao;
    ​
    import com.pyb.pojo.Emp;
    ​
    import java.sql.SQLException;
    import java.util.List;
    ​
    /**
     * @version 1.0
     * @Author 彭彦彬
     * @Date 2024/12/25 10:17
     * @注释
     */
    public interface EmpDao {
        /**
         * 获取所有用户数据
         * @return
         */
        List<Emp> list() throws SQLException;
    ​
        /**
         * 查询员工信息通过姓名
         * @param name
         * @return
         */
        Emp selectEmpByName(String name) throws SQLException;
        /**
         * 添加員工信息
         * @param emp
         */
        int addEmp(Emp emp);
        int deleteEmp(Emp emp);
    }
  • 4.dao层接口实现类

    package com.pyb.dao.daoImpl;
    import com.pyb.dao.EmpDao;
    import com.pyb.pojo.Emp;
    import com.pyb.utils.JdbcUtils;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * @version 1.0
     * @Author 彭彦彬
     * @Date 2024/12/25 10:19
     */
    public class EmpDaoImpl implements EmpDao {
        @Override
        public List<Emp> list() throws SQLException {
            String sql = "SELECT * FROM emp";
            List<Emp> list = new ArrayList<>();
    ​
            // 使用 try-with-resources 确保资源自动关闭
            try (Connection con = JdbcUtils.getConnection();
                 PreparedStatement ps = con.prepareStatement(sql);
                 ResultSet rs = ps.executeQuery()) {
    ​
                while (rs.next()) {
                    int empno = rs.getInt("empno");
                    String ename = rs.getString("ename");
                    String job = rs.getString("job");
                    int mgr = rs.getInt("mgr");
                    String hiredate = rs.getString("hiredate"); // 如果 hiredate 是日期类型
                    double sal = rs.getDouble("sal");
                    double comm = rs.getDouble("comm");
                    int deptno = rs.getInt("deptno");
    ​
                    list.add(new Emp(empno, ename, job, mgr, hiredate, sal, comm, deptno));
                }
            } catch (SQLException e) {
                // 记录详细的错误信息,以便于调试
                e.printStackTrace(); // 在实际应用中应使用日志框架如 SLF4J 等记录错误信息
                throw e; // 或者抛出自定义异常
            }
            return list;
        }
        @Override
        public Emp selectEmpByName(String name) throws SQLException {
            String sql = "SELECT * FROM emp WHERE ename = ?";
    ​
            // 使用 try-with-resources 确保资源自动关闭
            try (Connection con = JdbcUtils.getConnection();
                 PreparedStatement ps = con.prepareStatement(sql)) {
    ​
                ps.setString(1, name);
    ​
                try (ResultSet rs = ps.executeQuery()) {
                    if (rs.next()) {
                        int empno = rs.getInt("empno");
                        String ename = rs.getString("ename");
                        String job = rs.getString("job");
                        int mgr = rs.getInt("mgr");
                        String hiredate = rs.getString("hiredate"); // 如果 hiredate 是日期类型
                        double sal = rs.getDouble("sal");
                        double comm = rs.getDouble("comm");
                        int deptno = rs.getInt("deptno");
    ​
                        return new Emp(empno, ename, job, mgr, hiredate, sal, comm, deptno);
                    }
                }
    ​
                // 如果没有找到员工,则返回 null
                return null;
            } catch (SQLException e) {
                // 记录详细的错误信息,以便于调试
                e.printStackTrace(); // 在实际应用中应使用日志框架如 SLF4J 等记录错误信息
                throw e; // 或者抛出自定义异常
            }
        }
        @Override
        public int addEmp(Emp emp) {
            String sql="insert into emp(ename,job,mgr,hiredate,sal,comm,deptno)values(?,?,?,?,?,?,?)";
            int effect=0;
            // 使用 try-with-resources 确保资源自动关闭
            try (Connection con = JdbcUtils.getConnection();
                 PreparedStatement ps = con.prepareStatement(sql)) {
    ​
                ps.setString(1,emp.geteName());
                ps.setString(2,emp.getJob());
                ps.setInt(3,emp.getMgr());
                ps.setString(4,emp.getHireDate());
                ps.setDouble(5, emp.getSal());
                ps.setDouble(6,emp.getComm());
                ps.setInt(7,emp.getDeptNo());
                effect=ps.executeUpdate();
            } catch (SQLException e) {
                // 记录详细的错误信息,以便于调试
                e.printStackTrace(); // 在实际应用中应使用日志框架如 SLF4J 等记录错误信息
            }
            return effect;
        }
        @Override
        public int deleteEmp(Emp emp) {
            String sql = "DELETE FROM emp WHERE empno = ?";
            int affectedRows = 0;
    ​
            // 使用 try-with-resources 确保资源自动关闭
            try (Connection con = JdbcUtils.getConnection();
                 PreparedStatement ps = con.prepareStatement(sql)) {
    ​
                ps.setInt(1, emp.getEmpNo());
    ​
                affectedRows = ps.executeUpdate();
    ​
                if (affectedRows == 0) {
                    System.out.println("Warning: No rows were deleted for empno=" + emp.getEmpNo());
                    // 可选择抛出自定义异常或返回特定值以表示未找到要删除的记录
                } else {
                    System.out.println("Employee with empno=" + emp.getEmpNo() + " deleted successfully.");
                }
    ​
            } catch (SQLException e) {
                // 记录详细的错误信息,以便于调试
                e.printStackTrace(); // 在实际应用中应使用日志框架如 SLF4J 等记录错误信息
                // 抛出自定义异常或进行其他适当的错误处理
                throw new RuntimeException("Database error occurred while deleting employee.", e);
            }
            return affectedRows;
        }
    }
  • 5.最后进行测试即可

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

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

相关文章

ROM修改进阶教程------修改刷机包init.rc 自启用户自定义脚本的一些基本操作 代码格式与注意事项

在很多定制化固件中。我们需要修改系统的rc文件来启动自己的一些脚本。但有时候修改会不起作用,其具体原因在于权限与代码格式的问题。博文将系统的解析代码操作编写的注意事项与各种权限分别。了解以上. 轻松编写自定义启动脚本. 通过博文了解💝💝💝 1-------💝💝…

硬件模块常使用的外部中断

对于STM32来说&#xff0c;想要获取的信号是外部驱动的很快的突发信号 例1&#xff1a;旋转编码器的输出信号&#xff1a; 可能很久都不会拧它&#xff0c;不需要STM32做任何事情但是一拧它&#xff0c;就会有很多脉冲波形需要STM32接收信号是突发的&#xff0c;STM32不知道什…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅&#xff0c;从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍&#xff1a; 一、主要功能 …

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

VTK知识学习(27)- 图像基本操作(二)

1、图像类型转换 1&#xff09;vtkImageCast 图像数据类型转换在数字图像处理中会频繁用到。一些常用的图像算子(例如梯度算子)在计算时出于精度的考虑&#xff0c;会将结果存储为float或double类型&#xff0c;但在图像显示时&#xff0c;一般要求图像为 unsigned char 类型,…

在跨平台开发环境中构建高效的C++项目:从基础到最佳实践20241225

在跨平台开发环境中构建高效的C项目&#xff1a;从基础到最佳实践 引言 在现代软件开发中&#xff0c;跨平台兼容性和高效开发流程是每个工程师追求的目标。尤其是对于 C 开发者&#xff0c;管理代码的跨平台构建以及调试流程可能成为一项棘手的挑战。在本文中&#xff0c;我…

网络协议入门

一、概述 1、模型 为了减少协议设计的复杂性&#xff0c;大多数网络模型均采用分层的方式来组织。每一层都有自己的功能&#xff0c;就像建筑物一样&#xff0c;每一层都靠下一层支持。每一层利用下一层提供的服务来为上一层提供服务&#xff0c;本层服务的实现细节对上层屏蔽…

集成RabbitMQ+MQ常用操作

文章目录 1.环境搭建1.Docker安装RabbitMQ1.拉取镜像2.安装命令3.开启5672和15672端口4.登录控制台 2.整合Spring AMQP1.sun-common模块下创建新模块2.引入amqp依赖和fastjson 3.新建一个mq-demo的模块1.在sun-frame下创建mq-demo2.然后在mq-demo下创建生产者和消费者子模块3.查…

sentinel笔记10- 限流规则持久化(下)

上一篇整理过单向的持久化&#xff0c;sentinel笔记9- 限流规则持久化&#xff08;上&#xff09;-CSDN博客 本篇进行sentinel 改造&#xff0c;实现双向同步。 1 下载Sentinel源码 https://github.com/alibaba/Sentinel 2 dashboard 改造 2.1修改dashboard项目的pom.xml &…

微服务篇-深入了解 XXL-JOB 分布式任务调度的具体使用(XXL-JOB 的工作流程、框架搭建)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 XXL-JOB 调度中心概述 1.2 XXL-JOB 工作流程 1.3 Cron 表达式调度 2.0 XXL-JOB 框架搭建 2.1 XXL-JOB 调度中心的搭建 2.2 XXL-JOB 执行器的搭建 2.3 使用调度中心…

【jenkins插件】

1) 2) 3) 4) 5) 6) 参考: 知识库/运维/Jenkins/01-安装/13-插件.md zfoo/java-developer-document - 码云 - 开源中国

孔雀鱼和斑马鱼能一起养吗?

在观赏鱼的世界里&#xff0c;孔雀鱼和斑马鱼都是备受鱼友喜爱的热门品种。它们独特的外形和相对容易的饲养条件&#xff0c;使得不少养鱼新手跃跃欲试将它们混养在一起&#xff0c;但这其中实则有诸多因素需要考量。 从生存环境来看&#xff0c;孔雀鱼和斑马鱼有一定的兼容性…

踏踏实实练SQLday1

踏踏实实练SQLday1 1连续登录1.1查询连续登录3天以上的用户第一步去重第二步-开窗rownumber&#xff0c;用date减一下&#xff0c;对结果进行分组 -- over()开窗函数知识图谱第三步 1.2查询连续登录最大天数用户1.3某个用户连续登录天数注意先where一下这个用户的数据过滤出来.…

UM-Net:基于不确定性建模的息肉分割方法,对ICGNet的重新思考|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 UM-Net: Rethinking ICGNet for polyp segmentation with uncertainty modeling UM-Net&#xff1a;基于不确定性建模的息肉分割方法&#xff0c;对ICGNet的重新思考 01 文献速递介绍 结直肠癌&#xff08;CRC&#xff09;是男性中第三大最常见的恶性肿瘤&…

C语言项目 天天酷跑(上篇)

前言 这里讲述这个天天酷跑是怎么实现的&#xff0c;我会在天天酷跑的下篇添加源代码&#xff0c;这里会讲述天天酷跑这个项目是如何实现的每一个思路&#xff0c;都是作者自己学习于别人的代码而创作的项目和思路&#xff0c;这个代码和网上有些许不一样&#xff0c;因为掺杂了…

协众OA checkLoginQrCode接口 SQL注入漏洞

FOFA app"协众软件-协众OA" 漏洞复现 nuclei运行结果

如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码

如何用gpt来分析链接里面的内容&#xff0c;方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里&#xff1a;发现正确识别和分析了链接里面的内容 链接如下&#xff1a;https://arxiv.org/pdf/2009.1…

jdk各个版本介绍

JDK&#xff08;Java Development Kit&#xff09;是Java开发者用于构建、测试和部署Java应用程序的工具包。随着Java语言的不断演进&#xff0c;JDK也经历了多个版本的更新。下面是对JDK各个主要版本的简要介绍&#xff1a; JDK 1.0 - 1.4&#xff08;经典时代&#xff09; •…

OpenCV(python)从入门到精通——运算操作

加法减法操作 import cv2 as cv import numpy as npx np.uint8([250]) y np.uint8([10])x_1 np.uint8([10]) y_1 np.uint8([20])# 加法,相加最大只能为255 print(cv.add(x,y))# 减法&#xff0c;相互减最小值只能为0 print(cv.subtract(x_1,y_1))图像加法 import cv2 as…

大湾区经济网报道 | 第三届湾商大会暨湾区未来产业发展论坛隆重举行

大湾区经济网12月25日电&#xff08;首席记者 余芳&#xff09;&#xff0c;在中国式现代化进程与世界新机遇交汇的大背景下&#xff0c;要精准定位并奋力攀登未来科技与产业发展的高峰&#xff0c;加速推进新一代信息技术、人工智能、量子科技、生物科技、新能源以及新材料等领…