JdbcUtils工具类的优化升级——通过配置文件连接mysql8.0,并对mysql8.0中的表进行[简单查询]操作

news2024/12/27 0:10:12

目录

一、在DogDao中新增查询的功能

二、在DogDaoImpl类中继承基类,并实现接口的功能

三、创建工具接口RowMapper

四、重新定义一个基类BaseDao2

五、新建一个DogDaoImpl2实现类,继承基类BaseDao2,实现DogDao接口的两个查询功能

六、在DogTest测试类中进行两个查询需求的测试

七、单表查询优化后返回的结果

1.public void testGetDogById2()

2.public void testGetAllDog2()

八、多表联查的实现

(一)新建DogDao2接口

(二)修改Dog类,添加主人集合

(三)新建DogDaoImpl3实现类,继承BaseDao2,实现DagDao2接口的功能

(四)DogTest测试类中进行测试

(五)返回结果

1.public void testGetDogById3()


        上回书我们说到了 jdbcUtils工具类的优化升级——通过配置文件连接mysql8.0,并对mysql8.0中的表进行[增删改]操作

        接下来继续讲查询的封装,因为增删改都返回影响的行数,所以可以统一封装在executeUpdate方法中,但是查询返回的可能是一条或多条结果,与executeUpdate封装的方法有所差别。

我们还是对dog表进行操作

一、在DogDao中新增查询的功能

package com.atguigu.kb21.dao;
import com.atguigu.kb21.pojo.Dog;
import java.util.List;

public interface DogDao {

    // 查询操作

    // 根据狗狗id查询对应的主人与狗狗信息
    Dog getDogById(Integer id);

    // 查询所有狗狗的信息
    List<Dog> getAllDog();
}

二、在DogDaoImpl类中继承基类,并实现接口的功能

package com.atguigu.kb21.dao;

import com.atguigu.kb21.pojo.Dog;
import com.atguigu.kb21.pojo.Master;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DogDaoImpl extends BaseDao implements DogDao{

    @Override
    public List<Dog> getAllDog() {
        String sql = "select id,name,health,love,strain,lytime from dog";
        Connection connection = super.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Dog> dogs = new ArrayList<>();
        try {
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                Dog dog = new Dog();
                dog.setId(resultSet.getInt("id"));
                dog.setName(resultSet.getString("name"));
                dog.setHealth(resultSet.getInt("health"));
                dog.setLove(resultSet.getInt("love"));
                dog.setStrain(resultSet.getString("strain"));
                dog.setLytime(resultSet.getDate("lytime"));
                dogs.add(dog);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            super.close(preparedStatement,connection,resultSet);
        }
        return dogs;
    }

    @Override
    public Dog getDogById(Integer id){
        String sql = "select " +
                "d.id,d.name,d.health,d.love,d.strain,d.lytime, " +
                "m.pid,m.name pname,m.age,m.gender,m.yearnum,m.did "+
                "from dog d " +
                "left join master m on d.id=m.did " +
                "where d.id=?";
        Connection connection = super.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Dog dog = new Dog();
        List<Master> masters = new ArrayList<>();
        try {
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,id);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                dog.setId(resultSet.getInt("id"));
                dog.setName(resultSet.getString("name"));
                dog.setHealth(resultSet.getInt("health"));
                dog.setLove(resultSet.getInt("love"));
                dog.setStrain(resultSet.getString("strain"));
                dog.setLytime(resultSet.getDate("lytime"));
                Master master = new Master();
                master.setPid(resultSet.getInt("pid"));
                master.setName(resultSet.getString("pname"));
                master.setAge(resultSet.getInt("age"));
                master.setGender(resultSet.getString("gender"));
                master.setYearnum(resultSet.getInt("yearnum"));
                master.setDid(resultSet.getInt("did"));
                master.setDog(dog);
                masters.add(master);
            }
            dog.setMaster(masters);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            super.close(preparedStatement,connection,resultSet);
        }
        return dog;
    }
}

三、创建工具接口RowMapper<T>

从上面的代码可以看出,查询的操作还是有冗余的代码,下面我们创建一个工具接口,来实现resultSet的操作

package com.atguigu.kb21.utils;
import java.sql.ResultSet;

public interface RowMapper<T> {
    T mapper(ResultSet resultSet);
}

文章开头处我提到过,sql的查询语句会返回各种形式的结果,所以这里我们将接口定义为泛型。

四、重新定义一个基类BaseDao2

接下来我们重新定义一个基类BaseDao2,将查询的操作进行封装,注意这里的BaseDao2也是泛型。

package com.atguigu.kb21.dao2;

import com.atguigu.kb21.dao.BaseDao;
import com.atguigu.kb21.utils.RowMapper;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class BaseDao2<T> {
    private static String driver;
    private static String url;
    private static String user;
    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();
        }

        driver = properties.getProperty("mysqldriver");
        url = properties.getProperty("mysqlurl");
        user = properties.getProperty("mysqluser");
        pwd = properties.getProperty("mysqlpwd");
        System.out.println(driver);
        System.out.println(url);
        System.out.println(user);
        System.out.println(pwd);
    }

    public Connection getConnection(){
        Connection connection = null;
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, user, pwd);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

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

     /**
     * 第一个查询需求是根据狗狗id返回狗狗信息
     * 由于每条狗只有一个id,所以可以确定的是:第一个查询需求返回的是一条数据
     * 由于我们将dog表中所有字段映射定义为Dog类的属性,那么返回的这条狗狗信息,就是Dog类的实例化对象
     */

    public T getObjectByParams(RowMapper<T> row,String strSql, Object...params) {
        Connection connection = this.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            preparedStatement = connection.prepareStatement(strSql);
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    preparedStatement.setObject(i + 1, params[i]);
                }
            }
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                // RowMapper接口是做组装的工作,得出的结果是一个实例化的对象
                return row.mapper(resultSet);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            this.close(preparedStatement,connection,resultSet);
        }
        return null;
    }

    /**
     * 同样的,一条狗狗可能对应多个主人,也会返回多个主人对象,这时候需要将这些主人对象存入集合中
     * @param row
     * @param sqlStr
     * @param params
     * @return
     */
    public List<T> getObjectListByParam(RowMapper<T> row,String sqlStr,Object...params){
        Connection connection = this.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<T> ts = new ArrayList<>();
        try {
            preparedStatement = connection.prepareStatement(sqlStr);
            if(null != params){
                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) {
            e.printStackTrace();
        }finally {
            this.close(preparedStatement,connection,resultSet);
        }
        return null;
    }
}

五、新建一个DogDaoImpl2实现类,继承基类BaseDao2,实现DogDao接口的两个查询功能

package com.atguigu.kb21.dao2;

import com.atguigu.kb21.dao.DogDao;
import com.atguigu.kb21.pojo.Dog;
import com.atguigu.kb21.utils.RowMapper;

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

public class DogDaoImpl2 extends BaseDao2<Dog> implements DogDao {

    @Override
    public Dog getDogById(Integer id) {
        String sqlStr = "select d.id,d.name,d.health,d.love,d.strain,d.lytime from dog d where d.id= ?";
        Dog dog = super.getObjectByParams(row, sqlStr, id);
        return dog;
    }

    @Override
    public List<Dog> getAllDog() {
        String sql = "select id,name,health,love,strain,lytime from dog";
        List<Dog> dogs = super.getObjectListByParam(row, sql);
        return dogs;
    }
    
    // 这里我们要对RowMapper接口进行实例化,用来实现resultSet的操作
    RowMapper<Dog> row = new RowMapper<Dog>() {
        @Override
        public Dog mapper(ResultSet resultSet) {
            Dog dog = new Dog();
            try {
                dog.setId(resultSet.getInt("id"));
                dog.setName(resultSet.getString("name"));
                dog.setHealth(resultSet.getInt("health"));
                dog.setLove(resultSet.getInt("love"));
                dog.setStrain(resultSet.getString("strain"));
                dog.setLytime(resultSet.getDate("lytime"));
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return dog;
        }
    };
}

六、在DogTest测试类中进行两个查询需求的测试

package com.atguigu.kb21;

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

import java.util.List;

public class DogTest {
   
    // 测试查询方法——resultSet优化前
 @Test
    public void testGetDogById(){
        DogDaoImpl dogDao = new DogDaoImpl();
        Dog dog = dogDao.getDogById(7);
        System.out.println(dog.toString());
        System.out.println("狗狗与主人信息");
        List<Master> masters = dog.getMaster();
        for (Master master :
                masters) {
            System.out.println(master.toString());
        }
    }

    @Test
    public void testGetAllDog(){
        DogDaoImpl dogDao = new DogDaoImpl();
        List<Dog> dogs = dogDao.getAllDog();
        // 遍历集合
        for (Dog dog:
             dogs) {
            System.out.println(dog);
        }
    }


    // 测试查询方法——resultSet优化后
    @Test
    public void testGetDogById2(){
        DogDaoImpl2 dogDao = new DogDaoImpl2();
        Dog dog = dogDao.getDogById(7);
        System.out.println(dog);
    }
//

    @Test
    public void testGetAllDog2(){
        DogDaoImpl dogDao = new DogDaoImpl();
        List<Dog> dogs = dogDao.getAllDog();
        // 遍历集合
        for (Dog dog:
                dogs) {
            System.out.println(dog);
        }
    }
}

七、单表查询优化后返回的结果

1.public void testGetDogById2()

2.public void testGetAllDog2()

八、多表联查的实现

我们还是通过狗狗Id查询信息,但是要关联Master表,同时显示狗狗id对应的狗狗信息和主人信息

(一)新建DogDao2接口

package com.atguigu.kb21.dao2;

import com.atguigu.kb21.pojo.Dog;

public interface DogDao2 {
    // 根据id查询狗狗信息与对应的主人信息
    Dog getDogById(Integer integer);
}

(二)修改Dog类,添加主人集合

package nj.zb.kb21.pojo;

import java.util.Date;
import java.util.List;

public class Dog {
    // 数据库中的每一个字段映射为java类
    // name,health,love,
    private Integer id;
    private String name;
    private Integer health;
    private Integer love;
    private String strain;
    private Date lytime;
    private List<Master> master;// 当前狗狗对象有过的主人信息    一对多

    public List<Master> getMaster() {
        return master;
    }

    public void setMaster(List<Master> master) {
        this.master = master;
    }

    public Dog() {
    }

    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(String name, Integer health, Integer love, String strain) {
        this.name = name;
        this.health = health;
        this.love = love;
        this.strain = strain;
    }

    @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;
    }
}

(三)新建DogDaoImpl3实现类,继承BaseDao2<T>,实现DagDao2接口的功能

        这里我们的实现思路是:通过传入id,找到这条狗的信息,因为主master表中的did对应dog表中的id,所以可以通过获取到的那一条狗的信息,找到对应的主人信息,返回的结果有多个Master对象,需要封装在List集合中,然后才能进行遍历获取主人信息。

package com.atguigu.kb21.dao2;

import com.atguigu.kb21.pojo.Dog;
import com.atguigu.kb21.pojo.Master;
import com.atguigu.kb21.utils.RowMapper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DogDaoImpl3<T> extends BaseDao2<T> implements DogDao2 {
    @Override
    public Dog getDogById(Integer id) {
        String sql1 = "select id,name,health,love,strain,lytime from dog where id = ?";
        String sql2 = "select pid,name,age,gender,yearnum,did from master where did = ?";
        Dog dog =(Dog) super.getObjectByParams((RowMapper<T>) dogRow, sql1, id);
        List<Master> masters = this.masterList(masterRow, sql2, id);
        dog.setMaster(masters);
        return dog;
    }

    RowMapper<Dog> dogRow = new RowMapper<Dog>(){
        @Override
        public Dog mapper(ResultSet resultSet) {
            Dog dog = new Dog();
            try {
                dog.setId(resultSet.getInt("id"));
                dog.setName(resultSet.getString("name"));
                dog.setHealth(resultSet.getInt("health"));
                dog.setLove(resultSet.getInt("love"));
                dog.setStrain(resultSet.getString("strain"));
                dog.setLytime(resultSet.getDate("lytime"));
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return dog;
        }
    };

    RowMapper<Master> masterRow = new RowMapper<Master>() {
        @Override
        public Master mapper(ResultSet resultSet) {
            Master master = new Master();
            try {
                master.setPid(resultSet.getInt("pid"));
                master.setName(resultSet.getString("name"));
                master.setAge(resultSet.getInt("age"));
                master.setGender(resultSet.getString("gender"));
                master.setYearnum(resultSet.getInt("yearnum"));
                master.setDid(resultSet.getInt("did"));
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return master;
        }
    };


    // 定义masterList的连接操作
    // 之所以不能在BaseDao2中写,是因为BaseDao2中只能返回狗狗类型,会有冲突
    public List<Master> masterList(RowMapper<Master> rowMapper,String sql,Object...params){
        Connection connection = super.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<Master> ts = new ArrayList<>();
        try {
            preparedStatement = connection.prepareStatement(sql);
            if(null != params){
                for (int i = 0; i < params.length; i++) {
                    preparedStatement.setObject(i+1,params[i]);
                }
            }
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                ts.add(rowMapper.mapper(resultSet));
            }
            return ts;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            super.close(preparedStatement,connection,resultSet);
        }
        return null;
    }
}

(四)DogTest测试类中进行测试

@Test
    public void testGetDogById3(){
        DogDaoImpl3 dogDaoImpl3 = new DogDaoImpl3();
        Dog dog = dogDaoImpl3.getDogById(7);
        System.out.println(dog.toString());
        System.out.println("狗狗对应的主人信息");
        List<Master> masters = dog.getMaster();
        for (Master master :
                masters) {
            System.out.println(master.toString());
        }
    }

(五)返回结果

1.public void testGetDogById3()

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

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

相关文章

【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )

文章目录一、函数引用作为函数参数二、函数类型作为函数返回值一、函数引用作为函数参数 函数 作为参数 , 有两种方式 : 传递 Lambda 表达式 , 也就是 匿名函数 作为参数值 ;传递 函数引用 作为参数值 ; 函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表…

程序员真是越来越懒了,Api 文档都懒得写?程序员:Api工具惯的!

关于大多数程序员不爱写文档问题&#xff0c; 我觉得可以从两个方面去拆解&#xff1a;主观原因、客观原因。 1. 客观 - 时间紧任务重&#xff0c;需求变化快 需求方每次都是紧急需求&#xff0c;老板每次都要求敏捷开发&#xff0c;快速响应。 按时交付的压力已经让大多数程…

区分: 小程序组件 and 小程序插件

近期发现有不少小伙伴分不清小程序组件和小程序插件&#xff0c;以为它们是一回事&#xff0c;只是措辞不一样。但实际上&#xff0c;小程序组件和小程序插件完全是两回事——插件是可以直接提供服务的&#xff0c;组件是给开发者提供的轮子&#xff0c;不能直接提供服务。下面…

Java--基本数据类型

文章目录前言一、数据类型-byte二、数据类型-short三、数据类型-int四、数据类型-long五、数据类型-float六、数据类型-double七、数据类型-char八、数据类型-boolean九、数据类型实例前言 Java提供了八种基本类型&#xff0c;六种数字类型&#xff08;四个整数型&#xff0c;…

LoRa无线远传水表方案ASR6500S/LLCC68

LoRa无线远传水表就是普通机械水表加上电子采集发讯模块而组成&#xff0c;电子模块完成信号采集、数据处理、存储并将数据通过通信线路上传给中继器、或手持式的抄表器。LoRa无线远传水表作为市面上比较火的智能水表&#xff1b;由主站通过传输媒体将多个户用仪表的数据集中抄…

MyBatis讲解,批量删除1

一、批量删除1 入参字符串 ”id1,id2,id3” 批量删除的关键字是 in 1.书写BookMapper 1.1先在navicat的新建查询里书写批量删除的sql语句 批量删除的sql语句 delete from book where id in (12,22); 1.2将sql语句复制到BookMapper里 2.书写BookDao批量删除方法 *书写dao…

【安全硬件】Chap.4 如何插入一个硬件木马到芯片的时序逻辑电路的漏洞里?如何构建可信赖的状态机?

【安全硬件】Chap.4 如何插入一个硬件木马到芯片的时序逻辑电路的漏洞里&#xff1f;如何构建可信赖的状态机&#xff1f;前言&#xff1a;硬件木马1. 时序逻辑电路中的设计漏洞Design Vulnerabilities序列检测器的设计漏洞——以智能门锁的虚位密码漏洞为例易受攻击的状态机写…

Qt基础之十八:WebEngine与JavaScript交互

Qt从5.6开始就用Qt Webengine替换了Qt WebKit,据说加载速度较Qt WebKit更快。 需在pro中添加QT += webenginewidgets 一.效果 二.实现 1.JavaScript调用Qt函数 在MainWindow中定义成员变量QWebChannel *m_channel;作为和web通信的数据通道 ①加载网页 void MainWindow::l…

多线程案例-阻塞式队列

1.什么是阻塞队列阻塞队列是一种特殊的队列,在"先进先出"的原则下又引入了"阻塞"功能阻塞队列能是一种线程安全的数据结构,具有以下特性:当队列满的时候,继续入队列就会阻塞,直到其它线程从队列中取走元素当队列空的时候,继续出队列就会阻塞,直到其它队列向…

内蒙古大学计算机考研893计算机考研真题分享

内蒙古大学计算机学院成立于1997年&#xff0c;软件学院成立于2005年&#xff0c;与计算机学院为一个实体&#xff0c;两个牌子。 目前&#xff0c;学院由计算机科学系、软件工程系、信息管理系和计算中心&#xff08;实验中心&#xff09;组成&#xff0c;设有计算机科学与技…

uniapp开发小程序引入微信快递跟踪(快递100)插件

目录 1.小程序插件接入 2.代码示例 3.页面接收参数 4.常用快递100公司编码表 1.小程序插件接入 微信快递100插件地址&#xff1a;快递100-快递查询&#xff08;免费接入&#xff09; | 微信服务市场 (qq.com) 1&#xff09;进入链接地址 2&#xff09;登陆开发小程序的账…

二叉树18:从中序与后序遍历序列构造二叉树

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;344. 反转字符串 题目&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的…

最全Go select底层原理,一文学透高频用法

导语 |在日常开发中&#xff0c;select语句被高频使用。但目前&#xff0c;全网分析select在编译期和运行时的完整底层原理资料&#xff0c;非常匮乏。本文基于Go1.18.1版本的源码&#xff0c;讲解select访问Channel在编译期和运行时的底层原理——select编译器优化用到的src/c…

2022年第十二届APMCM亚太杯1月增赛E题发布

2022年亚洲及太平洋地区建模数学竞赛问题E 有多少颗核弹可以摧毁地球? 1945年8月6日&#xff0c;第二次世界大战接近尾声。为了尽快结束战争&#xff0c;美国在日本广岛投下了名为"小男孩"的下一颗原子弹。这样一颗原子弹炸死了广岛的200000人&#xff0c;广岛的所有…

【数据结构Java版】对象的比较之Comparable与Comparator比较器

目录 一、基本类型的比较 二、对象类型的比较 &#xff08;1&#xff09;对象类型比较出现的问题 &#xff08;2&#xff09;重写基类equals方法 &#xff08;3&#xff09;基于Comparable接口的比较 1.实现Comparable接口&#xff0c;重写compareTo方法 &#xff08;4&a…

Flask框架中常规漏洞防范方法

一、前言 Double Fetch是一种条件竞争类型的漏洞&#xff0c;其主要形成的原因是由于用户态与内核态之间的数据在进行交互时存在时间差&#xff0c;我们在先前的学习中有了解到内核在从用户态中获取数据时会使用函数copy_from_user&#xff0c;而如果要拷贝的数据过于复杂的话…

leetcode | 链表

01 链表知识点 1.1 基础知识 线性表&#xff1a;零个或多个相同类型的数据元素的有限序列&#xff0c;一对一关系&#xff0c;所含数据元素个数n称为线性表的长度。 线性表有两种物理结构(存储结构)&#xff1a;顺序存储、链式存储。 线性表的顺序存储结构&#xff1a;用一段…

优化改进YOLOv5算法之添加SE、CBAM、CA模块(超详细)

目录 1 SENet 1.1 SENet原理 1.2 SENet代码(Pytorch) 1.3 YOLOv5中加入SE模块 1.3.1 common.py配置 1.3.2 yolo.py配置 1.3.3 创建添加RepVGG模块的YOLOv5的yaml配置文件 2 CBAM 2.1 CBAM原理 2.2 CBAM代码(Pytorch) 2.3 YOLOv5中加入CBAM模块 2.3.1 common.py配…

敏捷是一种态度:有了敏捷建模,就有了敏捷需求

目 录01 缘起02 敏捷需求5W1H的思考‍‍‍‍‍‍03 关于敏捷需求体系的一些思考‍‍‍‍‍‍04 写在敏捷需求后的话01缘起对研发效能提升的研究&#xff0c;是近年来各家企业技术部门一直在研究的课题。早期&#xff0c;针对敏捷开发的实践&#xff0c;让大多技术管理者尝到…

114.(leaflet之家)leaflet空间判断-点与圆的空间关系

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>