【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL数据库)

news2024/11/24 21:05:06

在这里插入图片描述

🍺基于Python的Web服务器系列相关文章编写如下🍺:

  1. 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈
  2. 🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈
  3. 🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈
  4. 🎈【Web开发】Python实现Web服务器(Flask+Tornado+nginx)🎈
  5. 🎈【Web开发】Python实现Web服务器(Ubuntu下安装Flask)🎈
  6. 🎈【Web开发】Python实现Web服务器(Ubuntu下打包Flask)🎈
  7. 🎈【Web开发】Python实现Web服务器(Ubuntu下调试Flask)🎈
  8. 🎈【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL)🎈

文章目录

  • 1、简介
  • 2、安装
    • 2.1 安装MySQL数据库
    • 2.2 安装python
    • 2.3 安装flask库
    • 2.4 安装flask-sqlalchemy库
    • 2.5 安装pymysql库
    • 2.6 安装flask-mysqldb库
  • 3、代码测试
    • 3.1 测试一
    • 3.2 测试二
    • 3.3 测试三
    • 3.4 测试四
  • 结语

1、简介

本文介绍在ubuntu系统中如何配置python开发环境,数据库mysql安装和使用,以及使用flask框架进行web服务器的开发。

2、安装

2.1 安装MySQL数据库

打开终端执行 ”sudo apt-get install mysql-server“ 即可。

sudo apt-get update  #更新软件源

在这里插入图片描述
Ubuntu20.04中执行上述操作默认安装的mysql是8.0.21版本的。

sudo apt-get install mysql-server  #安装mysql

在这里插入图片描述在这里插入图片描述
想要验证 MySQL 服务器正在运行,输入:

sudo systemctl status mysql
# or
sudo systemctl status mysql.service

在这里插入图片描述

输入mysql --version可查询当前使用的mysql的版本;
输入mysql -V也可以查询当前使用的mysql的版本(注意是大写V)

mysql --version

在这里插入图片描述
使用mysql默认安装完成就启动了mysql。若无法启动,执行以下命令以启动MySQL服务器:

service mysql start
# or
sudo systemctl start mysql

确认是否启动成功,mysql节点处于LISTEN状态表示启动成功:

sudo netstat -tap | grep mysql

在这里插入图片描述
进入mysql shell界面:

# 如果安装过程中未提示设置密码,则使用mysql -u root命令进入
mysql -u root

# 如果安装过程中提示设置了密码,使用命令mysql -u root -p,
mysql -u root -p

# 查看mysql用户名和密码 
sudo cat /etc/mysql/debian.cnf

在这里插入图片描述

mysql -u debian-sys-maint -p Y08nwjHjazy2mS3e

在这里插入图片描述

以 root 用户身份登录 MySQL服务器,输入;

sudo mysql

在这里插入图片描述

为了提高MySQL安装的安全性,执行sudo mysql_secure_installation。
MySQL 安装文件附带了一个名为mysql_secure_installation的脚本,它允许你很容易地提高数据库服务器的安全性。
不带参数运行这个脚本:

sudo mysql_secure_installation

如果你想以 root 身份登录 MySQL 服务器,使用其他的程序,你有两个选择。
第一个就是将验证方法从auth_socket修改成mysql_native_password。你可以通过运行下面的命令实现:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

在这里插入图片描述
第二个选项,推荐的选项,就是创建一个新的独立管理用户,拥有所有数据库的访问权限:

create user 'tomcat'@'%' identified by '123456';
grant all on *.* to 'tomcat'@'%';
alter user 'tomcat'@'%' identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;

在这里插入图片描述
重新用新用户名登陆试试:

mysql -u tomcat -p

在这里插入图片描述
开放远程登录权限:
首先确认3306端口是否对外开放,mysql默认状态下是不开放对外访问功能的。查看方法如下:

netstat -an | grep 3306

在这里插入图片描述
从上面可以看出,mysql的3306端口只是监听本地连接127.0.0.1。我们做下修改,使其对外其他地址开放。
打开/etc/mysql/my.cnf文件:

vim /etc/mysql/my.cnf

找到bind-address = 127.0.0.1这一行,大概在47行,我们将它注释掉。
在这里插入图片描述
重启mysql服务,使配置生效:

/etc/init.d/mysql restart

在这里插入图片描述

  • 展示所有数据库:
mysql -hlocalhost -uroot -p
#或者
mysql -u root -p

show databases;

在这里插入图片描述

  • 创建数据库:
create database flask_db;
use flask_db;

在这里插入图片描述

2.2 安装python

(1)方法一使用apt安装:

sudo apt update
sudo apt install software-properties-common

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.9
python3.9 --version

(2)方法二通过源码安装:

sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
cd Python-3.9.0
 ./configure --enable-optimizations
make -j 12
sudo make altinstall
python3.9 --version
which python3.9
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1

sudo apt install python3-apt
cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-38-x86_64-linux-gnu.so apt_pkg.cpython-39-x86_64-linux-gnu.so

ln -s /usr/local/python3/bin/python3 /usr/bin/python3

2.3 安装flask库

具体内容请查看如下文章的相关介绍:
【Web开发】Python实现Web服务器(Ubuntu下安装Flask)

2.4 安装flask-sqlalchemy库

在Flask中使用mysql数据库,需要安装一个flask-sqlalchemy的扩展。
在Flask Web应用程序中使用原始SQL对数据库执行CRUD操作可能很繁琐。相反, SQLAlchemy ,Python工具包是一个强大的OR Mapper,它为应用程序开发人员提供了SQL的全部功能和灵活性。Flask-SQLAlchemy是Flask扩展,它将对SQLAlchemy的支持添加到Flask应用程序中。

pip install flask-sqlalchemy

在这里插入图片描述

2.5 安装pymysql库

pip install pymysql
  • demo1225_3.py:
# -*- coding: utf-8 -*-
# @File  : demo1225_3.py
# @author: tomcat
# @email : tomcat@163.com
# @Time  : 2022/12/25

from sqlalchemy import create_engine

# 数据库的配置变量
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mysql'
USERNAME = 'root'
PASSWORD = '123456'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'\
.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

# 创建数据库引擎
engine = create_engine(DB_URI)

# 创建连接
with engine.connect() as con:
    # rs = con.execute('select 1')
    rs = con.execute('select * from user')
    print(rs.fetchone())

在这里插入图片描述

  • 自动从数据库中映射:demo1225_4.py
# -*- coding: utf-8 -*-

from sqlalchemy import *
from sqlalchemy.ext.automap import automap_base

# 创建数据库引擎
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/mysql?charset=utf8mb4', echo=True)

# 自动映射
Base = automap_base()
Base.prepare(engine)

# 获取所有表的映射
tables = Base.classes.keys()
print(">>tables: ", tables)

# 可重新定义类名
MyUser = Base.classes.user

# 得到类中所有的属性
keys = MyUser.__table__.columns.keys()
print(">>keys: ", keys)

在这里插入图片描述

  • 主动创建映射:demo1225_5.py
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session

engine = create_engine('mysql+pymysql://root:123456@localhost:3306/flask_db?charset=utf8mb4', echo=True)
SessionFactory = sessionmaker(bind=engine)
session = scoped_session(SessionFactory)
Base = declarative_base(engine)

class Person(Base):
    __tablename__ = 't_person'
    id = Column(name='id', type_=Integer, primary_key=True, autoincrement=True)
    name = Column(name='name', type_=String(255))
    age = Column(name='age', type_=Integer)
    address = Column(String(255))
    country = Column(String(50))

# 删除表
Base.metadata.drop_all()
# 创建表
Base.metadata.create_all()

# 新增数据到表news中
a1 = Person(name='tom', age=22, address='桃花岛', country="大宋")
a2 = Person(name='lily', age=19, address='华山', country="大宋")
a3 = Person(name='kate', age=20, address='福威镖局', country="大宋")

print(a1,a2,a3)
session.add_all([a1,a2,a3])
session.commit()

在这里插入图片描述

show databases;
use flask_db;
show tables;
describe t_person;

在这里插入图片描述
在这里插入图片描述

2.6 安装flask-mysqldb库

(1)MySQLdb:MySQLdb是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip install mysqlpython。如果您用的是Python 2.x,请安装MySQLdb。

(2)pymysql:pymysql是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip3 install pymysql。如果您用的是Python 3,请安装pymysql。

(3)flask-mysqldb:要连接mysql数据库,还需要安装 flask-mysqldb

pip install flask-mysqldb

在这里插入图片描述

pip install pymysql

在这里插入图片描述
仍然安装失败,可能是因为没有安装libmysqld-dev和libmysqlclient-dev两个包:

sudo apt-get install libmysqld-dev
sudo apt-get install libmysqlclient-dev

在这里插入图片描述
再尝试安装flask-mysqldb:
在这里插入图片描述

3、代码测试

3.1 测试一

mysql -u tomcat -p 123456
show databases;
show tables;
use mysql;

编写测试脚本如下:

  • demo1225.py
from flask import Flask
from flask_mysqldb import MySQL

app = Flask(__name__)

# Required
app.config["MYSQL_USER"] = "tomcat"
app.config["MYSQL_PASSWORD"] = "123456"
app.config["MYSQL_DB"] = "mysql"
# Extra configs, optional:
app.config["MYSQL_CURSORCLASS"] = "DictCursor"
app.config["MYSQL_CUSTOM_OPTIONS"] = {"ssl": {"ca": "/path/to/ca-file"}}  # https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes

mysql = MySQL(app)

@app.route("/")
def users():
    cur = mysql.connection.cursor()
    cur.execute("""SELECT user, host FROM mysql.user""")
    rv = cur.fetchall()
    return str(rv)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

在这里插入图片描述

在这里插入图片描述

3.2 测试二

  • config.py
import os

class Config(object):
	HOSTNAME='127.0.0.1'
	PORT='3306'
	DATABASE='flask_db'
	USERNAME='root'
	PASSWORD='123456'
	DB_URI='mysql+pymysql://{username}:{password}@{host}:{port}/{db}'.format( username=USERNAME, password=PASSWORD, host=HOSTNAME, port=PORT, db=DATABASE )
	SQLALCHEMY_DATABASE_URI=DB_URI
	SQLALCHEMY_TRACK_MODIFICATIONS=True
	SQLALCHEMY_COMMIT_ON_TEARDOWN=True
	SQLALCHEMY_ECHO=True
  • demo1225_6.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

ROLE_USER = 0
ROLE_ADMIN = 1

class Student(db.Model):
    __tablename__='t_students'
    id = db.Column(db.Integer,primary_key = True)
    nickname = db.Column(db.String(64),index = True,unique = True)
    emial =db.Column(db.String(120),index = True, unique = True)
    #password = db.Column(db.String(128))
    role = db.Column(db.SmallInteger, default = ROLE_USER)

    def __repr__(self):
        return

with app.app_context():
    db.drop_all()
    db.create_all()

if __name__ == '__main__':
    user1 = Student(nickname='aaa', emial='456@163.com')
    user2 = Student(nickname='bbb', emial='123@126.com')

    with app.app_context():
        db.session.add_all([user1, user2]) 
        db.session.commit()

在这里插入图片描述

3.3 测试三

  • demo1225_7.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/flask_db'

#设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)

class Role(db.Model):
    # 定义表名
    __tablename__ = 't_roles'
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    us = db.relationship('User', backref='role')


class User(db.Model):
    __tablename__ = 't_users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True)
    pswd = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey('t_roles.id'))

if __name__ == '__main__':
    with app.app_context():
        db.drop_all()
        db.create_all()
    
        ro1 = Role(name='admin')
        ro2 = Role(name='user')
        db.session.add_all([ro1,ro2])
        db.session.commit()
        
        us1 = User(name='apple',email='aaa@163.com',pswd='123456',role_id=ro1.id)
        us2 = User(name='pear',email='bbb@189.com',pswd='abcded',role_id=ro2.id)
        us3 = User(name='banana',email='ccc@126.com',pswd='20221225',role_id=ro2.id)
        us4 = User(name='lemon',email='ddd@163.com',pswd='=-123abc',role_id=ro1.id)
        db.session.add_all([us1,us2,us3,us4])
        db.session.commit()
    
    app.run(debug=True)

在这里插入图片描述

# 返回名字等于wang的所有人
User.query.filter_by(name='banana').all()
# first()返回查询到的第一个对象
User.query.first()
# all()返回查询到的所有对象
User.query.all()
# filter模糊查询,返回名字结尾字符为g的所有数据。
User.query.filter(User.name.endswith('g')).all()
# get(),参数为主键,如果主键不存在没有返回内容
User.query.get()
# 逻辑非,返回名字不等于apple的所有数据。
User.query.filter(User.name!='apple').all()
# 逻辑与,需要导入and,返回and()条件满足的所有数据。
from sqlalchemy import and_
User.query.filter(and_(User.name!='apple',User.email.endswith('163.com'))).all()
# 逻辑或,需要导入or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='apple',User.email.endswith('163.com'))).all()
#查询数据后删除
user = User.query.first()
db.session.delete(user)
db.session.commit()
User.query.all()
#更新数据
user = User.query.first()
user.name = 'tree'
db.session.commit()
User.query.first()
#使用update
User.query.filter_by(name='apple').update({'name':'meat'})
#查询roles表id为1的角色
ro1 = Role.query.get(1)
#查询该角色的所有用户
ro1.us
#查询users表id为3的用户
us1 = User.query.get(3)
#查询用户属于什么角色
us1.role

3.4 测试四

  • demo1225_8.py
from flask import Flask,render_template,request,redirect
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

#设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/flask_db'

#定义模型
class City(db.Model):
    #表模型
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    provincename = db.Column(db.String(255))
    cityname = db.Column(db.String(255))
    usernumber = db.Column(db.Integer)


#查询所有数据
@app.route("/select")
def selectAll():
    cityList = City.query.order_by(City.id.desc()).all()
    return render_template("index.html",city_list = cityList)

@app.route('/')
def index():
    return selectAll()

#添加数据
@app.route('/insert',methods=['GET','POST'])
def insert():
    #进行添加操作
    province = request.form['province']
    cityname = request.form['city']
    number = request.form['number']
    city = City(provincename=province,cityname=cityname,usernumber=number)
    db.session.add(city)
    db.session.commit()
    #添加完成重定向至主页
    return redirect('/')

@app.route("/insert_page")
def insert_page():
    #跳转至添加信息页面
    return render_template("insert.html")


#删除数据
@app.route("/delete",methods=['GET'])
def delete():
    #操作数据库得到目标数据,before_number表示删除之前的数量,after_name表示删除之后的数量
    id = request.args.get("id")
    city = City.query.filter_by(id=id).first()
    db.session.delete(city)
    db.session.commit()
    return redirect('/')

#修改操作
@app.route("/alter",methods=['GET','POST'])
def alter():
    # 可以通过请求方式来改变处理该请求的具体操作
    # 比如用户访问/alter页面  如果通过GET请求则返回修改页面 如果通过POST请求则使用修改操作
    if request.method == 'GET':
        id = request.args.get("id")
        province = request.args.get("provincename")
        cityname = request.args.get("cityname")
        usernumber = request.args.get("usernumber")
        city = City(id = id,provincename=province,cityname=cityname,usernumber = usernumber)
        return render_template("alter.html",city = city)
    else:
        #接收参数,修改数据
        id = request.form["id"]
        province = request.form['province']
        cityname = request.form['city']
        number = request.form['number']
        city = City.query.filter_by(id = id).first()
        city.provincename = province
        city.cityname = cityname
        city.usernumber = number
        db.session.commit()
        return redirect('/')

if __name__ == "__main__":
    app.run(debug = True,host='0.0.0.0',port=5000)

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

在这里插入图片描述

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

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

相关文章

大数据-玩转数据-Kafka实战

一、kafka使用要点 要点一:Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,topic1,topic2。Topic即主题,通过对消息指定主题可以将消息分类&#…

工具-能写会看正则表达式【强烈建议收藏!】

正则表达式,很常用的一个技能点,但是一般的开发流程中都是这样的: 需要验证数据上网搜一下正则表达式CV 搞定!!!今天有时间回看了一下文档,简单整理了一下里面需要注意的点,并且通过分析几个常见的正则表达式,下次遇到正则争取不再只依靠 CV 大法! 基础部分 基本语法 …

初识指针(9)

目录 1、指针是什么? 2、指针和指针类型 1、指针- 整数 2、指针的解引用 3、野指针 1、野指针成因 2、如何规避野指针 4、指针运算 1、指针- 整数 2、指针- 指针 3、指针的关系运算 5、指针和数组 6、二级指针 7、指针数组 1、指针是什么?…

04-Hystrix

服务熔断Hystrix 1. Hystrix是什么 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库…

SpringBoot-2 读取properties;自动加载127个类原理总结;全部加载,按需配置

读取properties 方式一:非配置类填写:ComponentConfigurationProperties 1)建立bean: /只有在容器中的组件才拥有springboot提供的强大功能 Component ConfigurationProperties(prefix "mycar") public class Car {private Stri…

【机器学习】模型评估与选择

模型评估与选择 目录一、评估方法1、留出法2、交叉验证法3、自助法二、性能度量1、错误率与准确率2、查准率、查全率阈值对查准率、查全率的影响3、F1度量(基于查准率与查全率的调和平均)4、P-R Curve5、ROC CurvePRC和ROC的选用准则PRC和ROC的差异6、代…

python 中文转带音调的拼音

python 中文转带音调的拼音 前言python 中文转带音调的拼音1、1.1 安装pinyin模块1.2 试验1.3 效果图1.4 代码实现前言 今天整理中药材,每个药材上标上带音调的拼音,查了些,有的易形成乱码,如Shān Mi Dōnɡ,想到python自已动手转算了 python 中文转带音调的拼音 1、 …

(五)汇编语言——[bx]和loop指令

目录 [...]与(...) [...] (...) idata Loop指令 段前缀 总结 [...]与(...) [...] 这个我们其实见过,代表的是一个内存单元,段地址在DS中,偏移地址就是[bx]。 &am…

《图解TCP/IP》阅读笔记(第七章 7.4)—— RIP 路由信息协议

7.4 RIP RIP(Routing Information Protocol,路由信息协议),是一种距离向量算法,广泛用于LAN。 该协议将路由控制信息定期(30秒一次)向全网广播。如果没有收到路由控制信息,连接就会…

【1739. 放置盒子】

来源:力扣(LeetCode) 描述: 有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下: 你可以把盒子放在地板上的…

筛法(线性筛,厄拉多塞筛)

在前前前前前前…的博客中,我们主要谈了欧拉筛和埃氏筛. 今天我们主要来聊一聊线性筛和厄拉多塞筛(其实和埃氏筛和欧拉筛本质上没区别哎).其实在这两种筛法中厄拉多塞筛最好懂(就连本蒟蒻一看代码就明白了…别看这个名字,容易糊弄人) 首先是厄拉多塞筛"粉墨登场"::…

HRTransNet阅读理解

E. Dual-direction short connection fusion module HRFormer applies transformer blocks to enlarge receptive field of fused feature Frs, and uses exchange units to absorb the merits of multi-scales features. The process is described as: HRFormer使用TRM块来扩…

《教育的目的》笔记——如何让学生通过树木看见森林

目录 作者简介 个人感悟 经典摘录 1、学生所受的训练应该比他们最终投身的专业更为广泛 2、学习新语言用途 3、教师的责任 4、教育的主题 5、学到的有用之物 6、教育目的 7、所有事物都不是静态的、定型的,而是处于形成(becoming)过…

Merry Xmas | 用Matplotlib画个3D圣诞树送给你!~

1写在前面 Merry Christmas ! 🥳 过完圣诞就要跨年了,希望2023年自己可以一扫霉运,顺顺利利!!!😘 从网上抄了个英文的祝福语送给大家(主要是懒): 👇 I hope S…

【Unity】VideoPlayer实现视频播放

【Unity】VideoPlayer实现视频播放 背景:开发影院场景需要在荧幕上播放视频 环境:Unity2021.3 VideoPlayer的简单使用:http://t.csdn.cn/K8665 局限:上述方法会使得视频播放窗口强制在相机前; 需求:视频播…

怎么看懂单片机时序图?

本人没有上过单片机相关的专业课,是在《计算机系统结构》里遇见的时序图。由于看不懂加之老师没有专门讲,因此自行查阅了相关的视频和博客。(参考视频已放在文末) 网上资源贫瘠,不过我也不需要太过深入的知识。 大家…

spring事物使用示例及原理总结

目录 事务示例 示例一 示例二 示例三 示例四 示例五 示例六 事务原理 EnableTransactionManagement 执行代理对象目标方法 事务示例 示例一 在test()方法直接调用abc()方法,并在test()方法添加Transactional,test()和abc()方法分别会更新id…

力扣刷题笔记day10(树的子结构+二叉树镜像+对称的二叉树)

文章目录树的子结构题目思路代码二叉树镜像题目思路代码对称的二叉树题目思路代码树的子结构 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 题目 思路 dfs(A, B) …

二叉树经典算法题目

1.二叉树的前中后序遍历(简单) 省略 2.二叉树的深度(简单) 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 例如&a…

Biotin-PEG-MAL,Maleimide-PEG-Biotin,生物素聚乙二醇马来酰亚胺

英文名称:Biotin-PEG-MAL,Maleimide-PEG-Biotin 中文名称:生物素聚乙二醇马来酰亚胺 Biotin-PEG-Mal,聚乙二醇化生物素对亲和素或链霉亲和素有很高的亲和力。生物素/亲和素体系在生物分子检测和分离中有着广泛的应用。马来酰亚胺…