框架 +【Mybatis】概述 以及 基础环境搭建

news2024/9/25 13:22:17

目录

什么是框架?

java后端框架包括

Mybatis概述

1、背景介绍

2、mybatis介绍

Mybatis环境搭建

1.创建一个maven项目

2.导入mysql数据库驱动包

   导入mybatis依赖的jar包

3.创建一个全局的mybatis配置文件 

4.创建数据库,创建表,准备数据

5.创建一个访问接口,定义方法

6.创建接口对应的映射文件,编写sql

创建完sql映射文件后还需要再全局配置文件中进行配置:

7.测试Mybatis

搭建补充:

1、安装一个MybatisX核心全局配置文件

2、数据库链接池

参数传递

1、单个参数

直接传递

2、多个参数

使用@Param(“id”)注解绑定

传入复杂的对象,需要使用parameterType参数进行类型定义。

Mybatis基础操作---增删改查

1、增加insert

2、删除delete

3、修改update

4、查找select

#{}和${}区别

1、底层实现不同

2、使用场景不同

单元测试

数据库事务

   1、简介

关联查询

1、直接多表关联査询出我们需要的数据

2、 嵌套查询,先查询主表(学生表)

对象映射

特殊符号处理

1、在 mybatis 中的 xml 文件,一些特殊符号需要转译:

2、使用   

数据缓存

什么是缓存? 

1、mybatis一级缓存

2、mybatis二级缓存

二级缓存的特点包括:


什么是框架?

框架就是对技术的封装,将基础的技术进行封装,让程序员可以快速的使用,提高开发效率。

java后端框架包括

mybatis

            对jdbc进行封装

spring

           对整个java后端架构进行管理的

springweb

           对web层(servlet)进行封装

springboot

            对spring框架的搭建进行封装

Mybatis概述

1、背景介绍

mybatis原来是Apache下面的一个开源项目,名为ibayis.

2010年开发团队转移到谷歌旗下,改名为mybatis.

2、mybatis介绍

Mybatis是一款优秀的数据持久层框架(dao层 数据访问层 数据持久层)

MyBatis对JDBC进行封装,MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及手动映射结果集的操作。

MyBatis将JDBC中的接口进行封装,提供它自己的类和接口实现。可以使用xml配置和注解的方式,将数据库中的记录自动映射到java对象中。

是一种ORM实现(对象关系映射)将可以自动将数据映射到对象中的这中框架,也称ORM框架

mybatis还提供了动态sql和数据缓存

Mybatis环境搭建

1.创建一个maven项目

并在pom.xml文件中导入Mybatis所依赖的jar包,由于Mybatis是对JDBC代码进行了封装,所以还需要导入mysql数据库驱动包。

2.导入mysql数据库驱动包

        <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.16</version>
        </dependency>

   导入mybatis依赖的jar包

        <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.4.2</version>
        </dependency>

3.创建一个全局的mybatis配置文件 

右键resources目录,选择File,创建一个xml文件,此文件用来写Mybatis全局配置相关的代码,如图所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <!--配置数据库连接相关信息-->
    <environments default="development"><!--work-->
        <environment id="development">
            <!--Mybatis手动提交,JDBC自动提交-->
            <transactionManager type="JDBC"/>
            <!--type="POOLED" 使用数据库链接池功能,默认创建了10个链接对象,减少频繁创建的链接对象-->
            <dataSource type="POOLED">
                <!--数据库链接配置-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai" />
                <property name="username" value="root" />
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

➱注意将参数修改为自己的数据库连接信息

4.创建数据库,创建表,准备数据
5.创建一个访问接口,定义方法

6.创建接口对应的映射文件,编写sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.AdminDao">
                                                                   <!-- keyProperty:类中的属性  keyColumn:数据库中的列-->
    <insert id="insertAdmin" parameterType="Admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
                              <!-- 数据库中的列名                      Admin对象中的属性-->
        insert into admin(account,password,gender) values (#{account},#{password},#{gender})</insert>

    <update id="updateAdmin" parameterType="Admin">
        update admin set account=#{account},password=#{password} where id=#{id}</update>

    <select id="findAdminById" parameterType="int" resultType="Admin">
           select * from admin where id = #{id} </select>

    <select id="login" resultType="Admin">
        select * from admin where account=#{acc} and password=#{pwd}</select>

    <select id="login1" parameterType="Admin" resultType="Admin">
        select * from admin where account=#{account} and password=#{password}</select>
<!--select count(*) from admin where id &lt; 10  -->
    <select id="findAdminCount" parameterType="int" resultType="int">
        select count(*) from admin where id <![CDATA[ < ]]> 10 </select>

    <select id="findAdmins" resultType="Admin" parameterType="string">
           select * from admin order by ${orderColumn} desc</select>

    <select id="findAdminid" resultType="java.lang.Integer">
           select id from admin where account=#{account}</select>

    <select id="findAdmins1" resultType="Admin" parameterType="string">
           select * from admin</select>


    <resultMap id="adminMap" type="Admin">
        <id column="adminid" property="id"></id>
        <result column="account" property="account"></result>
    </resultMap>
    <select id="findAdmin"  resultMap="adminMap">
        select id adminid,account from admin</select>

    <delete id="deleteAdmin" parameterType="int">
        delete from
                admin where id =#{id}</delete>

 </mapper>

创建完sql映射文件后还需要再全局配置文件中进行配置:

7.测试Mybatis

搭建补充:

1、安装一个MybatisX核心全局配置文件

2、数据库链接池

        链接数据库后,每次访问数据库时都要创建一个Connection连接对象,并且用完之后关闭。一旦访问量一大,每次都要创建新的连接对象,用完关闭,比较耗时

        使用数据库链接池,在池(集合)中事先创建一些连接对象,在用户访问时,就直接从池中获取一个链接对象,用完不销毁,还回到池中。这样就减少频繁创建销毁链接对象。

参数传递

三种方式

1、单个参数
直接传递

Admin findAdminById(int id);
2、多个参数
使用@Param(“id”)注解绑定

Admin login(@Param("acc")String account, @Param("pwd")String password);

 

传入复杂的对象,需要使用parameterType参数进行类型定义。

封装到对象中,通过对象中定义的属性传参。
Admin login1(Admin admin);//对象 

Mybatis基础操作---增删改查

1、增加insert
void insertAdmin(Admin admin);
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.AdminDao">

                                                                   <!-- keyProperty:类中的属性  keyColumn:数据库中的列-->
    <insert id="insertAdmin" parameterType="Admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
                              <!-- 数据库中的列名                      Admin对象中的属性-->
        insert into admin(account,password,gender) values (#{account},#{password},#{gender})
    </insert>


</mapper>
2、删除delete
void deleteAdmin(int id);
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.AdminDao">
         <delete id="deleteAdmin" parameterType="int">
    delete from
            admin where id =#{id}
         ​​​​​​​</delete>


</mapper>
3、修改update
void updateAdmin(Admin admin);
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.AdminDao">

         <update id="updateAdmin" parameterType="Admin">
        update admin set account=#{account},password=#{password} where id=#{id}
         </update>


</mapper>
4、查找select
List<Admin> findAdmins(@Param("orderColumn")String account);
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.AdminDao">

          <select id="findAdmins" resultType="Admin" parameterType="string">
           select * from admin order by ${orderColumn} desc
          </select>


</mapper>

#{}和${}区别

#{ }:是占位符,是采用预编译方式向sql中传值,可以防止sql注入,如果我们往sql中传值,使用#{},更加安全。

${ }:是当作字符串将内容直接拼接到sql语句中,一般不用于向sql中传值(给列赋值),一般用于向sql中动态的传递列名

select * from table order by ${列名} desc

1、底层实现不同

#{}:采用预编译方式,防止sql注入更加安全

${}:采用字符串拼接,直接将值拼接到sql中

2、使用场景不同

#{}:一般用于向sql 中的列传值

${}:一般用于向sql动态传递列名

例如:排序时 order by 后面的列名是可以改变。

例如:select 后面的列名也可以自由选择

单元测试

单元测试就是以方法为单位进行测试。

首先需要在maven项目的pom.xml文件中导入junit组件,然后在要测试的方法上添加@Test注解标签即可。

 <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>provided</scope>
        </dependency>

数据库事务

   1、简介

 数据库事务是数据库的一种管理的机制,是对一次链接数据库过程的管理。保证一次操作中,执行的多条sql,要么都成功执行,要么都不执行。

提交事务,数据库才会真正的在数据库执行这一次操作中的多条sql。

当我们的程序代码执行没有任何问题时,再向数据库发送提交事务操作,数据库真正执行sql,出现异常则不提交事务。
新增,修改,删除完毕后,都需要手动提交事务。(查询不需要)
public class Test3 {
    /*
        单元测试,程序员使用的测试方式,以方式为单位测试
        使用junit组件实现单元测试
     */

    //单元测试,以方法为单位,进行单元测试
    @Test
    public void insert(){
        Admin admin=new Admin();
        admin.setAccount("acc");
        admin.setPassword("125");
        admin.setGender("女");
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
                 adminDao.insertAdmin(admin);//保存数据后,我们需要立刻拿到这条数据在数据库的主键
                 sqlSession.commit();//提交数据库事务,当我们的程序代码执行没有任何问题时,再向数据库发送提交事务操作,数据库真正执行sql,出现异常则不提交事务
                                     // 新牌,修敌,删除完毕后,都需要手动提交事务。
                 sqlSession.close();
     }

}

关联查询

1、直接多表关联査询出我们需要的数据
Student findStudentById(int i);
public class TestStudent {

    @Test
    public void test1(){
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
        Student student=studentDao.findStudentById(2);
        System.out.println(student.getId());
        System.out.println(student.getName());
        System.out.println(student.getMajor().getName());
        sqlSession.close();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.StudentDao">


       <!--对关联查询到的学生信息进行自定义映射封装-->
    <resultMap id="studentMap" type="Student">
        <!--column是数据库  property是属性-->
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!--映射关联数据  专业名称-->
        <!--映射关联数据 首先会创建一个Major对象,然后将专业名称封装到Major对象,最后将Major对象封装到Student对象中-->
        <association property="major" javaType="Major">
            <result column="mname" property="name"></result>
        </association>
    </resultMap>

      <!--关联查询方式1: 直接多表关联査询出我们需要的数据-->
    <select id="findStudentById" resultMap="studentMap">
         select
             s.id,
             s.num,
             s.name,
             s.gender,
             m.name mname
           from student s inner join major m on m.id=s.majorid where s.id=#{id}
    </select>

</mapper>
2、 嵌套查询,先查询主表(学生表)
Student findStudentById1(int i);
public class TestStudent {
  @Test
    public void test3(){
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
        Student students=studentDao.findStudentById1(2);
        sqlSession.close();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件  主要写sql实现-->
<!--
     useGeneratedKeys="true":返回自增主键
     keyProperty="id":类中的属性
     keyColumn="id":数据库中的列
-->
<mapper namespace="com.ffyc.mybatispro.dao.StudentDao">
       关联查询方式2: 嵌套查询,先查询主表(学生表)-->
    <resultMap id="studentMap1" type="Student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!--封装关联表数据-->
        <association property="major" javaType="Major" select="findMajorById" column="majorid"></association>
    </resultMap>

    <select id="findStudentById1" resultMap="studentMap1">
        select id,num,name,gender,majorid from student where id=#{id}
    </select>

    <!--嵌套查询学生关联的专业   resultType="Major"  -->
    <select id="findMajorById" resultType="Major">
        select name from major where id=#{majorid}
    </select>

</mapper>

对象映射

如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到POJO对象中。

如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换。

查询单张表,自动将记录映射到对象中

多表关联查询  resultMap自定义映射。如图所示:

特殊符号处理

1、在 mybatis 中的 xml 文件,一些特殊符号需要转译:

特殊字符转译字符
<&It;
"&quot;
'&apos;
>&gt;
&&amp;

2、使用 <![CDATA[]]>  

通过 <![CDATA[ 特殊字符 ]]> 包裹特殊字符也可以

数据缓存

什么是缓存? 

缓存 (Cache):是一种用于临时存储数据的技术,将数据临时存储在内存中。

缓存的作用:让数据离我们的执行程序更近,让程序能够快速的获取到数据,减少对数据库的访问压力。

缓存的主要类型有:

              CPU缓存:处理器内置的缓存,分为L1、L2和L3级别,存储经常使用的指令和数据,减少处理器访问主内存的时间。

              硬盘缓存:硬盘驱动器内部的缓存,暂存读写数据,以提高数据传输速度。

              Web缓存:在浏览器或代理服务器中缓存网页内容,以减少网络请求次数,加快页面加载速度。

              数据库缓存:在数据库中使用缓存技术,存储查询结果,以加速数据库的响应时间。

➱ MyBatis 提供了一级缓存和二级缓存来提高数据库查询的性能。

1、mybatis一级缓存

       Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言

有缓存,查询流程:
     先从缓存中查询数据,缓存中如果没有,去数据库査询,査询到后把数据放到缓存中,下次直接从缓存中获取.
mybatis一级缓存
       mybatis一级缓存,默认是SqlSession级别的,在同一个SqlSession中查询到数据先缓存到SqlSession对象中,第二次査询数据时,先从Sqlsession中查询,如果有直接返回。没有,再去查询数据库。
 一级缓存生命周期: 
                开始于SqlSession 创建
                结束于SqlSession关闭,如果期间执行了新增,修改,删除操作也会清空当前sqlSession对象中缓存数据(防止脏读)
                调用 sqlSession.clearCache():强制清空一级缓存数据

一级缓存失效的情况:

  • sqlSession.close();
  • sqlSession.clearCache();
  • SqlSession 中执行了任何一个修改操作(update()、delete()、insert()) ,都会清空缓存的数据。

2、mybatis二级缓存

       二级缓存是SqlSessionFactory级别的,根据mapper的namespace划分区域的,相同namespace的mapper查询的数据缓存在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。

mybatis二级缓存
        二级缓存是SqlSessionFactory级别,可以让多个Sqlsession共享数据。
        mybatis默认没有开启二级缓存,使用时需要配置开启。

        如果开启了二级换成,当sqlsession关闭时,会将一级缓存中的数据,存储到二级缓存中.
        其他的sqlsession就可以二级缓存中查询到之前sqlsession查询的数据。

要开启二级缓存

需要进行以下步骤:

  1. 在 MyBatis 全局配置文件中的<settings>标签中配置开启二级缓存,设置cacheEnabledtrue(默认值就是true,也可以省略这一步)
  2. 在具体的 mapper.xml 文件中添加<cache/>标签
  3. 被缓存的 POJO(实体类)必须实现序列化接口(implements Serializable

 

二级缓存的特点包括:
  • mapper 映射文件中的所有 select 语句将会被缓存。
  • mapper 映射文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。
  • 如果在加入<cache>标签的前提下让个别 select 元素不使用缓存,可以使用useCache属性,设置为false。
  • 缓存默认使用最近最少使用(LRU)算法来收回。
  • 根据时间表,如noFlushInterval(没有刷新间隔),缓存不会以任何时间顺序来刷新。
  • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  • 缓存会被视为是可读/可写(read/write)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,不干扰其他调用者或线程所做的潜在修改。

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

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

相关文章

单图生成 2D 和 3D 人物,高质量图像处理模型 CharacterGen来啦!

CharacterGen引入了一个简化的生成流程和一个图像条件的多视图扩散模型。该模型有效地将输入姿态校准到规范形式&#xff0c;同时保留输入图像的关键属性&#xff0c;从而解决了多样化姿态带来的挑战。 CharacterGen的另一个核心组成部分是基于Transformer的、可泛化的稀疏视图…

httpx:一个神奇的 Python HTTP客户端

文章目录 httpx&#xff1a;一个神奇的 Python HTTP客户端1. 背景&#xff1a;为什么选择 httpx&#xff1f;2. httpx 是什么&#xff1f;3. 如何安装 httpx&#xff1f;4. 简单的库函数使用方法5. 场景应用6. 常见问题及解决方案7. 总结 httpx&#xff1a;一个神奇的 Python H…

第 8 章 数据的家——MySQL的数据目录

8.1 数据库和文件系统的关系 数据库把表存储在文件系统上。当我们读取数据时&#xff0c;存储引擎会从文件系统中把数据读出来返回给我们&#xff1b;当我们写入数据时&#xff0c;存储引擎会把这些数据写回文件系统。 8.2 MySQL数据目录 8.2.1 数据目录和安装目录的区别 数…

C++从入门到起飞之——list模拟实现 全方位剖析!

​ ​ ​ &#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 ​ ​1、list的整体框架 2、list迭代器 >整体分析 >整体框架 >成员函数 >运…

操作系统:实验六文件操作实验

一、实验目的 1、了解文件系统功能及实现原理。 2、掌握LINUX下文件操作的有关系统调用。 3、熟悉main函数带参数运行的有关操作过程。 4、通过模拟程序实现简单的一级文件系统或二级文件系统。 二、实验内容 1、编程显示文件自身。&#xff08;1分&#xff09; #includ…

分享两个方法分析python打包exe

在Python开发中&#xff0c;常常需要将Python脚本打包成独立的可执行文件&#xff0c;以便在没有Python环境的电脑上运行。你是否曾为此感到困惑&#xff0c;不知道该选择哪种工具来实现这一目标&#xff1f;其实&#xff0c;打包Python脚本并不难&#xff0c;关键在于选择合适…

Mybatis框架——缓存(一级缓存,二级缓存)

本章将简单介绍Mybatis框架中的缓存&#xff0c;欢迎大家点赞➕收藏&#xff0c;蟹蟹&#xff01;&#xff01;&#xff01;&#x1f495; &#x1f308;个人主页&#xff1a;404_NOT_FOUND &#x1f308;MyBatis环境搭建步骤&#xff08;超全解析&#xff01;&#xff01;&am…

AI写论文真的可靠吗?免费推荐6款AI论文写作助手

在当今的学术研究和写作领域&#xff0c;AI论文写作助手已经成为不可或缺的工具。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论文。以下是六款免费推荐的AI论文写作助手&#xff0c;包括千笔-aipasspaper&#xff0c;它们各自具有独特的功能和优势。…

【hot100篇-python刷题记录】【最小路径和】

R6-多维动态规划篇 好经典的dp题&#xff0c;纯粹的题。 多维动态规划无论是二维还是三维&#xff0c;无非是创建dp表&#xff0c;dp[][][][][][]即可 动态规划式子 dp[i][j]当前值min(dp[i][j-1],dp[i-1][j]) 边界问题处理&#xff1a;是否存在即可。哦对了好像不用这样&a…

探索异步之美:aiohttp库的魔力与奥秘

文章目录 探索异步之美&#xff1a;aiohttp库的魔力与奥秘背景&#xff1a;为何选择aiohttp&#xff1f;什么是aiohttp&#xff1f;如何安装aiohttp&#xff1f;简单函数使用方法场景应用常见Bug及解决方案总结 探索异步之美&#xff1a;aiohttp库的魔力与奥秘 背景&#xff1…

Linux教程七:文件目录类命令ls、cd(图文详解)

默认登录出现一个[用户localhost ~] 代表时登陆用户的家目录 1、 Linux ls命令 基本用法 ls&#xff1a;列出当前目录下的文件和目录&#xff08;不包括以.开头的隐藏文件&#xff09;。ls 目录名&#xff1a;列出指定目录下的文件和目录。 常用选项 -l&#xff1a;以长格式列出…

【Python 报错已解决】`TypeError: ‘method‘ object is not subscriptable`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在编程的世界里&#xff0c;我们经常会遇到各种报错&#xff0c;它们像隐藏在代码中的小怪兽&#xff0c;时不时跳出来给…

Java项目:基于SpringBoot+mysql在线拍卖系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SSM框架mysql在线拍卖系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐全、…

常见的性能测试方法!

前言 性能测试划分有很多种&#xff0c;测试方法也有很多种&#xff0c;更确切的说是由于测试方法的不同决定了测试划分的情况&#xff0c;但在测试过程中性能测试的划分没有绝对的界限&#xff0c;常用的有压力测试、负载测试和并发用户测试等。 性能测试的方法主要包括以下…

划分字母区间

划分字母区间 思路&#xff1a; 我觉得这道题最关键的一个思路就是&#xff0c;对于没一个字母&#xff0c;你一定要找到他的最后一次出现的位置&#xff0c;每一个片段必须要比这个大&#xff0c;然后该字符到这个end中其他的字符&#xff0c;也都要找到最后一次出现的位置&…

net6 core 接入nacos 实现服务注册入门使用,心跳检测和负载均衡

net6 core 接入nacos 实现服务注册入门使用&#xff0c;心跳检测和负载均衡 配置中心比较Apollo与Nacos_appollo 和 nacos-CSDN博客 一&#xff1a;安装nacos Release 2.2.3 (May 25th, 2023) alibaba/nacos GitHub 二、配置Nacos 注*Nacos 是使用的mysql 数据库&#x…

谷粒商城实战笔记-282~283-商城业务-订单服务-提交订单的问题

文章目录 一&#xff0c;282-商城业务-订单服务-提交订单的问题调试过程中出现的问题services面板介绍什么是 Services Panel&#xff1f;主要作用解决的痛点使用方法 二&#xff0c;283-商城业务-分布式事务-本地事务在分布式下的问题分布式事务问题解决方案分布式事务处理流程…

Hubspot AI 工具| 使用 6 款 HubSpot AI 工具,提升初创团队海外营销与销售效率

看看 HubSpot AI 工具如何完美助力中国出海与外贸企业加速落地全球 GTM 策略吧~ 在日益竞争激烈的全球市场中&#xff0c;初创企业想要获得成功&#xff0c;必须有效将产品推向市场&#xff0c;并建立客户基础&#xff0c;与竞争对手一较高下。 这需要精心策划的进入市场&…

常用于单北斗多频定位导航模块资料:ATGM332D-F8N

单北斗多频定位导航模块的高精度定位优点描述&#xff1a; 1、多频信号融合&#xff1a;单北斗多频定位导航模块能够接收和处理来自北斗卫星系统的多个频段信号。通过多频信号的融合处理&#xff0c;可以显著提高定位的精度。因为不同频段的信号在传播过程中受到的影响不同&…

力扣134-加油站(java题解)

题目链接&#xff1a;134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法&#xff1a;局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优&#xff0c;并…