大数据基础设施搭建 - Hbase

文章目录

  • 一、解压压缩包
  • 二、配置环境变量
  • 三、修改配置文件
    • 3.1 修改hbase-env.sh
    • 3.2 修改hbase-site.xml
    • 3.3 修改regionservers
  • 四、解决HBase和Hadoop的log4j兼容性问题,使用Hadoop的jar包
  • 五、HBase远程发送到其他集群
  • 六、启动
  • 七、停止
  • 八、基本操作
    • 8.1 进入Hbase客户端
    • 8.2 namespace
    • 8.3 DDL
      • 8.3.1 创建表
      • 8.3.2 查看表
      • 8.3.3 修改表
      • 8.3.4 删除表
    • 8.4 DML
      • 8.4.1 写入数据
      • 8.4.2 读取数据
      • 8.4.3 删除数据
  • 九、访问WEB页面
  • 十、HBASE API
    • 10.1 环境准备
    • 10.2 创建连接
      • 10.2.1 单线程创建连接
      • 10.2.2 多线程创建连接
    • 10.3 操作数据
      • 10.3.1 建表&删表
      • 10.3.2 插入数据
      • 10.3.3 查询数据
      • 10.3.4 扫描数据
      • 10.3.5 带过滤扫描
      • 10.3.6 删除数据

首先保证Zookeeper和Hadoop正常运行

一、解压压缩包

[hadoop@hadoop102 software]$ tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/module/

二、配置环境变量

[hadoop@hadoop102 software]$ sudo vim /etc/profile.d/my_env.sh

新增内容:

#HBASE_HOME
export HBASE_HOME=/opt/module/hbase-2.4.11
export PATH=$PATH:$HBASE_HOME/bin

使环境变量生效:

[hadoop@hadoop102 software]$ source /etc/profile.d/my_env.sh

三、修改配置文件

3.1 修改hbase-env.sh

不使用hbase内置的zookeeper,使用独立zookeeper

[hadoop@hadoop102 conf]$ vim /opt/module/hbase-2.4.11/conf/hbase-env.sh

内容:

export HBASE_MANAGES_ZK=false

3.2 修改hbase-site.xml

表明zookeeper集群,hbase web访问路径

[hadoop@hadoop102 conf]$ vim /opt/module/hbase-2.4.11/conf/hbase-site.xml

内容:

  <!-- 分布式部署 --><property><name>hbase.cluster.distributed</name><value>true</value></property><!-- 默认配置 --><property><name>hbase.tmp.dir</name><value>./tmp</value></property><property><name>hbase.unsafe.stream.capability.enforce</name><value>false</value></property><!-- zookeeper集群地址 --><property><name>hbase.zookeeper.quorum</name><value>hadoop102,hadoop103,hadoop104</value></property><!-- 用来持久化HBase的数据,一般设置的是hdfs的文件目录(需要和hadoop的core-site.xml保持一致) --><property><name>hbase.rootdir</name><value>hdfs://hadoop102:9820/hbase</value></property><!-- WAL配置 --><property><name>hbase.wal.provider</name><value>filesystem</value></property>

3.3 修改regionservers

regionserver所在机器

[hadoop@hadoop102 conf]$ vim /opt/module/hbase-2.4.11/conf/regionservers

内容:

hadoop102
hadoop103
hadoop104

四、解决HBase和Hadoop的log4j兼容性问题,使用Hadoop的jar包

[hadoop@hadoop102 conf]$ mv /opt/module/hbase-2.4.11/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar /opt/module/hbase-2.4.11/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar.bak

五、HBase远程发送到其他集群

[hadoop@hadoop102 conf]$ mytools_rsync /opt/module/hbase-2.4.11/

六、启动

[hadoop@hadoop102 hbase-2.4.11]$ bin/start-hbase.sh

七、停止

bin/stop-hbase.sh

八、基本操作

8.1 进入Hbase客户端

[hadoop@hadoop102 hbase-2.4.11]$ bin/hbase shell

8.2 namespace

hbase:003:0> create_namespace 'first_namespace'
hbase:004:0> list_namespace

8.3 DDL

8.3.1 创建表

在first_namespace命名空间中创建表格student,两个列族。info列族数据维护的版本数为5个,如果不写默认版本数为1。

hbase:009:0> create 'first_namespace:student', {NAME => 'info', VERSIONS => 5}, {NAME => 'msg'}
hbase:022:0> create 'first_namespace:student01', {NAME => 'info', VERSIONS => 5}, {NAME => 'msg'}

8.3.2 查看表

hbase:015:0> describe 'first_namespace:student'

8.3.3 修改表

表名创建时写的所有和列族相关的信息,都可以后续通过alter修改,包括增加删除列族。

# 修改列族
hbase:016:0> alter 'first_namespace:student',  {NAME => 'msg', VERSIONS => 3}
# 新增列族
hbase:018:0> alter 'first_namespace:student',  {NAME => 'msg01', VERSIONS => 3}
# 删除列族
hbase:020:0> alter 'first_namespace:student', NAME => 'msg01', METHOD => 'delete'

8.3.4 删除表

shell中删除表格,需要先将表格状态设置为不可用。

hbase:024:0> disable 'first_namespace:student01'
hbase:025:0> drop 'first_namespace:student01'

8.4 DML

8.4.1 写入数据

在HBase中如果想要写入数据,只能添加结构中最底层的cell。可以手动写入时间戳指定cell的版本,推荐不写默认使用当前的系统时间。

hbase:027:0> put 'first_namespace:student','1001','info:name','zhangsan'
hbase:028:0> put 'first_namespace:student','1001','info:name','lisi'
hbase:029:0> put 'first_namespace:student','1001','info:age','18'

如果重复写入相同rowKey,相同列的数据,会写入多个版本进行覆盖。

8.4.2 读取数据

读取数据的方法有两个:get和scan。

get最大范围是一行数据,也可以进行列的过滤,读取数据的结果为多行cell。

hbase:030:0> get 'first_namespace:student','1001'
hbase:031:0> get 'first_namespace:student','1001' , {COLUMN => 'info:name'}

也可以修改读取cell的版本数,默认读取一个。最多能够读取当前列族设置的维护版本数。

hbase:032:0> get 'first_namespace:student','1001' , {COLUMN => 'info:name', VERSIONS => 6}

scan是扫描数据,能够读取多行数据,不建议扫描过多的数据,推荐使用startRow和stopRow来控制读取的数据,默认范围左闭右开。

hbase:036:0> scan 'first_namespace:student',{STARTROW => '1001',STOPROW => '1002'}

8.4.3 删除数据

删除数据的方法有两个:delete和deleteall。
执行命令会标记数据为要删除,不会直接将数据彻底删除,删除数据只在特定时期清理磁盘时进行

delete删除最新的一个版本。老版本会显示出来

hbase:037:0> delete 'first_namespace:student','1001','info:name'

deleteall删除当前列所有版本的数据,即为当前行当前列的多个cell。

hbase:039:0> deleteall 'first_namespace:student','1001','info:name'

deleteall删除当前列族数据

hbase:006:0> deleteall 'first_namespace:student','1001'
hbase:011:0> quit

九、访问WEB页面

http://hadoop102:16010/

十、HBASE API

10.1 环境准备

新建项目后在pom.xml中添加依赖:
注意:会报错javax.el包不存在,是一个测试用的依赖,不影响使用

<dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>2.4.0</version><exclusions><exclusion><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId><version>3.0.1-b06</version></dependency>
</dependencies>

10.2 创建连接

根据官方API介绍,HBase的客户端连接由ConnectionFactory类来创建,用户使用完成之后需要手动关闭连接。同时连接是一个重量级的,推荐一个进程使用一个连接,对HBase的命令通过连接中的两个属性Admin和Table来实现。

10.2.1 单线程创建连接

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.AsyncConnection;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.CompletableFuture;public class HBaseConnect {public static void main(String[] args) throws IOException {// 1. 创建配置对象Configuration conf = new Configuration();// 2. 添加配置参数conf.set("hbase.zookeeper.quorum","hadoop102,hadoop103,hadoop104");// 3. 创建hbase的连接// 默认使用同步连接Connection connection = ConnectionFactory.createConnection(conf);// 可以使用异步连接// 主要影响后续的DML操作CompletableFuture<AsyncConnection> asyncConnection = ConnectionFactory.createAsyncConnection(conf);// 3. 使用连接2System.out.println(connection);// 5. 关闭连接connection.close();}
}

10.2.2 多线程创建连接

使用类单例模式,确保使用一个连接,可以同时用于多个线程。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.AsyncConnection;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.CompletableFuture;public class HBaseConnect {// 设置静态属性hbase连接public static Connection connection = null;static {// 创建hbase的连接try {// 使用配置文件的方法connection = ConnectionFactory.createConnection();} catch (IOException e) {System.out.println("连接获取失败");e.printStackTrace();}}/*** 连接关闭方法,用于进程关闭时调用* @throws IOException*/public static void closeConnection() throws IOException {if (connection != null) {connection.close();}}
}

在resources文件夹中创建配置文件hbase-site.xml,添加以下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration><property><name>hbase.zookeeper.quorum</name><value>hadoop102,hadoop103,hadoop104</value></property>
</configuration>

10.3 操作数据

创建类HBaseDML

public class HBaseDML {// 添加静态属性connection指向单例连接public static Connection connection = HBaseConnect.connection;
}

10.3.1 建表&删表

public static void createTable(Connection conn,String namespace,String tableName,String...families){if(families.length < 1){System.out.println("建表必须指定列族");return;}try (Admin admin = conn.getAdmin()){TableName tableNameObj = TableName.valueOf(namespace, tableName);if(admin.tableExists(tableNameObj)){System.out.println("~~要创建的表已经存在~~");return;}List<ColumnFamilyDescriptor> cfdList = new ArrayList();for (String family : families) {ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(family)).build();cfdList.add(familyDescriptor);}TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableNameObj).setColumnFamilies(cfdList).build();admin.createTable(desc);} catch (IOException e) {e.printStackTrace();} 
}//删表
public static void dropTable(Connection conn,String namespace,String tableName){try (Admin admin = conn.getAdmin()){TableName tableNameObj = TableName.valueOf(namespace, tableName);if(!admin.tableExists(tableNameObj)){System.out.println("~~要删除的表不存在~~");return;}admin.disableTable(tableNameObj);admin.deleteTable(tableNameObj);} catch (IOException e) {e.printStackTrace();} 
}public static void main(String[] args) throws Exception{Connection conn = getConnection();// createTable(getConnection(),"bigdata","student2","info","msg");// dropTable(getConnection(),"bigdata","student2");closeConnection(conn);
}

10.3.2 插入数据

//向表中添加|更新数据public static void putCell(Connection conn,String nameSpace,String tableName,String rowKey,String family,String column,String value){// 1.获取tabletry (Table table = conn.getTable(TableName.valueOf(nameSpace, tableName))){// 2.创建Put对象Put put = new Put(Bytes.toBytes(rowKey));// 3.添加put属性put.addColumn(Bytes.toBytes(family),Bytes.toBytes(column),Bytes.toBytes(value));// 3.put数据table.put(put);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws Exception{Connection conn = getConnection();putCell(conn,"bigdata","student2","1001","info","name","zhangsan");putCell(conn,"bigdata","student2","1002","info","name","lisi");putCell(conn,"bigdata","student2","1003","info","name","wangwu");closeConnection(conn);
}

10.3.3 查询数据

public static void getCell(Connection conn, String nameSpace, String tableName, String rowKey, String family, String column) {// 1.获取tabletry (Table table = conn.getTable(TableName.valueOf(nameSpace, tableName))) {// 2.获取Get对象Get get = new Get(Bytes.toBytes(rowKey));// 3.添加get属性get.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));// 3.get数据// 简便用法// byte[] bytes = table.get(get).value();//String value = new String(bytes);// 复杂用法// 3.1 获取resultResult result = table.get(get);// 3.2 获取cellsCell[] cells = result.rawCells();// 3.3 遍历cellsString value = "";for (Cell cell : cells) {// 3.4 输出每个cellSystem.out.println(Bytes.toString(CellUtil.cloneQualifier(cell)) + ":" +Bytes.toString(CellUtil.cloneValue(cell)));}} catch (IOException e) {e.printStackTrace();}
}
public static void main(String[] args) throws Exception{Connection conn = getConnection();getCell(getConnection(), "bigdata", "student2", "1001", "info", "name");closeConnection(conn);
}

10.3.4 扫描数据

public static void scanRows(Connection conn,String nameSpace, String tableName, String startRow, String stopRow){TableName tableNameObj = TableName.valueOf(nameSpace, tableName);try (Table table = conn.getTable(tableNameObj)){Scan scan = new Scan();scan.withStartRow(Bytes.toBytes(startRow));scan.withStopRow(Bytes.toBytes(stopRow));ResultScanner resultScanner = table.getScanner(scan);for (Result result : resultScanner) {List<Cell> cells = result.listCells();for (Cell cell : cells) {System.out.println(Bytes.toString(result.getRow()) +":" +Bytes.toString(CellUtil.cloneQualifier(cell)) +":" +Bytes.toString(CellUtil.cloneValue(cell)));}}} catch (IOException e) {e.printStackTrace();}
}public static void main(String[] args) throws Exception{Connection conn = getConnection();scanRows(getConnection(), "bigdata", "student2", "1001", "1004");closeConnection(conn);
}

10.3.5 带过滤扫描

public static void scanRowsByFilter(Connection conn,String nameSpace, String tableName,String columnFamily,String column,String value,String startRow, String stopRow){TableName tableNameObj = TableName.valueOf(nameSpace, tableName);try (Table table = conn.getTable(tableNameObj)){Scan scan = new Scan();// 创建过滤器列表// 默认过滤所有,可以选择过滤出一个FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);// 列值过滤器  过滤出单列数据ColumnValueFilter columnValueFilter = new ColumnValueFilter(// 列族Bytes.toBytes(columnFamily),// 列名Bytes.toBytes(column),// 匹配规则  一般为相等  也可以是大于等于 小于等于CompareOperator.EQUAL,Bytes.toBytes(value));// 单列值过滤器// 过滤出符合添加的整行数据  结果包含其他列//注意:如果表中的一行数据没有查询的列,也会将这行数据查询出来SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(// 列族Bytes.toBytes(columnFamily),// 列名Bytes.toBytes(column),// 匹配规则  一般为相等  也可以是大于等于 小于等于CompareOperator.EQUAL,Bytes.toBytes(value));filterList.addFilter(columnValueFilter);filterList.addFilter(singleColumnValueFilter);// 可以设置多个  需放入到过滤器列表中scan.setFilter(filterList);scan.withStartRow(Bytes.toBytes(startRow));scan.withStopRow(Bytes.toBytes(stopRow));ResultScanner resultScanner = table.getScanner(scan);for (Result result : resultScanner) {List<Cell> cells = result.listCells();for (Cell cell : cells) {System.out.println(Bytes.toString(result.getRow()) +":" +Bytes.toString(CellUtil.cloneQualifier(cell)) +":" +Bytes.toString(CellUtil.cloneValue(cell)));}}} catch (IOException e) {e.printStackTrace();}
}public static void main(String[] args) throws Exception{Connection conn = getConnection();scanRowsByFilter(getConnection(), "bigdata", "student2","info","name","zhangsan" ,"1001", "1004");closeConnection(conn);
}

10.3.6 删除数据

public static void deleteColumn(Connection conn, String nameSpace, String tableName, String rowKey, String family, String column) {// 1.获取tabletry (Table table = conn.getTable(TableName.valueOf(nameSpace, tableName))) {// 2.创建Delete对象Delete delete = new Delete(Bytes.toBytes(rowKey));// 3.添加删除信息// 3.1 删除最新版本  标记为delete// delete.addColumn(Bytes.toBytes(family),Bytes.toBytes(column));// 3.2 删除所有版本  标记为DeleteColumn// delete.addColumns(Bytes.toBytes(family), Bytes.toBytes(column));// 3.3 删除指定列族     标记为deleteFamily// delete.addFamily(Bytes.toBytes(family));// 3.4 什么也不加 删除所有列族// 3.删除数据table.delete(delete);} catch (IOException e) {e.printStackTrace();}
}public static void main(String[] args) throws Exception{Connection conn = getConnection();deleteColumn(conn,"bigdata", "student2", "1001", "info", "name");closeConnection(conn);
}

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

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

相关文章

常用界面设计组件 —— 按钮组件、布局组件

2.4 按钮组件2.5 布局组件 2.4 按钮组件 QPushButton、QRadioButton 、QCheckBox都从 QAbstractButton&#xff0c;拥有一些共同的属性&#xff0c;如下图所 示&#xff1a; 图标使用setIcon()来设置&#xff0c;文本可以在构造函数或通过 setText()来设置。 可以使用 isCheck…

docker运行nginx不生效

docker运行nginx镜像时&#xff0c;设置端口映射&#xff0c;则只有该映射端口起作用&#xff0c;nginx配置的其他端口无效 监听端口 server {listen 8082;server_name ip地址;} server {listen 8083;server_name ip地址;}docker运行命令 docker run --name n…

探索人工智能的发展与影响

人工智能&#xff08;AI&#xff09;的快速发展正在深刻地改变着我们的生活和社会。从聊天机器人到自动驾驶汽车&#xff0c;AI的应用正日益广泛&#xff0c;为我们带来了前所未有的便利和创新。本文将深入探讨人工智能的发展历程、应用领域以及对社会的影响。 1. 人工智能的定…

【深度学习PyTorch简介】7.Load and run model predictions 加载和运行模型预测

Load and run model predictions 加载和运行模型预测 Load the model 加载模型 在本单元中&#xff0c;我们将了解如何加载模型及其持久参数状态和推理模型预测。 %matplotlib inline import torch import onnxruntime from torch import nn import torch.onnx as onnx impo…

CSS高级技巧导读

1&#xff0c;精灵图 1.1 为什么需要精灵图&#xff1f; 目的&#xff1a;为了有效地减少服务器接收和发送请求的次数&#xff0c;提高页面的加载速度 核心原理&#xff1a;将网页中的一些小背景图像整合到一张大图中&#xff0c;这样服务器只需要一次请求就可以了 1.2 精灵…

【WPF.NET开发】克隆打印机

本文内容 大多数企业有时会购买多台同一型号的打印机。 通常&#xff0c;这些打印机都安装了几乎相同的配置设置。 安装每台打印机既费时又容易出错。 使用 Microsoft .NET Framework 公开的 System.Printing.IndexedProperties 命名空间和 InstallPrintQueue 类可以立即安装从…

化妆-护肤品选购

粉底液 在下颚线涂抹 选择贴近肤色的 在选购时不能立即选购&#xff0c;而是涂抹后逛个街吃个饭&#xff0c;再看持久程度和服帖程度&#xff0c;所有粉底液都会脱妆 品牌 韩系品牌 VDL 韩系品牌偏光泽感(因为韩国人皮肤偏好) 所以一般会带有”亮泽“ “光感” 中国品牌 …

查看并解析当前jdk的垃圾收集器

概述&#xff1a;复习的时候&#xff0c;学看一下。 命令&#xff1a; -XX:PrintCommandLineFlags 打开idea&#xff0c;配置jvm 把上面命令输入jvm options中即可。 举例代码 这个代码的解析&#xff0c;我上篇文章有写&#xff0c;这个跟本文没有任何关系&#xff1a; …

C++--enum--枚举

C/C枚举类型&#xff1a; 不限定作用域的枚举类型 关键字&#xff1a;enum 声明枚举类型&#xff0c;然后可以用枚举类型来定义变量(如同结构体)&#xff1a; enum Color{white,black,yellow}; {注意分号} Color color_type; color_type 变量的值只限于枚举类型Color中的值 枚…

深度学习|RCNNFast-RCNN

1.RCNN 2014年提出R-CNN网络&#xff0c;该网络不再使用暴力穷举的方法&#xff0c;而是使用候选区域方法&#xff08;region proposal method&#xff09;创建目标检测的区域来完成目标检测的任务&#xff0c;R-CNN是以深度神经网络为基础的目标检测的模型 &#xff0c;以R-C…

Hikvision综合安防管理平台files;.css接口存在任意文件读取漏洞 附POC软件

免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Hikvisi…

MySQL 常规操作指南

1. 连接MySQL服务器 &#xff08;1&#xff09;通过命令行连接 mysql -u username -p在提示下输入对应用户的密码&#xff0c;即可进入MySQL命令行界面。 &#xff08;2&#xff09;指定数据库连接 mysql -u username -p -D database_name这里会直接连接到名为database_nam…

设计模式——1_6 代理(Proxy)

诗有可解不可解&#xff0c;若镜花水月勿泥其迹可也 —— 谢榛 文章目录 定义图纸一个例子&#xff1a;图片搜索器图片加载搜索器直接在Image添加组合他们 各种各样的代理远程代理&#xff1a;镜中月&#xff0c;水中花保护代理&#xff1a;对象也该有隐私引用代理&#xff1a;…

Jupyter Notebook安装使用教程

Jupyter Notebook 是一个基于网页的交互式计算环境&#xff0c;允许你创建和共享包含代码、文本说明、图表和可视化结果的文档。它支持多种编程语言&#xff0c;包括 Python、R、Julia 等。其应用场景非常广泛&#xff0c;特别适用于数据科学、机器学习和教育领域。它可以用于数…

vue element MessageBox.prompt this.$prompt组件禁止显示右上角关闭按钮,取消按钮,及点击遮罩层关闭

vue element MessageBox.prompt this.$prompt组件禁止或取消显示右上角关闭按钮&#xff0c;取消按钮&#xff0c;及点击遮罩层关闭 实现效果&#xff1a; 实现代码 MessageBox.prompt(请先完成手机号绑定, 系统提示, {confirmButtonText: 提 交,showClose: false,closeOnClic…

linux之安装配置VM+CentOS7+换源

文章目录 一、centos07安装二、CentOS 07网络配置2.1解决CentOS 07网络名不出现问题此博主的论文可以解决2.2配置&#xff08;命令: 【ip a】也可查看ip地址&#xff09; 三、使用链接工具链接CentOS进行命令控制四、换软件源 一、centos07安装 1、在vmvare中新建虚拟机 2、下…

Linux:动静态库的概念与制作使用

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容&#xff1f;小结 本篇要谈论的内容是关于动静态库的问题&#xff0c;具体的逻辑框架是建立在库的制作&#xff0c;库的使用&…

JavaFX增删改查其他控件

小技巧 增删改查思路 --查 底层select * from 表 where sname like %% --1.拿文本框的关键字 --2.调模糊查询的方法 myShow("") --删 底层 delete from tb_stu where sid? --1.想方设法拿学号 --1.先拿到用户所选中的学生对象 Student --2.调用方法传对象.getSi…

mysql INSERT数据覆盖现有元素(若存在)

INSERT...ON DUPLICATE KEY UPDATE的使用 如果指定了ON DUPLICATE KEY UPDATE&#xff0c;并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值&#xff0c;则会更新ON DUPLICATE KEY UPDATE关键字后面的字段值。 例如&#xff0c;如果列a被定义为UNIQUE&#xff0…

不要为了学习而学习

经常有朋友问我&#xff1a; 老师&#xff0c;从您这里学了很多方法&#xff0c;也一直想要改变自己&#xff0c;但总是没办法坚持下去&#xff0c;怎么办&#xff1f; 这个问题&#xff0c;我也很无奈啊。毕竟我也没办法飞到你身边&#xff0c;手把手把每一步都教给你。&…