C++ 结合mysql写一个服务端

news2024/11/16 13:53:41

1 libhv和mysql

libhv是一个跨平台的C++网络库。

mysql是一个关系型数据库。

2 下载MySQL,

最好不要下载高版本的,容易出错!!!

下载地址MySQL

下载好后目录是这样的:

 然后在环境变量里配置:

验证,打开cmd窗口,输入mysql --version

3 C++里集成mysql和libhv

用的是visual studio,我下载的Mysql和libhv都是64位的,

 

模板:

#include "router.h"

#include "handler.h"
#include "hv/hthread.h"
#include "hv/hasync.h"     // import hv::async
#include "hv/requests.h"   // import requests::async

Router::Router()
{

}

Router::~Router()
{
	
}

void Router::Register(hv::HttpService& router) {
    // preprocessor => Handler => postprocessor
    router.preprocessor = Handler::preprocessor;
    router.postprocessor = Handler::postprocessor;
    // router.errorHandler = Handler::errorHandler;
    // router.largeFileHandler = Handler::sendLargeFile;

// 	router.POST("/dev", [](const HttpContextPtr& ctx) {
// 		// demo演示丢到hv::async全局线程池处理,实际使用推荐丢到自己的消费者线程/线程池
// 		hv::async([ctx]() {
// 			ctx->send(ctx->body(), ctx->type());
// 		});
// 		return 0;
// 	});
	// curl -v http://ip:port/login -H "Content-Type:application/json" -d '{"username":"admin","password":"123456"}'

    router.POST("/setValue", Handler::setValue);

    router.GET("/getValue", Handler::getValue);

	router.POST("/login", Handler::login);
	
	router.POST("/dev", Handler::DeviceManage);



    // curl -v http://ip:port/data
    router.GET("/data", [](HttpRequest* req, HttpResponse* resp) {
        static char data[] = "0123456789";
        return resp->Data(data, 10 /*, false */);
    });

    // curl -v http://ip:port/html/index.html
    router.GET("/html/index.html", [](HttpRequest* req, HttpResponse* resp) {
        return resp->File("html/index.html");
    });

    // curl -v http://ip:port/paths
    router.GET("/paths", [&router](HttpRequest* req, HttpResponse* resp) {
        return resp->Json(router.Paths());
    });

    // curl -v http://ip:port/get?env=1
    router.GET("/get", [](HttpRequest* req, HttpResponse* resp) {
        resp->json["origin"] = req->client_addr.ip;
        resp->json["url"] = req->url;
        resp->json["args"] = req->query_params;
        resp->json["headers"] = req->headers;
        return 200;
    });

    // curl -v http://ip:port/service
    router.GET("/service", [](const HttpContextPtr& ctx) {
        ctx->setContentType("application/json");
        ctx->set("base_url", ctx->service->base_url);
        ctx->set("document_root", ctx->service->document_root);
        ctx->set("home_page", ctx->service->home_page);
        ctx->set("error_page", ctx->service->error_page);
        ctx->set("index_of", ctx->service->index_of);
        return 200;
    });

    // curl -v http://ip:port/echo -d "hello,world!"
    router.POST("/echo", [](const HttpContextPtr& ctx) {
        return ctx->send(ctx->body(), ctx->type());
    });

    // wildcard *
    // curl -v http://ip:port/wildcard/any
    router.GET("/wildcard*", [](HttpRequest* req, HttpResponse* resp) {
        std::string str = req->path + " match /wildcard*";
        return resp->String(str);
    });

    // curl -v http://ip:port/async
    router.GET("/async", [](const HttpRequestPtr& req, const HttpResponseWriterPtr& writer) {
        writer->Begin();
        writer->WriteHeader("X-Response-tid", hv_gettid());
        writer->WriteHeader("Content-Type", "text/plain");
        writer->WriteBody("This is an async response.\n");
        writer->End();
    });

    // curl -v http://ip:port/www.*
    // curl -v http://ip:port/www.example.com
    router.GET("/www.*", [](const HttpRequestPtr& req, const HttpResponseWriterPtr& writer) {
        HttpRequestPtr req2(new HttpRequest);
        req2->url = req->path.substr(1);
        requests::async(req2, [writer](const HttpResponsePtr& resp2){
            writer->Begin();
            if (resp2 == NULL) {
                writer->WriteStatus(HTTP_STATUS_NOT_FOUND);
                writer->WriteHeader("Content-Type", "text/html");
                writer->WriteBody("<center><h1>404 Not Found</h1></center>");
            } else {
                writer->WriteResponse(resp2.get());
            }
            writer->End();
        });
    });

    // curl -v http://ip:port/sleep?t=1000
    router.GET("/sleep", Handler::sleep);

    // curl -v http://ip:port/setTimeout?t=1000
    router.GET("/setTimeout", Handler::setTimeout);

    // curl -v http://ip:port/query?page_no=1\&page_size=10
    router.GET("/query", Handler::query);

    // Content-Type: application/x-www-form-urlencoded
    // curl -v http://ip:port/kv -H "content-type:application/x-www-form-urlencoded" -d 'user=admin&pswd=123456'
    router.POST("/kv", Handler::kv);

    // Content-Type: application/json
    // curl -v http://ip:port/json -H "Content-Type:application/json" -d '{"user":"admin","pswd":"123456"}'
    router.POST("/json", Handler::json);

    // Content-Type: multipart/form-data
    // bin/curl -v http://ip:port/form -F 'user=admin' -F 'pswd=123456'
    router.POST("/form", Handler::form);

    // curl -v http://ip:port/test -H "Content-Type:application/x-www-form-urlencoded" -d 'bool=1&int=123&float=3.14&string=hello'
    // curl -v http://ip:port/test -H "Content-Type:application/json" -d '{"bool":true,"int":123,"float":3.14,"string":"hello"}'
    // bin/curl -v http://ip:port/test -F 'bool=1' -F 'int=123' -F 'float=3.14' -F 'string=hello'
    router.POST("/test", Handler::test);

    // Content-Type: application/grpc
    // bin/curl -v --http2 http://ip:port/grpc -H "content-type:application/grpc" -d 'protobuf'
    router.POST("/grpc", Handler::grpc);

    // RESTful API: /group/:group_name/user/:user_id
    // curl -v -X DELETE http://ip:port/group/test/user/123
    router.Delete("/group/:group_name/user/:user_id", Handler::restful);
    // router.Delete("/group/{group_name}/user/{user_id}", Handler::restful);

    // curl -v http://ip:port/upload?filename=LICENSE -d '@LICENSE'
    // curl -v http://ip:port/upload -F 'file=@LICENSE'
    router.POST("/upload", Handler::upload);
    // curl -v http://ip:port/upload/README.md -d '@README.md'
    router.POST("/upload/{filename}", Handler::recvLargeFile);

    // SSE: Server Send Events
    // @test html/EventSource.html EventSource.onmessage
    router.GET("/sse", Handler::sse);
}

实践

/**
* 2022/11/4 与电脑客户端交互
*/

int Handler::setValue(HttpRequest* req, HttpResponse* resp) {

  //拿到数据 存入数据库
   cout << req->body << endl;
   if (req->content_type != APPLICATION_JSON) {
       return response_status(resp, HTTP_STATUS_BAD_REQUEST);
   }
   resp->content_type = APPLICATION_JSON;
   hv::Json jsonData = req->GetJson();
   string jsonStr = jsonData.dump();
   cout << jsonStr << endl;

   Json::Value  rValue;
   Json::Reader reader;

   if (!reader.parse(jsonStr.c_str(), rValue)) {
       resp->SetBody("0");
       return 0;
   }

   
   string SOC_IP = rValue["data"]["SOC_IP"].asString();
   string SOC_MAC = rValue["data"]["SOC_MAC"].asString();
   string NXP_IP = rValue["data"]["NXP_IP"].asString();
   string NXP_MAC = rValue["data"]["NXP_MAC"].asString();
   string NXP_VERSION = rValue["data"]["NXP_VERSION"].asString();
   string HISI_IP = rValue["data"]["HISI_IP"].asString();
   string HISI_MAC = rValue["data"]["HISI_MAC"].asString();
   string FPGA_VERSION = rValue["data"]["FPGA_VERSION"].asString();
   string HISI_VERSION = rValue["data"]["HISI_VERSION"].asString();
   string FACTORY_NAME = rValue["data"]["FACTORY_NAME"].asString();
   string BARCODE = rValue["data"]["BARCODE"].asString();
   string MANUFACTRING_DATE = rValue["data"]["MANUFACTRING_DATE"].asString();
   string ASSAMBLY_DATE = rValue["data"]["ASSAMBLY_DATE"].asString();

 

   deviceStruct deviceStruct;
   deviceStruct.SOC_IP = SOC_IP;
   deviceStruct.SOC_MAC = SOC_MAC;
   deviceStruct.NXP_IP = NXP_IP;
   deviceStruct.NXP_MAC = NXP_MAC;
   deviceStruct.NXP_VERSION = NXP_VERSION;
   deviceStruct.HISI_IP = HISI_IP;
   deviceStruct.HISI_MAC = HISI_MAC;
   deviceStruct.FPGA_VERSION = FPGA_VERSION;
   deviceStruct.HISI_VERSION = HISI_VERSION;
   deviceStruct.FACTORY_NAME = FACTORY_NAME;
   deviceStruct.BARCODE = BARCODE;
   deviceStruct.MANUFACTRING_DATE = MANUFACTRING_DATE;
   deviceStruct.ASSAMBLY_DATE = ASSAMBLY_DATE;


   if (mySqlObj.InsertData(deviceStruct, "deviceTable")) {
       resp->SetBody("1");
   }
   else
   {
       resp->SetBody("0");
   }
  
    return 200;
    
}
/** 
* 2022/11/4 与APP交互  与电脑端查询接口交互
*/
    int Handler::getValue(HttpRequest* req, HttpResponse* resp) {

    //取出传入的code值 遍历数据库找到返回json 未找到返回未找到
    std::map<std::string, std::string>::const_iterator it = req->query_params.begin();
    req->query_params.size();
    for (; it != req->query_params.end(); it++)
    {
        cout << "key=" << it->first << "  value=" << it->second << endl;
        //查询到
        deviceStruct devStruct = {""};
        if (mySqlObj.QueryDatabase1(it->second, devStruct))
        {
            //组成json 发出去
            Json::Value rValue;
            rValue["SOC_IP"] = Json::Value(devStruct.SOC_IP);
            rValue["SOC_MAC"] = Json::Value(devStruct.SOC_MAC);
            rValue["NXP_IP"] = Json::Value(devStruct.NXP_IP);
            rValue["NXP_MAC"] = Json::Value(devStruct.NXP_MAC);
            rValue["NXP_VERSION"] = Json::Value(devStruct.NXP_VERSION);
            rValue["HISI_IP"] = Json::Value(devStruct.HISI_IP);
            rValue["HISI_MAC"] = Json::Value(devStruct.HISI_MAC);
            rValue["FPGA_VERSION"] = Json::Value(devStruct.FPGA_VERSION);
            rValue["HISI_VERSION"] = Json::Value(devStruct.HISI_VERSION);
            rValue["FACTORY_NAME"] = Json::Value(devStruct.FACTORY_NAME);
            rValue["BARCODE"] = Json::Value(devStruct.BARCODE);
            rValue["MANUFACTRING_DATE"] = Json::Value(devStruct.MANUFACTRING_DATE);
            rValue["ASSAMBLY_DATE"] = Json::Value(devStruct.ASSAMBLY_DATE);
           


            string str = Json::FastWriter().write(rValue);
            resp->SetBody(str);

            cout << str << endl;
        }
        else {
            //查询不到
            resp->SetBody("0");
        }
      
    }
    
    
    return 632222222;
}

数据库操作:


#include <stdio.h>  
#include <WinSock.h>  //一定要包含这个 
#include "define.h"

#include <Windows.h>  
#include "mysqlSelf.h"
//包含附加依赖项,也可以在工程--属性里面设置 
#pragma comment(lib,"wsock32.lib") 
#pragma comment(lib,"libmysql.lib")




CMySqlSelf::CMySqlSelf()
{
	init();
}

CMySqlSelf::~CMySqlSelf()
{
	FreeConnect();
}

void CMySqlSelf::init()
{
	ConnectDatabase();
	CreateTable();
	

	
	return;
}




/**
* 创建表
*/
bool CMySqlSelf::CreateTable() 
{
	int ret = 0;
	string strSql = "CREATE TABLE if not exists deviceTable(ID INT auto_increment primary key,SOC_IP VARCHAR(255), SOC_MAC VARCHAR(255), NXP_IP VARCHAR(255), NXP_MAC VARCHAR(255), NXP_VERSION VARCHAR(255), HISI_IP VARCHAR(255), HISI_MAC VARCHAR(255), FPGA_VERSION VARCHAR(255), HISI_VERSION VARCHAR(255),FACTORY_NAME VARCHAR(255),BARCODE VARCHAR(255),MANUFACTRING_DATE VARCHAR(255),ASSAMBLY_DATE VARCHAR(255));";

	if (mysql_query(&mysql, strSql.c_str())) {
		printf("Create failed (%s)", mysql_error(&mysql));
		return false;
	}
	else
	{
		printf("Create sucess");
	}
}


/**
* 连接数据库
*/
bool CMySqlSelf::ConnectDatabase() {
	//初始化mysql
	mysql_init(&mysql);
	
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8");
	mysql_options(&mysql, MYSQL_INIT_COMMAND, "SET NAMES utf8");


	const char host[] = "127.0.0.1";
	const char user[] = "root";
	const char psw[] = "123456";
	const char table[] = "scantools";
	const int port = 3306;

	//返回false则连接失败,返回true则连接成功  
	if (!(mysql_real_connect(&mysql, host, user, psw, table, port, NULL, 0)))
		//中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去  
	{
		printf("Error connecting to database:%s", mysql_error(&mysql));

			return false;
	}
	else
	{
		printf("connect");
		return true;
	}
}

/**
* 释放资源
*/
void CMySqlSelf::FreeConnect() {
	mysql_free_result(res); //释放一个结果集合使用的内存。
	mysql_close(&mysql);	 //关闭一个服务器连接。
}


/*
* 转码
*/
string BitStrToStr(string bstr) {
	string str = "";
	//每八位转化成十进制,然后将数字结果转化成字符
	int sum;
	for (int i = 0; i < bstr.size(); i += 8)
	{
		sum = 0;
		for (int j = 0; j < 8; j++)
			if (bstr[i + j] == '1')
				sum = sum * 2 + 1;
			else
				sum = sum * 2;
		str = str + char(sum);
	}
	return str;

}


/**
* 插入
*/
bool CMySqlSelf::InsertData(deviceStruct info,string tableName) {


	char strSql[1024 * 1024] = { 0 };
	sprintf(strSql,
		"INSERT INTO devicetable(SOC_IP,SOC_MAC,NXP_IP,NXP_MAC,NXP_VERSION,HISI_IP,HISI_MAC,FPGA_VERSION,HISI_VERSION,FACTORY_NAME,BARCODE,MANUFACTRING_DATE,ASSAMBLY_DATE)VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
		info.SOC_IP.c_str(),
		info.SOC_MAC.c_str(),
		info.NXP_IP.c_str(),
		info.NXP_MAC.c_str(),
		info.NXP_VERSION.c_str(),
		info.HISI_IP.c_str(),
		info.HISI_MAC.c_str(),
		info.FPGA_VERSION.c_str(),
		info.HISI_VERSION.c_str(),
		info.FACTORY_NAME.c_str(),
		info.BARCODE.c_str(),
		info.MANUFACTRING_DATE.c_str(),
		info.ASSAMBLY_DATE.c_str());

	printf(strSql);


	if (mysql_query(&mysql, strSql))        
	{
		printf("m_query failed (%s)", mysql_error(&mysql));
			return false;
	}
	else
	{
		printf("Insert success");
			return true;
	}
}





/**
* 查询
*/
string  dbValue(MYSQL_ROW col, int  index)
{
	if (col[index])
	{
		return  col[index];
	}
	return "";
}

bool CMySqlSelf::QueryDatabase1(string s, deviceStruct& devStruct) {

	memset(m_query, 0, 150);
	s = "select * from deviceTable where BARCODE = " + s;
	//s = "select * from deviceTable";
	memcpy(m_query, s.c_str(), sizeof(s));//写insert语句
	if (mysql_query(&mysql, m_query)){
		printf("Query failed (%s)", mysql_error(&mysql));
			return false;
	}
	else
	{
		printf("Query success");
	}
	//获取结果集  
	res = mysql_store_result(&mysql);
	if (!res)    //获得sql语句结束后返回的结果集  
	{
		printf("Couldn't get result from %s", mysql_error(&mysql));
			return false;
	}

	int  index = 1;
	while (column = mysql_fetch_row(res))   //在已知字段数量情况下,获取并打印下一行  
	{
		
		devStruct.SOC_IP = dbValue(column, index++);
		devStruct.SOC_MAC = dbValue(column, index++);
		devStruct.NXP_IP = dbValue(column, index++);
		devStruct.NXP_MAC = dbValue(column, index++);
		devStruct.NXP_VERSION = dbValue(column, index++);
		devStruct.HISI_IP = dbValue(column, index++);
		devStruct.HISI_MAC = dbValue(column, index++);
		devStruct.FPGA_VERSION = dbValue(column, index++);
		devStruct.HISI_VERSION = dbValue(column, index++);
		devStruct.FACTORY_NAME = dbValue(column, index++);
		devStruct.BARCODE = dbValue(column, index++);
		devStruct.MANUFACTRING_DATE = dbValue(column, index++);
		devStruct.ASSAMBLY_DATE = dbValue(column, index++);

	
	//	printf("%10s	%10s	%10s	%10s", column[0], column[1], column[2], column[3]);  //column是列数组  
	}
	return true;
}


数据字段定义了一个结构体:

//结构体
struct deviceStruct
{
	string SOC_IP;
	string SOC_MAC;
	string NXP_IP;
	string NXP_MAC;
	string NXP_VERSION;
	string HISI_IP;
	string HISI_MAC;
	string FPGA_VERSION;
	string HISI_VERSION;
	string FACTORY_NAME;
	string BARCODE;
	string MANUFACTRING_DATE;
	string ASSAMBLY_DATE;
}

mysql可视化工具用的是navicat,数据库里的信息如下:

 

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

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

相关文章

Hive 3.1.3

1.下载安装包 Index of /hive/hive-3.1.3https://dlcdn.apache.org/hive/hive-3.1.3/ 2.安装&修改配置文件 2.1 安装MySQL a. 搜索centos7默认的mariadb & 卸载 [root@node1 ~]# rpm -qa | grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 卸载 [r…

【计算机组成原理Note】5.4.2 控制器-微程序

5.4.2 控制器-微程序 硬布线工作原理&#xff1a;微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序&#xff0c;即时产生微程序工作原理&#xff1a;事先把微操作控制信号存储在一个专门的存储器(控制存储器)中&#xff0c;将每一条机器指令编写成一个微程序&#xf…

差钱吗?周杰伦线上演唱会没关打赏惹争议,看看同时直播的腾格尔

随着世界杯的到来&#xff0c;全球都进入了世界杯时间&#xff0c;音乐领域的明星们&#xff0c;都以各种形式欢迎世界杯的到来。在世界杯开幕的前一晚上&#xff0c;著名音乐人周杰伦&#xff0c;在某手平台开启了线上演唱会&#xff0c;吸引了众多人前来围观。 据不完全统计&…

【正点原子FPGA连载】 第七章 Verilog HDL语法 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第七章 Verilog …

【计组】入门篇 --《深入浅出计算机组成原理》

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 目录 一、为什么需要学习计算机组成原理 二、冯诺依曼体系结构&#xff1a;计算机组成的金字塔 1、计算机的基本硬件组成 2、冯诺依曼体系结构 三、通过CPU主频谈性能 1、什么是性能 2、计算…

【微信早安定时推送消息】微信公众号定时推送早安消息 带天气、纪念日、生日、定时推送等(完整代码)

我挥舞着键盘和本子&#xff0c;发誓要把世界写个明明白白。 简介 利用所学知识给他/她一个惊喜&#xff0c;是作为计算机专业的你最大的乐趣。 无计算机基础&#xff0c;5分钟即设置好 &#xff08;定时推送 及 最新版 将在下期带来&#xff09; 获取完整代码&#xff0c;关注…

性能测试怎么做?性能测试重点和各项性能测试流程(超级详细)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 性能测试基础 1&am…

【设计模式】过滤器模式(Filter Pattern)

过滤器模式属于结构型模式&#xff0c;但它并不属于我们常说的二十三种设计模式。主要是以相对解耦的方式来过滤一组对象。 文章目录过滤器模式的介绍优点应用场景过滤器模式的使用类图实现方法第一步&#xff0c;创建员工类第二步&#xff0c;创建过滤器接口第三步&#xff0c…

如何部署商城项目

如何部署商城项目 1.导入数据库 ​ 注意&#xff1a;先保证数据库开启了远程访问&#xff08;见数据库安装和配置笔记&#xff09;。 1.1设置数据库服务器编码 ​ vi /etc/my.cnf ​ 在[mysqld]下面添加 character_set_serverutf8 init_connectSET NAMES utf81.2打开本地…

RK3399平台开发系列讲解(中断篇)中断控制器(Generic Interrupt Controller)

🚀返回专栏总目录 文章目录 一、GIC硬件的实现形态二、主要的功能块三、中断类型四、中断状态沉淀、分享、成长,让自己和他人都能有所收获!😄 📢外围设备不是把中断请求直接发给处理器,而是发给中断控制器,由中断控制器转发给处理器。ARM公司提供了一种标准的中断控制…

NR CSI(二) the workflow of CSI report

微信同步更新欢迎关注同名modem协议笔记 本篇内容是对CSI report相关流程的整理&#xff0c;其描述主要集中在R16 38.331 38.321 38.214中&#xff0c;以实网中的一个配置开始&#xff0c;看下相关定义。 如上图实网中的配置&#xff0c;CSI-ReportConfig 对应的就是Reporting…

Cookie和Session的工作流程是什么样的?5min学懂:简易用户登录(前端+后端+数据库)

目录 前言 一、Cookie 1.1、Cookie从哪里来&#xff1f; 1.2、Cookie到哪里去&#xff1f; 二、Session 2.1、什么是sessionId? 三、Cookie和Session的区别 四、Cookie和Session的具体工作流程 五、代码实现用户登录 5.1、核心方法 5.2、代码 前言 想要了解Cookie和…

【设计模式】桥接模式(Bridge Pattern)

桥接模式属于结构型模式&#xff0c;主要解决因业务增长时滥用继承而导致的**“类爆炸”问题。桥接模式将一个树型的整体继承结构替换为由抽象的类&#xff08;抽象化角色&#xff09;组成的抽象部分和由实现接口&#xff08;实现化角色&#xff09;与实现类&#xff08;具体实…

无法访问mybatis.dto.StudengInVO-使用maven编译报错

一、问题由来 最近一次拉代码后&#xff0c;合并代码然后进行编译时出现一个问题&#xff0c;使用maven在进行编译的时候报一个错&#xff0c;无法访问mybatis.dto.StudengInVO。 突然出现这个错误让自己感觉很奇怪&#xff0c;开发工具已经使用了好几个月&#xff0c;项目也已…

SSM毕设项目 - 基于SSM的汉服文化平台网站(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的汉服文化…

(十三)Spring之JdbcTemplate

文章目录环境新增、删除与修改数据新增修改删除查询一个查询一个对象查询一个值查询多个对象批量操作批量添加批量修改批量删除使用回调函数使用德鲁伊连接池上一篇&#xff1a;&#xff08;十二&#xff09;Spring IoC注解式开发JdbcTemplate是Spring提供的一个JDBC模板类&…

高阶数据结构:二叉搜索树

本篇主要是在初级数据结构中介绍的二叉树的提升&#xff0c;了解二叉搜索树的特性。 文章目录 一、二叉搜索树的概念二、二叉搜索树操作 1、二叉搜索树的查找2、二叉搜索树的插入3、二叉搜索树的删除三、二叉搜索树的实现四、二叉搜索树的应用五、关于二叉树进阶面试题一、二叉…

大衣哥又有喜事了,孟文豪新作《克什克腾的眼泪》,是给他写的吗

农民歌唱家大衣哥又出新歌啦&#xff01; 就在大衣哥被谷传民起诉不久&#xff0c;互联网上面又传出新消息&#xff0c;继《火火的情怀》之后&#xff0c;大衣哥的新歌《新时代的新农民》&#xff0c;又要和大家见面了。很多人不明白&#xff0c;大衣哥不过是一个农民歌唱家&am…

Java中的反射,枚举和Lambda表达式

一. 反射 1. 反射的概述 2. 反射的使用 反射常用的类 通过反射获取Class对象 获得Class类相关的方法 使用反射创建实例对象 使用反射获取实例对象中的构造方法 通过反射获取实例对象的属性 通过反射获取实例对象的方法 3. 反射的优缺点 二. 枚举 1…

Graalvm 安装和静态编译

文章目录1、下载2、graalvm安装3、native-image工具安装3.1 安装native-image3.2 安装C编译工具4、java编译成二进制exe4.1、普通的java命令行应用4.2、Swing应用编译4.3、使用maven插件静态编译4.4、javafx应用编译1、下载 文件下载&#xff1a;https://www.graalvm.org/down…