JdbcUtils工具类的优化升级——通过配置文件连接mysql8.0

news2024/10/4 1:28:24

我之前的博文JDBC重构——JdbcUtils工具类的封装写了一个JdbcUtils的工具类,但是这个类也会有一个问题:如下图所示:

连接数据库的代码在java中是写死的,如果我们想要换一个数据库进行连接,就会很麻烦,这时我们需要添加一个配置文件,当我们更换数据库时,就是需要修改配置文件的参数即可。

注意:配置文件的内容不要有空格!

一、新建一个资源目录

资源目录下新建一个配置文件

mysqldriver=com.mysql.cj.jdbc.Driver
mysqlurl=jdbc:mysql://192.168.180.141:3306/jdbcstudb
mysqlusername=root
mysqlpwd=root

二、定义一个基类BaseDao

基类BaseDao用来加载properties文件,实例化Connection,释放资源,执行公共方法,简单理解,还是把一些冗余的代码进行封装。

package com.atguigu.kb21.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 加载properties文件,实例化Connection,释放资源,执行公共方法
 */
public class BaseDao {
    // 将配置文件映射为属性
    private static String diver;
    private static String url;
    private static String username;
    private static String pwd;

    static {
        // 加载配置文件
        Properties properties = new Properties();
        InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("database.properties");
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        diver = properties.getProperty("mysqldriver");
        url = properties.getProperty("mysqlurl");
        username = properties.getProperty("mysqlusername");
        pwd = properties.getProperty("mysqlpwd");

        System.out.println(diver+"\n"+url+"\n"+username+"\n"+pwd);
    }

    // 封装Connection连接数据库
    public Connection getConnection(){
        Connection connection = null;
        try {
            Class.forName(diver);
            connection = DriverManager.getConnection(url, username, pwd);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    // 封装释放资源
    public void close(Connection connection,PreparedStatement preparedStatement){
        try {
            if(null != connection){
                connection.close();
            }
            if(null != preparedStatement){
                preparedStatement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void close(Connection connection){
            try {
                if(null != connection){
                connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    /**
     * 将新增,修改和删除操作统一抽象到一个方法中
     * @param sqlStr
     * @param params ...用法:表示n个参数[0,+∞]
    */
    // 在进行增删改操作时,每次执行sql都会返回int数值,因此,可以对执行sql的语句进行封装
    public int executeUpdate(String sqlStr,Object...params){
        Connection connection = this.getConnection();
        PreparedStatement preparedStatement = null;
        int num = -1;
        try {
            preparedStatement = connection.prepareStatement(sqlStr);
            if(null != params){
                for (int i = 0; i < params.length; i++) {
                    // 传参
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            num = preparedStatement.executeUpdate();
            return num;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            this.close(connection,preparedStatement);
        }
        return num;
    }


    public static void main(String[] args) {
        BaseDao baseDao = new BaseDao();

        // 测试getConnection方法
        Connection connection = baseDao.getConnection();
        System.out.println(connection+"连接成功!");

        // 测试executeUpdate方法
        String sql = "delete from dog where id = 21";
        int num = baseDao.executeUpdate(sql);
        System.out.println("操作成功!"+num);

        // 测试close方法
        baseDao.close(connection);
        System.out.println("释放资源成功!");
    }
}

三、定义Dog类

我们将sql语句的运行结果输出到控制台后,对应操作的表要作为类,方便后续的操作,这里我们还是用dog表,将dog表中的所有字段映射为Dog类的属性

package com.atguigu.kb21.pojo;

import java.util.Date;

/**
 * SQL语句要进行java操作
 */
public class Dog {
    // 将dog表中的每一个字段映射为Dog类的每一个属性
    private Integer id;
    private String name;
    private Integer health;
    private Integer love;
    private String strain;
    private Date lytime;

    // 这里的有参构造方法重载是因为id是自动生成,lytime为系统时间,所以不需要手动传参
    public Dog(String name, Integer health, Integer love, String strain) {
        this.name = name;
        this.health = health;
        this.love = love;
        this.strain = strain;
    }

    public Dog(Integer id, String name, Integer health, Integer love, String strain, Date lytime) {
        this.id = id;
        this.name = name;
        this.health = health;
        this.love = love;
        this.strain = strain;
        this.lytime = lytime;
    }

    public Dog() {
    }

    @Override
    public String toString() {
        return "Dog{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", health=" + health +
                ", love=" + love +
                ", strain='" + strain + '\'' +
                ", lytime=" + lytime +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getHealth() {
        return health;
    }

    public void setHealth(Integer health) {
        this.health = health;
    }

    public Integer getLove() {
        return love;
    }

    public void setLove(Integer love) {
        this.love = love;
    }

    public String getStrain() {
        return strain;
    }

    public void setStrain(String strain) {
        this.strain = strain;
    }

    public Date getLytime() {
        return lytime;
    }

    public void setLytime(Date lytime) {
        this.lytime = lytime;
    }
}

四、新建DogDao接口,实现增删改功能

package com.atguigu.kb21.dao;

import com.atguigu.kb21.pojo.Dog;

/**
 * 对数据库中Dog表的操作定义,比如,新增宠物,根据id删除宠物,根据健康值删除宠物
 * 根据id修改宠物信息
 * 根据id查询宠物信息
 * 根据多条件查询宠物信息
 */
public interface DogDao {
    // 新增宠物的功能
    Integer saveDog(Dog dog);

    // 根据id修改宠物信息
    Integer updateDog(Dog dog);

    // 根据id删除宠物信息
    Integer delById(Integer id);

    // 根据健康值删除宠物信息
    Integer delByHealth(Integer health);
}

五、新建DogDaoImpl实现类,继承基类BaseDao,并且实现DogDao接口的功能

package com.atguigu.kb21.dao;

import com.atguigu.kb21.pojo.Dog;

import java.sql.Connection;

public class DogDaoImpl extends BaseDao implements DogDao{
    @Override
    public Integer saveDog(Dog dog) {
//      Connection connection = super.getConnection();// 这句代码也可以不写,因为在调用执行方法时,执行方法同时也调用了getConnection方法
        String sql = "insert into dog(name,health,love,strain,lytime) values(?,?,?,?,now())";
        int num = super.executeUpdate(sql, dog.getName(), dog.getHealth(), dog.getLove(), dog.getStrain());
        System.out.println("新增成功!"+num);
        return num;
    }

    @Override
    public Integer updateDog(Dog dog) {
        Connection connection = super.getConnection();
        String sql = "update dog set name = ? , health = ? where id = ?";
        int num = super.executeUpdate(sql, dog.getName(), dog.getHealth(), dog.getId());
        System.out.println("修改成功!"+num);
        return num;
    }

    @Override
    public Integer delById(Integer id) {
        Connection connection = super.getConnection();
        String sql = "delete from dog where id = ?";
        int num = super.executeUpdate(sql, id);
        System.out.println("删除id成功!"+num);
        return num;
    }

    @Override
    public Integer delByHealth(Integer health) {
        Connection connection = super.getConnection();
        String sql = "delete from dog where health = ?";
        int num = super.executeUpdate(sql, health);
        System.out.println("删除health成功!"+num);
        return num;
    }
}

六、新建DogTest测试类,对dog表进行增删改操作

package com.atguigu.kb21;

import com.atguigu.kb21.dao.DogDaoImpl;
import com.atguigu.kb21.pojo.Dog;
import org.junit.Test;

public class DogTest {
    @Test
    public void testDogDaoInsert(){
        DogDaoImpl dogDao = new DogDaoImpl();
        Dog dog = new Dog("旺财", 80, 90, "泰迪");
        dogDao.saveDog(dog);
    }

    @Test
    public void testDogDaoUpdate(){
        DogDaoImpl dogDao = new DogDaoImpl();
        Dog dog = new Dog("麦克斯", 35, 100, "雪纳瑞");
        dog.setId(14);
        dogDao.updateDog(dog);
    }

    @Test
    public void testDogDaoDelById(){
        DogDaoImpl dogDao = new DogDaoImpl();
        dogDao.delById(7);
    }

    @Test
    public void testDogDaoDelByHealth(){
        DogDaoImpl dogDao = new DogDaoImpl();
        dogDao.delByHealth(90);
    }
}

对master表进行增删改的操作

七、定义Master类

package com.atguigu.kb21.pojo;

public class Master {
    private Integer pid;
    private String name;
    private Integer age;
    private String gender;
    private Integer yearnum;
    private Integer did;
    private Dog dog;

    public Master(String name, Integer age, String gender, Integer yearnum, Integer did) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.yearnum = yearnum;
        this.did = did;
    }

    public Master(Integer pid, String name, Integer age, String gender, Integer yearnum, Integer did, Dog dog) {
        this.pid = pid;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.yearnum = yearnum;
        this.did = did;
        this.dog = dog;
    }

    public Master() {
    }

    @Override
    public String toString() {
        return "Master{" +
                "pid=" + pid +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", yearnum=" + yearnum +
                ", did=" + did +
                ", dog=" + dog +
                '}';
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getYearnum() {
        return yearnum;
    }

    public void setYearnum(Integer yearnum) {
        this.yearnum = yearnum;
    }

    public Integer getDid() {
        return did;
    }

    public void setDid(Integer did) {
        this.did = did;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}

八、创建MasterDao接口,定义接口功能

package com.atguigu.kb21.dao;

import com.atguigu.kb21.pojo.Master;

/**
 * 要对Master表做的操作,接口方法写入到下面
 */
public interface MasterDao {
    // TODO 增 删 改 查询主人及狗狗的信息
    // 新增主人信息
    Integer saveMaster(Master master);

    // 根据pid修改主人信息
    Integer updateMaster(Master master);

    // 根据did删除主人信息
    Integer delByDid(Integer did);
}

九、创建MasterDaoImpl类,继承基类BaseDao,并且实现MasterDao接口的功能

package com.atguigu.kb21.dao;

import com.atguigu.kb21.pojo.Master;

/**
 * String name, Integer age, String gender, Integer yearnum, Integer did
 */
public class MasterDaoImpl extends BaseDao implements MasterDao{
    @Override
    public Integer saveMaster(Master master) {
        String sql = "insert into master(name,age,gender,yearnum,did) values(?,?,?,?,?)";
        int num = super.executeUpdate(sql,master.getName(),master.getAge(),master.getGender(),master.getYearnum(),master.getDid());
        System.out.println("新增成功!"+num);
        return num;
    }

    @Override
    public Integer updateMaster(Master master) {
        String sql = "update master set name = ?,age = ? where pid = ?";
        int num = super.executeUpdate(sql, master.getName(),master.getAge(),master.getPid());
        System.out.println("修改成功!"+num);
        return num;
    }

    @Override
    public Integer delByDid(Integer did) {
        String sql = "delete from master where did = ?";
        int num = super.executeUpdate(sql, did);
        System.out.println("删除成功!"+num);
        return num;
    }
}

十、创建MasterTest测试类,对master表进行增删改操作

package com.atguigu.kb21;

import com.atguigu.kb21.dao.MasterDaoImpl;
import com.atguigu.kb21.pojo.Master;
import org.junit.Test;

public class MasterTest {
    @Test
    public void testMasterDaoInsert(){
        MasterDaoImpl masterDao = new MasterDaoImpl();
        Master master = new Master("小红",29,"女",9,8);
        masterDao.saveMaster(master);
    }

    @Test
    public void testMasterDaoUpdate(){
        MasterDaoImpl masterDao = new MasterDaoImpl();
        Master master = new Master("小八",40,"女",7,6);
        master.setPid(1);
        masterDao.updateMaster(master);
    }

    @Test
    public void testMasterDaoDelByDid(){
        MasterDaoImpl masterDao = new MasterDaoImpl();
        masterDao.delByDid(6);
    }
}

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

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

相关文章

嵌入式HLS 案例开发手册——基于Zynq-7010/20工业开发板(2)

目 录 2 led_flash 案例 19 2.1 HLS 工程说明 19 2.2 编译与仿真 20 2.3 IP 核测试 23 3 key_led_demo 案例 23 3.1 HLS 工程说明 23 3.2 编译与仿真 25 3.3 IP 核测试 27 前 言 本文主要介绍 HLS 案例的使用说明,适用开发环境: Windows 7/10 64bit、Xilinx Vivado…

从零搭建的前后端完整的直播网页方案

前言&#xff1a;由于前段时间刚租了台服务器打算自己玩玩&#xff0c;随想首页或者哪哪个页面挂个我个人的直播间应该还挺有趣的。遂探索如何在我的网站上弄一个直播。三下五除二&#xff0c;清清爽爽&#xff0c;看完此文5分钟即可直播。 整体思路 最简单直观的图解。 由上图…

VB2019创建、使用静态库(同样的使用动态库dll)

库&#xff1a; 二进制可执行文件&#xff0c;操作系统载入内存执行&#xff0c;将不怎么更改的底层打包成库后可以使整体编译更改&#xff0c;并且实现对底层的保密&#xff08;不对外或员工开放&#xff09;。库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动…

【国科大模式识别】第二次作业(阉割版)

【题目一】最大似然估计也可以用来估计先验概率。假设样本是连续独立地从自然状态 ωi\omega_iωi​ 中抽取的, 每一个自然状态的概率为 P(ωi)P\left(\omega_i\right)P(ωi​) 。如果第 kkk 个样本的自然状态为 ωi\omega_iωi​, 那么就记 zik1z_{i k}1zik​1, 否则 zik0z_{i…

【无标题】测试新发文章

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Spring之后处理器

目录 一&#xff1a;概述 二&#xff1a;案例演示 三&#xff1a;Bean的后处理器----BeanPostProcessor 案例&#xff1a;对Bean方法进行执行时间日志增强 四&#xff1a;Spring ioc整体流程总结 一&#xff1a;概述 Spring的后处理器是Spring对外开发的重要扩展点、允许我…

量子计算机是什么?量子计算机和传统计算机之间有什么区别?

1.突破1000量子比特大关&#xff01; 2022年11月9日的IBM年度量子峰会上&#xff0c;IBM宣布了Osprey在量子硬件和软件方面取得的突破性进展&#xff0c;同时推出了“鱼鹰”&#xff08;Osprey&#xff09;芯片。“鱼鹰”是全球迄今为止量子比特最多的量子计算机&#xff0c;而…

软考初级信息处理

软考初级信息处理技术员还是比较简单的&#xff0c;只要多刷题&#xff0c;实操也很重要的&#xff01;备考时间讲究高效哦&#xff01; 1、考试安排&#xff1a; 2、关于信处的考点分析&#xff1a; 上午考试&#xff1a; 下午考试&#xff1a; 3、信处如何备考&#xff1a;…

从spark WordCount demo中学习算子:map、flatMap、reduceByKey

文章目录spark map和flatMap应用&#xff1a;Word CountreduceByKey的用法spark map和flatMap val rdd sc.parallelize(List("coffee panda","happy panda","happiest panda party"))&#xff08;1&#xff09;map rdd.map(_.split(" &q…

windows terminal 还是 cmder ?

前景提要 windows terminal自带的没有tab命令自动补全, cmd的自动补全垃圾; cmder虽然有自动补全, 但是界面管理不太行; 而且比较复杂&#xff1b;只想要其UI和路径换行显示; windows terminal 应用商城或https://github.com/microsoft/terminal 下载页 https://github.com/mic…

【算法刷题】哈希表题型及方法归纳

哈希表特点 常见的三种哈希结构&#xff1a; 1、数组&#xff1a;操作简单&#xff0c;方便快捷&#xff0c;但不适于进行一些更复杂的操作。 注&#xff1a;适用于用set或map的情景&#xff1a;&#xff08;1&#xff09;当数组大小受限&#xff1b;&#xff08;2&#xff0…

powerquery 连接 postgresql

1下载安装postgresql的驱动器 https://pan.baidu.com/s/1ii9PudUs9WL_clP7Ub647Q 提取码&#xff1a;hm6g 2 安装配置odbc 2.1打开控制面板 – 选择管理工具 2.2选择ODBC数据源(64位) 2.3控制面板搜索数据源-单击添加 选择postgresql unicode 2.4配置数据源信息 3.通过e…

einsum 理解

本文是参考以下两篇文章&#xff0c;再结合我自己的经验完成的&#xff1a; 文章一&#xff1a;https://zhuanlan.zhihu.com/p/358417772 文章二&#xff1a;https://zhuanlan.zhihu.com/p/27739282 Einsum介绍&#xff1a; 给定矩阵A 和矩阵B &#xff08;在Python中也可以说是…

【PCB专题】PCB板卡上的UL标识是什么?

PCB行业中重要的认证之一是UL认证。在网上直接搜索UL会出现很多与防火、安全、保险相关的词汇出现。

开发板测试手册——USB 4G 模块、GPS 定位功能操作步骤详解(3)

目录 4 USB 4G 模块测试 41 4.1 网络功能测试 42 4.2 短信功能测试 43 4.3 GPS 定位功能测试 44 4.4 通话功能测试 45 4.5 测试程序编译 46 5 USB 网口模块测试 47 前 言 本指导文档适用开发环境: Windows 开发环境: Windows 7 64bit 、Windows 10 64bit Linux 开…

C语言进阶内功修炼——深度剖析数据在内存中的存储

&#x1f412;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 目录 &#x1f680;1. 数据类型介绍 &#x1f307;1.1 类型的基本归类&#xff1a; &#x1f680;2. 整形在内存中的存储 &am…

Three.js学习(一)three.js的一些基本操作

文章目录1.鼠标操作三维场景旋转、移动和缩放2.场景中添加新的三维图形3.设置材质效果4.光源效果1.鼠标操作三维场景旋转、移动和缩放 使用THREE的OrbitControls控件&#xff0c;可以实现鼠标控制三维图形的操作。主要是通过监听鼠标操作&#xff0c;控制相机的三维参数。 imp…

在线问诊呈爆发式增长,聚合支付分账如何助力互联网医疗平台加速发展?

&#xff08;图源:pexels网站&#xff09; 随着疫情的放开&#xff0c;人们问诊需求快速上涨&#xff0c;由于医院服务的压力激增&#xff0c;线上问诊成为了不少人替代去医院的有效手段&#xff0c;甚至于线上问诊开始出现了爆发式增长。但是在互联网医疗平台的发展过程中&am…

C语言进阶——数据的存储

目录 一. 数据类型 二. 整形在内存中的存储 1.原码、反码、补码 2.大小端 三. 浮点型在内存中的存储 存储 取出 一. 数据类型 在前面&#xff0c;我们已经学过一些基本的内置类型 char——字符数据类型 short——短整型 int——整形 long——长整形 long…

电路方案分析(十四)汽车电动座椅参考方案设计(H桥,高低边驱动器设计)

汽车电动座椅参考方案设计 tips&#xff1a;TI设计方案参考分析&#xff1a;TI Designs&#xff1a;TIDA-020008 双向和单向电机驱动器的电机驱动应用&#xff08;如汽车电动座椅&#xff09;的驱动和控制电路。它演示了如何驱动具有小电路板尺寸、高度可靠性和完整诊断功能的…