JavaWeb 笔记-1

news2024/11/16 11:39:09

JavaWeb 笔记-1

  • 初始JavaWeb
    • 什么是JavaWeb
  • 一、JDBC
    • 1.1、JDBC简介
    • 1.2、API详解-DriverManager
    • 1.3、API详解-Connection
    • 1.4、API详解-Statement
    • 1.5、API详解-ResultSet
    • 1.6、API详解-PreparedStatement
      • 1.6.1、API详解-PreparedStatement-SQL注入演示
      • 1.6.2、API详解-PreparedStatement
      • 1.6.3、API详解-PreparedStatement-原理
    • 1.7、数据库连接池
      • 1.7.1、数据库连接池简介
      • 1.7.2、Druid(德鲁伊)连接池
  • 二、JDBC练习
    • 2.1、环境准备

初始JavaWeb

什么是JavaWeb

  • Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站
  • JavaWeb:是用Java技术来解决相关web互联网领域的技术栈

在这里插入图片描述

  1. 网页:展现数据
  2. 数据库:存储和管理数据
  3. JavaWeb程序:逻辑处理

一、JDBC

1.1、JDBC简介

JDBC概念:

  • JDBC就是使用Java语言操作关系型数据库的一套API
  • 全称:(Java DataBase Connectivity ) Java数据库连接

JDBC本质:

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处:

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
  • 可随时替换底层数据库,访问数据库的Java代码基本不变

初体验

package com.Smulll.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCdome {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/test1";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3.定义sql
        String sql = "insert into dept values (null,'项目部')";

        //4. 获取执行SQL的对象 Statement
        Statement stmt = conn.createStatement();

        //5. 执行sql
        int count = stmt.executeUpdate(sql);//受影响的行数

        //6. 受处理的结果
        System.out.println(count);

        //7.释放资源
        stmt.close();
        conn.close();
    }
}

1.2、API详解-DriverManager

  • DriverManager(驱动管理类)作用:
    1. 注册驱动
    2. 获取数据库连接
  1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");

提示:

  • MySQL 5之后的驱动包,可以省略注册驱动的步骤
  • 自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
  1. 获取链接
static Connection 		getConnection (String url,String user,String password)
  • 参数:
    1. url:连接路径
      • 语法: jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
      • 示例: jdbc:mysql://127.0.0.1:3306/db1
      • 细节:
        • 如果连接的是本机mysql服务器,并且mysqlI服务默认端口是3306,则ur可以简写为: jdbc:mysql///数据库名称?参数键值对
        • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
    2. user:用户名
    3. password:密码
package com.Smulll.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCdemo2_DriverManager {
    public static void main(String[] args) throws Exception {

        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        String sql = "insert into dept values (null,'项目部')";

        Statement statement = conn.createStatement();

        int i = statement.executeUpdate(sql);
        System.out.println(i);

        statement.close();
        conn.close();
    }
}

1.3、API详解-Connection

  • Connection(数据库连接对象)作用:
    1. 获取执行SQL的对象
    2. 管理事务
  1. 获取执行SQL的对象

    • 普通执行SQL对象
    Statement createStatement()
    
    • 预编译SQL的执行SQL对象:防止SQL注入
    PreparedStatement prepareStatement (sql)
    
    • 执行存储过程的对象
    CallableStatement prepareCall (sql)
    
  2. 事务管理

    • MySQL事务管理
      开启事务:BEGIN; / START TRANSACTION;
      提交事务:COMMIT;
      回滚事务:ROLLBACK;
      MySQL默认自动提交事务
    • JDBC事务管理:Connection接口中定义了3个对应的方法
      开启事务: setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务
      提交事务:commit()
      回滚事务:rollback()
package com.Smulll.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class JDBCdemo3_Connet {
    public static void main(String[] args) throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //2.获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/test1?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3.定义sql
        String sql1 = "insert into dept values (null,'1')";
        String sql2 = "insert into dept values (null,'2')";

        //4. 获取执行SQL的对象 Statement
        Statement stmt = conn.createStatement();
        
        //使用try-catch块来抛出异常
        try {
            //开启手动管理事务
            conn.setAutoCommit(false);
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            //6. 受处理的结果
            System.out.println(count1);

            int count2 = stmt.executeUpdate(sql2);//受影响的行数
            // 6. 受处理的结果
            System.out.println(count2);
            //提交事务
            conn.commit();
        } catch (Exception e) {
            //如果出现异常回滚事务
            conn.rollback();
        }

        //7.释放资源
        stmt.close();
        conn.close();
    }
}

1.4、API详解-Statement

  • Statement作用:
    1. 执行SQL语句
 执行SQL语句
	int executeUpdate(sql):执行DML、DDL语句 	
返回值:
	DML语句影响的行数
	DDL语句执行后,执行成功也可能返回0

	ResultSet executeQuery(sql): 执行DQL语句 	 
返回值:
	ResultSet结果集对象
package com.Smulll.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import org.junit.Test;

public class JDBCdemo4_Statement {

    @Test
    public void testDML() throws Exception {

        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        String sql = "insert into dept values (null,'123')";

        Statement statement = conn.createStatement();

        int i = statement.executeUpdate(sql);
        if (i>0){
            System.out.println("执行成功~");
        }else {
            System.out.println("执行失败~");
        }
        statement.close();
        conn.close();

    }
    @Test
    public void testDDL() throws Exception {

        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        String sql = "create database bd1";

        Statement statement = conn.createStatement();

        int i = statement.executeUpdate(sql);
        System.out.println(i);

        statement.close();
        conn.close();

    }
}

1.5、API详解-ResultSet

  • ResultSet(结果集对象)作用:
    1. 封装了DQL查询语句结果
    ResultSet  stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
    
  • 获取查询结果
boolean next(): (1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
返回值:
	true:有效行,当前行有数据. 
	false:无效行,当前行没有数据
xxx	getXxx(参数):获取数据
	xxx:数据类型;如:int getlnt(参数) ; String getString(参数)
参数:
	int:列的编号,从1开始. 
	String:列的名称
  • 使用步骤
    1. 游标向下移动一行,并判断该行否有数据:next()
    2. 获取数据: getXxx(参数)
//循环判断游标是否是最后一行末尾
while(rs.next()){
	//获取数据
	rs.getXxx(参数)
}

代码演示

package com.Smulll.jdbc;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCdemo5_ResultSet {

    @Test
    public void testResultSet() throws Exception {

        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        //要执行的SQL语句
        String SQL = "select * from dept";
        //获取执行SQL的statement对象
        Statement statement = conn.createStatement();
        //获取查询结果对象
        ResultSet rs = statement.executeQuery(SQL);
        //循环遍历出所有数据
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            //打印出遍历的结果
            System.out.println(id);
            System.out.println(name);
            System.out.println("---------------------------------------------");
        }
        //关流
        rs.close();
        statement.close();
        conn.close();
    }
}

在这里插入图片描述

package com.Smulll.jdbc;

import com.Smulll.Pojo.account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class JDBCdemo5_ResultSetDemo {

    @Test
    public void testResultSet() throws Exception {

        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        //要执行的SQL语句
        String SQL = "select * from student";
        //获取执行SQL的statement对象
        Statement statement = conn.createStatement();
        //获取查询结果对象
        ResultSet rs = statement.executeQuery(SQL);
        //创建一个集合,将查询出的结果存入
        List<account> list = new ArrayList<>();
        //循环遍历出所有数据
        while (rs.next()){

            account account = new account();

            int id = rs.getInt("id");
            String name = rs.getString("name");
            int num = rs.getInt("num");
            //将结果存入到集合当中

            account.setId(id);
            account.setName(name);
            account.setNum(num);

            list.add(account);
        }
        System.out.println(list);
        //关流
        rs.close();
        statement.close();
        conn.close();
    }
}
package com.Smulll.Pojo;

public class account {
    private int id;
    private String name;
    private int num;

    public account() {
    }

    public account(int id, String name, int num) {
        this.id = id;
        this.name = name;
        this.num = num;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }

    public String toString() {
        return "account{id = " + id + ", name = " + name + ", num = " + num + "}";
    }
}

1.6、API详解-PreparedStatement

1.6.1、API详解-PreparedStatement-SQL注入演示

  • PreparedStatement作用:

    1. 预编译SQL语句并执行:预防SQL注入问题
  • SQL注入

    • SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
package com.Smulll.jdbc;


import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCdemo6_PreparedStatement {

    @Test
    public void testResultSet() throws Exception {

        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        String name = "qweqweqwe";
        String pwd = "'or'1'='1";
        //要执行的SQL语句
        String SQL = "select * from tb_user where name = '"+name+"' and password = '"+pwd+"'";
        //获取执行SQL的statement对象
        Statement statement = conn.createStatement();
        //获取查询结果对象
        ResultSet rs = statement.executeQuery(SQL);

        if (rs.next()){
            System.out.println("执行成功");
        }else {
            System.out.println("执行失败");
        }
        
        //关流
        rs.close();
        statement.close();
        conn.close();
    }
}

1.6.2、API详解-PreparedStatement

  • PreparedStatement作用:
    • 预编译SQL并执行SQL语句
  1. 获取PreparedStatement 对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";

//通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
  1. 设置参数值
PreparedStatement对象:setXxx(参数1,参数2):?赋值
Xxx:数据类型;setInt(参数1,参数2)
参数:
	参数1:?的位置编号,从1开始
	参数2:?的值
  1. 执行SQL
executeUpdate();/ executeQuery(); :不需要再传递sql
package com.Smulll.jdbc;
import org.junit.Test;
import java.sql.*;

public class JDBCdemo7_PreparedStatement {

    @Test
    public void testResultSet() throws Exception {
        //省略注册驱动步骤
        String url = "jdbc:mysql:///test1?useSSL=false";//解决警告提示
        String username = "root";
        String password = "123456";
        //获取连接
        Connection conn = DriverManager.getConnection(url, username, password);

        String name = "小明";
        String pwd = "123";
        //要执行的SQL语句
        String SQL = "select * from tb_user where name = ? and password = ?";
        //获取执行SQL的statement对象
        Statement statement = conn.createStatement();
        //获取查询结果对象
        PreparedStatement pstm = conn.prepareStatement(SQL);
        //通过preparedStatement对象来设置?的值
        pstm.setString(1,name);
        pstm.setString(2,pwd);
        //获取到查询的结果
        ResultSet rs = pstm.executeQuery();
        if (rs.next()){
            System.out.println("执行成功");
        }else {
            System.out.println("执行失败");
        }
        //关流
        rs.close();
        pstm.close();
        conn.close();
    }
}

1.6.3、API详解-PreparedStatement-原理

  • PreparedStatement好处:
    1. 预编译SQL,性能更高
    2. 防止SQL注入: 将敏感字符进行转义
  1. PreparedStatement预编译功能开启: useServerPrepStmts=true

  2. 配置MySQL执行日志(重启mysql服务后生效)

log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
  1. PreparedStatement原理:
    1. 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
    2. 执行时就不用再进行这些步骤了,速度更快
    3. 如果sql模板一样,则只需要进行一次检查、编译

在这里插入图片描述

1.7、数据库连接池

1.7.1、数据库连接池简介

  • 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
  • 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
  • 好处:
    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏

在这里插入图片描述

  • 标准接口: DataSource
    • 官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
    • 功能:获取连接
Connection getConnection()
  • 常见的数据库连接池:
    • DBCP
    • C3P0
    • Druid

1.7.2、Druid(德鲁伊)连接池

  • Druid(德鲁伊)
    • Druid连接池是阿里巴巴开源的数据库连接池项目
    • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

Druid使用步骤

  1. 导入jar包 druid-1.1.12.jar
  2. 定义配置文件
  3. 加载配置文件
  4. 获取数据库连接池对象
  5. 获取链接
package com.Smulll.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //1.导入jar包
        //2.定义配置文件
        //3.加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("D:\\Java\\IDEA\\代码文件\\jdbc\\jdbc-dome\\src\\druid.properties"));
        //4.获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        //5.获取对应的数据库连接 Connection
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

        /*System.out.println(System.getProperty("user.dir"));*/
    }
}
#驱动位置
driverClassName = com.mysql.jdbc.Driver
#通信地址
url=jdbc:mysql:///test1?useSSL=false
#用户名
username=root
#密码
password=123456
#初始化连接数
initialSize=5
#最大连接数
maxActive=10
#最大等待时间(毫秒)
maxWait=3000

二、JDBC练习

2.1、环境准备

在这里插入图片描述

create table tb_brand
(
    id  int primary key auto_increment,
    brand_name varchar(20),
    company_name varchar(20),
    ordered int,
    description varchar(100),
    status int
);

insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),
       ('华为','华为技术有限公司',100,'华为就是牛逼',1),
       ('小米','小米科技有限公司',50,'are you ok',1);

select * from tb_brand;
package com.Smulll.Pojo;

public class brand {
    private Integer id;
    private String brundName;
    private String companyName;
    private Integer ordered;
    private String description;
    private Integer status;

    public brand() {
    }

    public brand(Integer id, String brundName, String companyName, Integer ordered, String description, Integer status) {
        this.id = id;
        this.brundName = brundName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = status;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getBrundName() {
        return brundName;
    }
    public void setBrundName(String brundName) {
        this.brundName = brundName;
    }
    public String getCompanyName() {
        return companyName;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public Integer getOrdered() {
        return ordered;
    }
    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }

    public String toString() {
        return "brand{id = " + id + ", brundName = " + brundName + ", companyName = " + companyName + ", ordered = " + ordered + ", description = " + description + ", status = " + status + "}";
    }
}

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

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

相关文章

RK3568平台开发系列讲解(外设篇)RFID 模块调试

🚀返回专栏总目录 文章目录 一、RFID 工作原理二、硬件连接三、驱动程序四、设备树五、测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解 RFID 模块调试。 一、RFID 工作原理 射频识别技术也就是 RFID,英文名为 Radio Frequency Identificati…

玻璃活动隔断安装需要注意什么

随着社会的发展和人们对空间利用的要求不断提高&#xff0c;玻璃活动隔断逐渐成为办公室和商业空间中常见的装修选择。玻璃活动隔断不仅可以有效分割空间&#xff0c;提供私密性&#xff0c;还能保持充足的采光和视觉效果。然而&#xff0c;为了确保玻璃活动隔断的安装质量和使…

PSP - MetaPredict 预测蛋白质序列的内源性无序区域 (Intrinsically Disordered Regions)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131461900 MetaPredict 算法简介&#xff1a; 内源性无序区域&#xff08;IDRs&#xff09;在所有生命领域中都普遍存在&#xff0c;并…

【GPT】如何拥有离线版本的GPT以及部署过程中的问题

【背景】 目前很多公司由于数据安全的问题&#xff0c;不能使用OpenAI的GPT&#xff0c;同时也没有必要非得使用如此泛用化的GPT。很多公司因此有训练自己的离线GPT的需求&#xff0c;这样的GPT只需要具备专业知识即可。 要使这个成为可能&#xff0c;首先就需要能够让GPT的Mo…

InstructGPT学习

GPT发展历程 在回答这个问题之前&#xff0c;首先要搞清楚ChatGPT的发展历程。 GPT-1用的是无监督预训练有监督微调。GPT-2用的是纯无监督预训练。GPT-3沿用了GPT-2的纯无监督预训练&#xff0c;但是数据大了好几个量级。InstructGPT在GPT-3上用强化学习做微调&#xff0c;内…

企业邮箱如何将一个用户设置到多个部门/群组

1、使用管理员账号postmaster登录企业邮局&#xff0c;点击“邮局管理”。 2、点击“组织与成员”。 3、勾选需要设置的用户&#xff0c;点击“设置所属部门/群”。&#xff08;例如&#xff1a;我们需要将所属销售分公司的高阳&#xff0c;加入到以下四个分销部中&#xff0c;…

Hive on Zeppelin

** Hive on Zeppelin ** 官网&#xff1a;zeppelin.apache.org 做大数据的人应该对Hive不陌生&#xff0c;Hive应该是大数据SQL引擎的鼻祖。历经多个版本的改进&#xff0c;现在的Hive3已经具备比较完善的ACID功能&#xff0c;能够同时满足交互式查询和ETL 两种场景。 那怎…

Linux内核的编译、安装、调试

这里写目录标题 编译安装内核下载内核安装依赖更改.config编译内核安装首先安装模块安装内核更改引导更改grub重启 其他操作清理内核源目录卸载安装的内核修改内核配置菜单实现对新加入内核源码的控制 常见问题1. Module.symvers is missing2. No rule to make target ‘debian…

Revit三维视图:第一人称的视角看模型,生成局部三维视图

​  一、Revit中怎么以第一人称的视角看空间效果 我们创建一栋完整的楼模型后&#xff0c;会不会想说假设在里面看看是什么效果呢&#xff0c;就是说想看看第一视角的空间效果&#xff0c;那么如何可以看第一人称的空间效果图呢?以下看步骤&#xff1a; 1、 打开楼层平面图 …

系统架构设计师 6:数据库设计

一、数据库系统 数据库系统&#xff08;DataBase System, DBS&#xff09;是一个采用了数据库技术&#xff0c;有组织地、动态地存储大量相关联数据&#xff0c;从而方便多用户访问的计算机系统。广义上讲&#xff0c;DBS包括了数据库管理系统&#xff08;DBMS&#xff09;。 …

详细认识二叉树【图片+代码】

目录 一、树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用&#xff08;目录树&#xff09; 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树存储结构 三、二叉树的顺序结构及实现 3.1二叉树的顺序结构 3…

Redis6之集群

集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态 必要性 单个redis存在不稳定性。当redis服务宕机了&#xff0c;就没有可用的服务了。而且单个redis的读写能力是有限的。使用redis集群可以强化redis的…

PIL.Image 调色板模式处理标签数据

文章目录 1 使用PIL.Image库进行调色板模式2 转回原来的色彩3 效果参考 1 使用PIL.Image库进行调色板模式 基本步骤&#xff1a; 自定义调色板&#xff0c;数据格式是一个Nx3的二维数组&#xff0c;一维数组的位置为分类的下标数据类型为np.uint8转化为调色板模式后img.conve…

想知道音频怎么转文字吗?

随着数字化技术的不断发展&#xff0c;我们生活中产生的各种音频越来越多&#xff0c;例如会议录音、采访录音等等。虽然音频记录信息方便&#xff0c;但它们在信息处理、存储和分享方面也存在问题。比如当我们需要对音频中的内容进行编辑或整理时&#xff0c;手动打字出现漏字…

Eclipse中项目的配置

1、修改本地运行时Tomcat对应的JRE版本 老项目升级JDK&#xff0c;在eclipse修改了项目的jdk、编译等级&#xff0c;但还是启动失败&#xff0c;报“java.lang.UnsupportedClassVersionError”。 观察发现&#xff0c;启动日志&#xff0c;tomcat还是使用的jdk1.5&#xff0c;…

编程题分享:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数

背景 近期面试遇到一家公司的编程题&#xff0c;觉得挺有参考价值 此处使用 PHP语言&#xff0c;进行编码测试&#xff0c; 编码之前要进行思路分析&#xff0c;避免无头苍蝇&#xff0c;走一步看一步 最后&#xff0c;希望后期面试顺利&#xff01;欢迎指摘 . 题目&#xff1…

形态学操作之膨胀

note // 膨胀原理&#xff1a;操作过程中&#xff0c;若膨胀因子某点是1&#xff0c;且原图该点为1&#xff0c;则锚点位置为1 code // 膨胀 // 膨胀原理&#xff1a;操作过程中&#xff0c;若膨胀因子某点是1&#xff0c;且原图该点为1&#xff0c;则锚点位置为1 typedef e…

gma 2 教程(一)概述:1.GMA 简介

地理与气象分析库&#xff08;Geographic and Meteorological Analysis. gma&#xff09;&#xff0c;是一个基于 Python 的地理、气象数据快速处理分析和地理制图函数包。构建过程参考了ArcGIS和QGIS的操作逻辑和特点&#xff0c;并添加诸多独创性、独有的功能&#xff0c;具有…

QT Creator上位机学习(三)QString及其相关控件介绍

系列文章目录 文章目录 系列文章目录字符串QStringQLableQLineEditQString的常用功能 字符串QString QSting类&#xff0c;用于处理字符串&#xff0c;进行字符串和数字之间的转化 转换函数&#xff1a; //字符串转数字 QString str......; int numstr.toInt(); float num2s…

微信项目IO优化:Jetpack DataStore 与MMKV实现高效持久化

咱们一起来看看mmkv 腾讯微信团队于2018年9月底宣布开源 MMKV &#xff0c;原理上基于 mmap的一个高性能key-value 组件&#xff0c;数据的序列化/反序列化使用 protobuf 实现&#xff0c;主打高性能和稳定性&#xff0c;也支持了Android 平台。 **MMKV最新源码托管地址&#…