当前位置: 首页 > news >正文

Mybatis入门

在学习MyBatis之前先了解一下什么是Mybatis?它能解决什么问题?

什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

Mybatis解决什么问题?

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

JDBC和Mybatis使用对比

JDBC
		Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("url",username", "password");PreparedStatement preparedStatement = connection.prepareStatement("select * from user");ResultSet resultSet = preparedStatement.executeQuery();List<User> users = new ArrayList<>();while (resultSet.next()) {User user = new User();// 第一种方式,通过列的下标去获取数据int id = resultSet.getInt(1);// 第二种方式通过列名获取数据//resultSet.getInt("id")user.setId(id);String name = resultSet.getString(2);user.setName(name);int age = resultSet.getInt(3);user.setAge(age);users.add(user);}users.forEach(System.out::println);resultSet.close();preparedStatement.close();connection.close();

缺点:
1、每次链接数据库,基本上connect对象、preparedStatement 、resultSet对象都需要人工维护,而且每次用完都需要进行cloes
2、获取到resultSet对象虽然可以通过两种方式去获取相应信息,但存在获取字段类型不对而导致程序异常,数据查询失败
3、数据库字段给实体对象赋值过去麻烦,也存在赋错值的情况。

mybatis

配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="database.properties"></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${database.driver}"/><property name="url" value="${database.url}"/><property name="username" value="${database.username}"/><property name="password" value="${database.password}"/></dataSource></environment></environments><mappers><mapper resource="UserMapper.xml"/></mappers>
</configuration>

usermapper配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="userMapper"><select id="selectUser" parameterType="int" resultType="com.czy.model.User">select * from user</select>
</mapper>

主程序:

		String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = sqlSessionFactory.openSession();try{List<User> users = session.selectList("userMapper.selectUser");users.forEach(user -> {System.out.println(user.toString());});}finally {session.close();}

优势:
1、通过配置减少connect相关链接代码
2、在usermapper中可以写我们熟悉的sql语句
3、可以指定resultType的实体类型,省去实体赋值等等
4、主程序通过mapper中定义的namespace+’.’+select元素的id来找到需要执行的sql语句。

mybatis基础知识

mybatis官方文档写得比较全面,小白易上手,也有中文版:https://mybatis.org/mybatis-3/zh_CN/index.html下面只针对官网中的“XML 映射器”进行案例教程。

XML映射器

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

  • cache – 该命名空间的缓存配置。
  • cache-ref – 引用其它命名空间的缓存配置。
  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
  • sql – 可被其它语句引用的可重用语句块。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。

Select元素

demo1: 无参查询
<select id="demo1" resultType="com.czy.model.User">select * from user
</select>
demo2: 有参查询
<select id="demo2" parameterType="int" resultType="com.czy.model.User">select * from user where id = #{id}
</select>

注:参数符号#{}

demo3: 多参查询,UserQuery对象有id和name属性
<select id="demo3" parameterType="com.czy.query.UserQuery" resultType="com.czy.model.User">select * from user where name = #{name} and id = #{id}</select>

select元素还有其他属性设置,可参考官网:https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html#select-1

Select元素,resultType属性

<select id="demo6" resultType="com.czy.model.User">        select * from user    
</select>

注:期望从这条语句中返回结果的类全限定名或别名。注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。resultType 和 resultMap 之间只能同时使用一个。

Select元素,resultMap属性

<resultMap id="demo7ResultMap" type="com.czy.model.User">        <result property="id" column="id" javaType="Integer" jdbcType="INTEGER"/>   
</resultMap>    
<select id="demo7" resultMap="demo7ResultMap">        select * from user    
</select>

注:执行结果能和预想的有些出入,预想中是User实体只给id赋值,结果你会发现User其它属性也有值,这是为什么呢?
其实是autoMapping属性起到的作用,MyBatis 将会为本结果映射开启或者关闭自动映射。这个属性会覆盖全局的属性 autoMappingBehavior,如果没有设置的话则会延用autoMappingBehavior配置autoMappingBehavior默认值“PARTIAL”:PARTIAL 只会自动映射没有定义嵌套结果映射的字段。

Select元素,statementType属性

可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
三者区别:
Statement‌适用于执行简单的、不带参数的查询操作,如执行一次性的查询任务。
PreparedStatement‌适用于需要频繁执行相同SQL语句的场景,如插入、更新、删除操作,能够有效提高性能并防止SQL注入。
CallableStatement‌适用于需要调用数据库存储过程的情况,特别是当存储过程涉及复杂的逻辑处理和参数交互时。

Select元素,cache属性

<select id="demo4" useCache="true" parameterType="int" resultType="com.czy.model.User">        select * from user where id = #{id}    
</select>

设置cache为true,则该查询开启了缓存,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
注:只是单纯将useCache=true也是无法使用二级缓存,需增加一下配置:

在Mapper.xml增加缓存配置,相关配置下面详解

<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>

mybatis-config.xml增加下面配置,用于开启全局二级缓存,默认是true,开启二级缓存

<settings><setting name="cacheEnabled" value="true"/>
</settings>

Select元素,flushCache属性

<select id="demo5" useCache="true" parameterType="int" flushCache="true" resultType="com.czy.model.User">        select * from user where id = #{id} 
</select>

说明:将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。不管useCache为true,缓存也是不生效

insert、delete、update元素

  • id:在命名空间中唯一的标识符,可以被用来引用这条语句。
  • parameterType:将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以根据语句中实际传入的参数计算出应该使用的类型处理器(TypeHandler),默认值为未设置(unset)。
  • parameterMap:用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和parameterType 属性。
  • flushCache:将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。
  • timeout:这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)依赖数据库驱动。
  • statementType:可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
  • useGeneratedKeys:仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
  • keyProperty:(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
  • keyColumn:(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
  • databaseId:如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。

insert、update元素,useGeneratedKeys、keyProperty属性

<!-- 插入的user对象执行完后,user对象id是null值-->    
<insert id="demo8" useGeneratedKeys="true">        insert into user (name,age) values(#{name},#{age});   
</insert>
<!-- 插入的user对象执行完后,user对象id是有值,原因在于keyProperty ,会从useGeneratedKeys生成的id赋值给id属性-->       
<insert id="demo9" useGeneratedKeys="true" keyProperty="id">       insert into user (name,age) values(#{name},#{age});   
</insert>

selectKey元素

selectKey元素解决我们自定义主键功能。下面例子是通过生成一个0~100的随机整数给ID赋值

<insert id="demo10">        <selectKey keyProperty="id" resultType="int" order="BEFORE">            -- 0~100之间随机整数            select round(100*rand(),0)       </selectKey>        insert into user (name,age) values(#{name},#{age});    </insert>

selectKey相关属性说明:

  • keyProperty:selectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。
  • keyColumn:返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。
  • resultType:结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。
  • order:可以设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
  • statementType:和前面一样,MyBatis 支持 STATEMENT,PREPARED 和 CALLABLE 类型的映射语句,分别代表 Statement, PreparedStatement 和 CallableStatement 类型。

sql元素

这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。

简单用法:

<sql id="demo11SQL"> id,name</sql>    
<select id="demo11" resultType="com.czy.model.User">select <include refid="demo11SQL"/> from user    
</select>

执行结果:==> Preparing: select id,name from user

高级用法:

<sql id="sometable">  ${prefix}Table</sql>
<sql id="someinclude">  from <include refid="${include_target}"/>
</sql>
<select id="demo12" resultType="map">  select field1, field2, field3  <include refid="someinclude">    <property name="prefix" value="Some"/>    <property name="include_target" value="sometable"/> </include>
</select>

执行结果SQL: select field1, field2, field3 from SomeTable

解读:include标签定义两个属性,name:prefix value:Some 和name:include_target value:sometable  refid指向sql元素id=someinclude  ;而sql元素id=someinclude中又包含一个include标签refid=${include_target},${include_target}是在select标签中的include标签定义的属性value=sometable,所以 id=someinclude中的refid实际上是sometable,一层层嵌套

ResultMap高级用法,association子查询

一个复杂类型的关联;许多结果将包装成这种类型嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
注:association只适用一对一的关系,多个参数关联查询可以写column= “{prop1=col1,prop2=col2}”

<resultMap id="demo15ResultMap" type="com.czy.model.User">        <association property="blog" column="id" javaType="com.czy.model.Blog" select="demo15BlogSelect"/><!-- 多参子查询        <association property="blog" column="{id=id,title=name}" javaType="com.czy.model.Blog" select="demo15BlogSelect"/>        -->    
</resultMap> <select id="demo15BlogSelect" resultType="com.czy.model.Blog">        select * from blog where user_id = #{id}        -- 多参子查询        -- select * from blog where user_id = #{id} and title = #{title}    </select>    <select id="demo15" resultMap="demo15ResultMap">        select * from user    </select>

ResultMap高级用法,collection子查询

一个复杂类型的集合嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
注:collection适用一对多的关系,多个参数关联查询可以写column= “{prop1=col1,prop2=col2}”用法和association没多大区别

<resultMap id="demo14ResultMap" type="com.czy.model.User">        <collection property="blogs" javaType="ArrayList" column="id" ofType="com.czy.model.Blog" select="demo14BlogSelect"/>    
</resultMap>    
<select id="demo14BlogSelect" resultType="com.czy.model.Blog">        select * from blog where user_id = #{id}    
</select>    
<select id="demo14" resultMap="demo14ResultMap">        select * from user    
</select>

至此入门篇完结!!有什么问题的宝子们可以留言!!

案例具体代码:https://gitee.com/zeyc/mybatis

相关文章:

Mybatis入门

在学习MyBatis之前先了解一下什么是Mybatis&#xff1f;它能解决什么问题&#xff1f; 什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。 Mybatis解决什么问题&#xff1f; MyBatis 免除了几乎所有的 JDBC…...

智能方法求解-圆环内传感器节点最大最小距离分布

本篇文章是博主在最优化、人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在最优化算…...

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装

Python Matplotlib 安装指南&#xff1a;使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一&#xff0c;结合Miniconda可以轻松管理安装和依赖项。在这篇文章中&#xff0c;我们将详细介绍如何使用Miniconda在Linux、mac…...

数学建模学习(137):使用Python进行频数分析

在数据科学的工作中,频数分析是一种用于描述变量值出现次数的重要统计方法。SPSS等工具提供了便捷的频数分析功能,而在Python中,我们同样可以通过灵活的库来实现相同的分析。在本文中,我们将介绍如何使用Python来完成频数分析,并演示如何用Pandas、Matplotlib等库来分析和…...

[Unity] 【游戏开发】Unity开发基础1-创建Unity项目:从Unity Hub选择合适的渲染管

创建一个新的Unity项目通常是开发过程中的第一步,而Unity为此提供了强大的工具和灵活的选项。本文将详细介绍如何使用Unity Hub创建项目、选择合适的Unity版本、模板和渲染管线,并阐述每种选项的优缺点和适用场景。 1. Unity Hub:统一管理项目和版本 Unity Hub是Unity提供…...

大型语言模型综述 A Survey of Large Language Models

文章源自 2303.18223 (arxiv.org) 如有侵权&#xff0c;请通知下线 这是一篇关于大语言模型&#xff08;LLMs&#xff09;的综述论文&#xff0c;主要介绍了 LLMs 的发展历程、技术架构、训练方法、应用领域以及面临的挑战等方面&#xff0c;具体内容如下&#xff1a; 摘要…...

基于MATLAB的混沌序列图像加密程序

设计目的 图像信息生动形象&#xff0c;它已成为人类表达信息的重要手段之一&#xff0c;网络上的图像数据很多是要求发送方和接受都要进行加密通信&#xff0c;信息的安全与保密显得尤为重要&#xff0c;因此我想运用异或运算将数据进行隐藏&#xff0c;连续使用同一数据对图…...

容器安全检测和渗透测试工具

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect Docker-bench-…...

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…...

MyBatis——#{} 和 ${} 的区别和动态 SQL

1. #{} 和 ${} 的区别 为了方便&#xff0c;接下来使用注解方式来演示&#xff1a; #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用&#xff0c;而 ${} 是直接进行参数替换&#xff0c;这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时&#xff…...

学习日志014--用python实现顺序表

之前我们用c语言实现顺序表&#xff0c;今天就然我们用python来复习一遍 一、创建顺序表 python的类可以代替c中的结构体作为复合数据类型。 创建学生类&#xff0c;并用装饰器将方法属性化&#xff0c;便于之后的修改。属性装饰器&#xff0c;可以在保护私有属性&#xff0…...

Android ConstraintLayout 基础

Android ConstraintLayout 基础 屏障线 Barrier设置水平和垂直方向的约束关系长宽比链式结构组站位辅助线 参考地址 屏障线 Barrier 以下是使用 ConstraintLayout 在 Android 中实现简单屏障线&#xff08;Barrier&#xff09;使用的示例代码&#xff0c;主要步骤如下&#xf…...

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…...

【网站推荐】the top trending open-source startups, every quarter

每季度最热门的开源初创公司 我们根据 GitHub 存储库自 2020 年以来的明星增长情况发布热门开源项目&#xff0c;并将其称为 Runa 开源初创公司 (ROSS) 指数。 una Capital actively invests in open-source startups (like Nginx and MariaDB) and considers an active deve…...

Java通过calcite实时读取kafka中的数据

引入maven依赖 <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-kafka</artifactId> <version>1.28.0</version> </dependency> 测试代码 import java.sql.Connection; import java.sql.DriverMan…...

el-table 数据去重后合并表尾合计行,金额千分位分割并保留两位小数,表尾合计行表格合并

问题背景 最近在做后台管理项目el-table 时候需要进行表尾合计&#xff0c;修改合计后文字的样式&#xff0c;合并单元格。 想实现的效果 合并表尾单元格前三列为1格&#xff1b;对某些指定的单元格进行表尾合计&#xff1b;合计后的文本样式加粗&#xff1b;涉及到金额需要千…...

Flutter:RotationTransition旋转动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationController late AnimationController _controller;overridevoid initState() {super…...

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…...

Java面试题分享

1、hashmap的底层设计原理以及扩容规则&#xff0c;是否线程安全&#xff0c;如何线程安全。 jdk1.7以前采用数组加链表结构通过键哈希确定数组下标存键值对。jdk1.8及以后采用数组加链表加红黑树&#xff0c;链表超阈值且数组满足条件会转红黑树&#xff0c;哈希函数先取键 h…...

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…...

【计算机网络】UDP协议

一、UDP协议格式 1.报头的含义 ① 16位源端口号&#xff1a;自己的端口号 ② 16位目的端口号&#xff1a;对方的端口号 ③ 16位UDP长度&#xff1a;整个数据报(UDP报头UDP有效载荷)的长度&#xff0c;最大64KB 一个UDP最多传64KB的数据&#xff0c;如果要传的数据 > 64K…...

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…...

[Unity] 关于引入Google SDK以及使用的方法

在Unity中接入谷歌SDK&#xff08;如Google Play Games SDK或Firebase SDK等&#xff09;通常涉及几个关键步骤&#xff0c;包括下载SDK、导入Unity项目、配置项目设置、编写必要的代码以及测试集成。以下是一个基于Firebase SDK接入Unity的示例&#xff0c;同时涵盖了Google P…...

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…...

第R4周:LSTM-火灾温度预测(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…...

基于SpringBoot和uniapp开发的医护上门系统上门护理小程序

项目分析 一、市场需求分析 人口老龄化趋势&#xff1a;随着全球及中国人口老龄化的加剧&#xff0c;老年人口数量显著增加&#xff0c;对医疗护理服务的需求也随之增长。老年人由于身体机能下降&#xff0c;更需要便捷、高效的医护服务&#xff0c;而医护上门服务恰好满足了这…...

js批量输入地址获取经纬度

使用js调用高德地图的接口批量输入地址获取经纬度。 以下的请求接口的key请换成你的key。 创建key&#xff1a;我的应用 | 高德控制台 &#xff0c;服务平台选择《Web服务》。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-…...

Python自动化测试实践中pytest用到的功能dependency和parametrize

Python自动化测试中pytest用到的功能 1、pytest之@pytest.mark.dependency装饰器设置测试用例之间的依赖关系 1.1说明: 1、这是一个pytest第三方插件,主要解决用例之间的依赖关系。如果依赖的上下文测试用例失败后续的用例会被标识为跳过执行,相当于执行了 pytest.mark.s…...

json-bigint处理前端精度丢失问题

问题描述&#xff1a;前后端调试过程中&#xff0c;有时候会遇到精度丢失的问题&#xff0c;比如后端给过来的id超过16位&#xff0c;就会出现精度丢失的情况&#xff0c;前端拿到的id与后端给过来的不一致。 解决方案&#xff1a; 1、安装 npm i json-bigint 2、在axios中配置…...

神经网络10-Temporal Fusion Transformer (TFT)

Temporal Fusion Transformer (TFT) 是一种专为时序数据建模而设计的深度学习模型&#xff0c;它结合了Transformer架构和其他技术&#xff0c;旨在有效地处理和预测时序数据中的复杂模式。TFT 于 2020 年由 Google Research 提出&#xff0c;旨在解决传统模型在时序预测中的一…...

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展&#xff0c;利用大数据分析对民族服饰进行管理已势在必行&#xff1b;该平台将帮助企业更好地理解服饰市场的趋势&#xff0c;优化服装款式&#xff0c;提高服装的质量。 本文讲述了基于python语言开发&#xff0c;后台数据库选择MySQL进行数据的存储…...

html数据类型

数据类型是字面含义&#xff0c;表示各种数据的类型。在任何语言中都存在数据类型&#xff0c;因为数据是各式各样。 1.数值类型 number let a 1; let num 1.1; // 整数小数都是数字值 ​ // 数字肯定有个范围 正无穷大和负无穷大 // Infinity 正无穷大 // -Infinity 负…...

Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常

Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常 报错提示 Connected to the target VM, address: 127.0.0.1:57210, transport: socket 错误:找不到或无法加载主类 global.hh.manage.HHMicroCloudProviderApplication Disconnected from the target VM, …...

哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性

文章目录 哋它亢SEO技术分析&#xff1a;如何提升网站在搜索引擎中的可见性网站的基本情况SEO优化分析与建议1. 元数据优化2. 关键词优化3. URL结构4. 图像优化5. 移动端优化6. 网站速度7. 结构化数据&#xff08;Schema Markup&#xff09;8. 内链与外链9. 社交分享 哋它亢SEO…...

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码&#xff0c; $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是&#xff1a;从 $file_name 中去除所有出现在 $deny_ext 数组中的元素&#xff0c;替换为空字符串&#xff08;即删除这些元素&#xff09;。str_ireplace() 在处理时…...

ElasticSearch7.x入门教程之中文分词器 IK(二)

文章目录 前言一、内置分词器二、中文IK分词器&#xff08;第三方&#xff09;三、本地自定义四、远程词库总结 前言 ElasticSearch 核心功能就是数据检索&#xff0c;首先通过索引将文档写入 es。 查询分析则主要分为两个步骤&#xff1a; 1、词条化&#xff1a;分词器将输入…...

体积全息及平面全息图的衍射效率

一、体积全息 当记录材料的厚度是条纹间距的若干倍时&#xff0c;则在记录材料体积内将记录下干涉全息图的三维空间分布&#xff0c;就形成了体积全息。 按物光和参考光入射方向和再现方式的不同体积全息可以分为两种。 一种是物光和参考光在记录介质的同一侧入射&#xff0c;得…...

【常用组件整理】

xgplayer 字节开发的前端视频播放器 xgplayer是一个由字节跳动开发的强大的前端视频播放器&#xff0c;具有稳定性高、文档清晰、支持弹幕和移动端优化 等特点。相较于VideoJs&#xff0c;xgplayer的文档更简洁&#xff0c;自定义插件更为便捷。xgplayer还提供了丰富的插件来扩…...

用指针函数寻找数组中的最大值与次大值

#include <stdio.h>// 函数用于找出数组中的最大值和次大值 void LargestTow(int a[], int n, int *pfirst, int *psecond) {*pfirst a[0];*psecond a[1];if (*psecond > *pfirst) {// 如果初始的次大值大于最大值&#xff0c;交换它们int temp *pfirst;*pfirst *…...

原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型

无论是在什么手机机型下&#xff0c;自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12&#xff0c;13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意&#xff1a;红色阔里的是自定义导航&#xff08;或者其他的logo啊&#xff0c;返回之…...

Android Gradle自定义任务在打包任务执行完成后执行cmd命令

背景 在每次打包之后需要做某事&#xff0c;例如每次打包后我都会安装某个目录下的一个apk。这个apk是通过一堆shell命令过滤得到一个apk的地址&#xff0c;然后把执行的几个shell命令何必成一个alias指令&#xff0c;在打包后只需要执行alias指令实现功能。当然也可以直接写在…...

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…...

解决Docker环境变量的配置的通用方法

我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前&#xff0c;除了设置网络、数据卷之外&#xff0c;还需要设置各种各样的环境变量。 有时候&#xff0c;由于容器版本的问题&#xff0c;一些文档没有及时更新&#xff0c;可能同时存在多个新旧版本的环…...

SpringBoot3整合Hutool-captcha实现图形验证码

文章目录 验证码需求分析:项目创建import方式的使用说明exclude方式定义接口:接口定义定义 CaptchaController前端代码在整合技术框架的时候,想找一个图形验证码相关的框架,看到很多验证码不在更新了或者是在中央仓库下载不下来,还需要多引入依赖。后面看到了Hutool **图形…...

Spring Boot核心概念:日志管理

日志记录是软件开发的重要组成部分&#xff0c;它帮助开发人员了解应用程序运行时的状态&#xff0c;以及在故障排查和性能监控时提供关键信息。Spring Boot通过提供默认的日志配置&#xff0c;简化了日志管理。 Spring Boot默认日志框架 Spring Boot默认使用Logback作为日志…...

selenium grid 远程webdriver添加上网代理

################## selenium grid config start ####################### # UI自动化测试策略 Grid/Local UIAutomation_TestStrategy Grid selenium_grid_url http://172.16.99.131:4444/wd/hub # Windows XP / linux grid_platformName linux # windows capabilities win…...

Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行

问题 IOS14设备&#xff0c;切后台划掉&#xff0c;二次启动崩溃。 原因 IOS14以上 flutter 不支持debugger模式下的二次启动 。 要二次启动需要以release方式编译工程安装至手机。 操作步骤 清理项目&#xff1a;在命令行中运行flutter clean来清理之前的构建文件。重新构…...

Spring Boot 项目 myblog 整理

myblog 项目是一个典型的 Spring Boot 项目&#xff0c;主要包括用户注册、登录、文章管理&#xff08;创建、查询、更新、删除&#xff09;等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包&#xff1a; Spring Boot W…...

【前端知识】nodejs项目配置package.json深入解读

package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件&#xff0c;它位于项目的根目录下&#xff0c;并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...

51c嵌入式~IO合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11697814 一、STM32串口通信基本原理 通信接口背景知识 设备之间通信的方式 一般情况下&#xff0c;设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传…...