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

java找工作之Mybatis(入门及xml配置相关)

Mybatis

学习Mybatis就要学会查看官网,官网地址如下:<MyBatis中文网 >

1、简介
1.1什么是Mybatis
  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.2如何获得Mybatis
  • 通过Maven仓库直接获取

    <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency>
    </dependencies>
    
  • github上获取

  • 中文文档

1.3持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据持久化的两种方式:数据库(jdbc),io文件持久化

为什么需要持久化?

  • 因为内存断电即失,有一些对象我们不能让他丢掉,需要持久化将他存储起来。

  • 内存太贵了

1.4持久层

三层结构:Dao层,Service层,Controller层

  • 持久层是完成持久化工作的代码块
  • 层界限十分明显
1.5为什么需要Mybatis
  • 帮助程序员将数据存入到数据库中

  • 传统的JDBC代码太复杂了,为了把它简化,形成一个框架,实现自动化。

  • 不用Mybatis也可以,只是用了Mybatis框架可以更容易上手

  • 优点

    • sql和代码的分离,提高可维护性
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql
2、第一个Mybatis程序

思路:搭建环境–>导入Mybatis–>编写代码–>测试

2.1搭建环境

搭建数据库

create database Mybatis;
use Mybatis;update table user(
id int(20) not null primary key,
name varchar(30) default null,
password int(20) default null
)ENGINE=INNODB DEFAULT CHARSET=UTF8;
alter table user modify column password varchar(20);
insert into user values
(1,'狂神','123456'),
(2,'狂神','123456'),
(3,'狂神','123456')

#####2.2搭建项目

1、新建一个普通的maven项目

2、导入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Mybatis</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Mybatis</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--JUNIT驱动--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!--Mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.37</version></dependency><!--Mybatis驱动--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency></dependencies>
</project>
2.3创建模块
  • 编写mybatis的核心配置文件
  • 编写mybatis的工具类
package com.kuang.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;//SqlSessionFactory 工厂模式 用来构建SqlSession的
public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory;//静态代码块,按照官方文档填写static{//第一步:获取SqlSessionFactory对象try {//获取配置资源String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}
}
//通过sqlSessionFactory获取SqlSession对象public static SqlSession getSession(){return sqlSessionFactory.openSession();}
}
2.4编写代码
  • 实体类

    根据数据库中的数据元素编写类的属性。

    package com.kuang.pojo;public class User {private int id;private String name;private String pwd;@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", pwd='" + pwd + '\'' +'}';}public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}
    }
    
  • Dao接口

    Dao接口定义了sql语句的实现方法

    package com.kuang.dao;import com.kuang.pojo.User;import java.util.List;public interface UserDao {List<User> getUserList();
    }
    
  • 接口实现类

    在Mapper配置文件中直接配置对应接口信息,查询的数据库,返回结果的类型等等,侧面实现接口方法,不用重复编写代码

    <?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="com.kuang.dao.UserDao"><!--id对应所要实现的接口方法,resultType对象所要返回的数据类型--><select id="getUserList" resultType="com.kuang.pojo.User">select * from mybatis.user</select>
    </mapper>
    

#####2.5测试

报错提示:org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.

这是因为pom.xml文件中maven没有配置我们定义的Dao层文件。
####3、CRUD

  • id:就是对应的namespace中的方法名
  • resultType:Sql语句执行的返回值
  • parameterType:参数的类型

步骤:

  • 1、编写接口
  • 2、配置xml文件实现接口,编写对应sq语句
  • 3、测试,增删改要注意提交事务
3.1接口文件
package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper {//查询全部用户List<User> getUserList();//根据ID查询用户User getUserById(int id);//新增用户Integer addUser(User user);//修改用户Integer updateUser(User user);//删除用户void deleteUser(int id);}
3.2实现接口
<?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="com.kuang.dao.UserMapper"><!--id对应所要实现的接口方法,resultType对象所要返回的数据类型--><select id="getUserList" resultType="com.kuang.pojo.User">select * from mybatis.user</select><select id = "getUserById" resultType="com.kuang.pojo.User" parameterType="int">
select * from mybatis.user where id =#{id}</select><select id="addUser" parameterType="com.kuang.pojo.User" resultType="java.lang.Integer">
insert into user (id,name,password) values (#{id},#{name},#{password});</select><update id="updateUser" parameterType="com.kuang.pojo.User" >
update user set name = #{name},password = #{password} where id =#{id}</update><delete id="deleteUser" parameterType="int">delete from user where id = #{id}</delete>
</mapper>
3.3测试类
package com.kuang.dao;import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.testng.annotations.Test;import java.util.List;public class UserDaoTest {@Testpublic void test(){//第一步:获得 SqlSession对象SqlSession sqlSession=MybatisUtil.getSession();//执行sqlUserMapper userDao=sqlSession.getMapper(UserMapper.class);List<User> userList = userDao.getUserList();for(User user : userList){System.out.println(user);}sqlSession.close();}@Testpublic void getUserById(){SqlSession sqlSession = MybatisUtil.getSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.getUserById(1);System.out.println(user);sqlSession.close();}//增删改需要提交事务@Testpublic void addUser(){SqlSession sqlSession = MybatisUtil.getSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);Integer res=userMapper.addUser(new User(4,"哈哈","123456"));if(res==null)System.out.println("insert ok");else System.out.println("insert failed");//提交事务sqlSession.commit();sqlSession.close();}@Testpublic void updateUser() {SqlSession sqlSession = MybatisUtil.getSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);Integer res = userMapper.updateUser(new User(4, "哈哈", "12345"));sqlSession.commit();sqlSession.close();}@Testpublic void deleteUser(){SqlSession sqlSession = MybatisUtil.getSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);userMapper.deleteUser(2);sqlSession.commit();sqlSession.close();}
}
3.4万能的Map(写项目较好)

假设实体类或者数据库中的表,字段或者参数过多,我们应当考虑使用map

在接口方法中,参数直接传递Map;

User selectUserByNP2(Map<String,Object> map);

编写sql语句的时候,需要传递参数类型,参数类型为map

<select id="selectUserByNP2" parameterType="map" resultType="com.kuang.pojo.User">select * from user where name = #{username} and pwd = #{pwd}
</select>

在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求

Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = mapper.selectUserByNP2(map);
4、配置解析
4.1核心配置文件
  • mybatis-config.xml
  • Mybatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
4.2环境配置(environment)
<environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>
</environments>
  • 配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
4.3Properties优化

数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递 。

第一步 :在资源目录下新建一个db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456

第二步 : 将文件导入properties 配置文件

<configuration><!--导入properties文件--><properties resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,优先使用外部配置文件
4.4类型别名(typeAliases)
  • 类型别名是为Java类型设置一个短的名字
  • 存在的意义仅在于用来减少类完全限定名的冗余
<!--配置别名,注意顺序-->
<typeAliases><typeAlias type="com.kuang.pojo.User" alias="User"/>
</typeAliases>

也可以指定一个包名,Mybatis会在包名下面搜索需要的java Bean,比如扫描实体类的包,意思就是当包名为User时,我们可以使用包的小写别名“user”。

也可以在实体上增加注解,来添加类的别名

@Alias("user")
public class User{}
4.5设置

设置查看官方文档

  • 懒加载

  • 日志实现

  • 缓存开启关闭

  • 一个配置完整的settings元素的实例如下:

    <settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="useGeneratedKeys" value="false"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25"/><setting name="defaultFetchSize" value="100"/><setting name="safeRowBoundsEnabled" value="false"/><setting name="mapUnderscoreToCamelCase" value="false"/><setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="OTHER"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
    </settings>
    
4.6映射器(mappers)

MapperRegistry:注册绑定我们的mapper文件

方式一:文件定位

<mappers><mapperresource="coom/kuang/dao/UserMapper.xml"/>
</mappers>

方式二:使用class文件绑定注册

<mappers><mapper class="com.kuang.dao.UserMapper"/>
</mappers>

注意点:

  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下

方式三:使用扫描包进入诸如绑定

<mappers><package name="com.kuang.dao"/>
</mappers>
4.7作用域和生命周期

生命周期和作用域时非常重要的。

“lazyLoadTriggerMethods” value=“equals,clone,hashCode,toString”/>


##### 4.6映射器(mappers)MapperRegistry:注册绑定我们的mapper文件方式一:文件定位```xml
<mappers><mapperresource="coom/kuang/dao/UserMapper.xml"/>
</mappers>

方式二:使用class文件绑定注册

<mappers><mapper class="com.kuang.dao.UserMapper"/>
</mappers>

注意点:

  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下

方式三:使用扫描包进入诸如绑定

<mappers><package name="com.kuang.dao"/>
</mappers>
4.7作用域和生命周期

生命周期和作用域时非常重要的。

在这里插入图片描述

  • sqlSessionFactoryBuilder
    • 一旦创建了sqlSessionFactory就不需要了
    • 局部变量
  • sqlSessionFactory
    • 可以理解为数据库连接池
    • 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
    • 最佳作用域是应用作用域
    • 最简单的是使用单例模式或者静态单例模式
  • sqlSession
    • 连接到连接池的一个请求
    • SqlSession的实例不是线程安全的,因此是不能被共享的
    • 最佳作用域是调用作用域或者方法作用域
    • 用完之后需要赶紧关闭
5、ResultMap

解决属性名和字段名不一致的问题

数据库中的字段和定义类中的字段不一样

解决办法

  • 起别名

    <select id="selectUserById" resultType="User">select id , name , pwd as password from user where id = #{id}
    </select>
    
  • resultMap:结果集映射

    <resultMap id="UserMap" type="User"><!-- id为主键 --><id column="id" property="id"/><!-- column是数据库表的列名 , property是对应实体类的属性名 --><result column="name" property="name"/><result column="pwd" property="password"/>
    </resultMap>
    <select id="selectUserById" resultMap="UserMap">select id , name , pwd from user where id = #{id}
    </select>
    
6、日志
6.1日志工厂

如果一个数据库操作出现了异常,我们需要排错。

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

在Mybatis中具体使用哪一个日志实现,在设置中配置

<settings><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
6.2Log4j

1.先导入Log4j的包

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

2.配置文件

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

setting设置日志实现

<settings><setting name="logImpl" value="LOG4J"/>
</settings>

测试类

//注意导包:org.apache.log4j.Logger
static Logger logger = Logger.getLogger(MyTest.class);
@Test
public void selectUser() {logger.info("info:进入selectUser方法");logger.debug("debug:进入selectUser方法");logger.error("error: 进入selectUser方法");SqlSession session = MybatisUtils.getSession();UserMapper mapper = session.getMapper(UserMapper.class);List<User> users = mapper.selectUser();for (User user: users){System.out.println(user);}session.close();
}

相关文章:

java找工作之Mybatis(入门及xml配置相关)

Mybatis 学习Mybatis就要学会查看官网&#xff0c;官网地址如下&#xff1a;<MyBatis中文网 > 1、简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取…...

如何保证 HTTPS 证书的有效性?

随着互联网的蓬勃发展&#xff0c;保障用户在网络上的隐私和安全成为至关重要的任务。HTTPS证书&#xff0c;作为一种安全套接字层协议&#xff0c;扮演着网站安全的守护者。 1. 什么是HTTPS 证书&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff…...

Qt 简约美观的动画 摆钟风格 第十季

&#x1f60a; 今天给大家分享一个摆钟风格的加载动画 &#x1f60a; 效果如下: 最近工作忙起来了 , 后续再分享其他有趣的加载动画吧. 一共三个文件 , 可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <Q…...

Vue 3 中的 Composition API 详解

Vue.js&#xff0c;作为前端领域流行的框架之一&#xff0c;以其响应式数据绑定和组件化开发赢得了广大开发者的喜爱。随着前端技术的不断发展和项目复杂度的增加&#xff0c;Vue 团队推出了 Vue 3&#xff0c;并引入了 Composition API&#xff0c;以更好地满足复杂应用的需求…...

利用Python爬取高德地图全国地铁站点信息

利用Python中的requests库进行地铁站点信息的获取,同时将数据保存在本机excel中 # 首先引入所需要的包 import requests from bs4 import BeautifulSoup import pandas as pd import json# 发送 GET 请求获取网页内容 url http://map.amap.com/subway/index.html response r…...

Vue 3 中的 Teleport 特性详解

引言 在 Vue 3 中&#xff0c;引入了一个名为 Teleport 的新特性。这个特性允许开发者将组件的子组件“传送”到 DOM 中的任意位置&#xff0c;而不仅仅是它们的直接父级内部。这一功能在处理如模态框、弹出菜单、提示框等需要从其原始位置在视觉上移动到其他地方的用户界面元…...

小白的matlab简单应用

基本概念 1、数组array 数组是一个更通用的数据结构&#xff0c;可以是一维、二维或多维的。 一维数组通常被称为向量。 二维数组可以被视为矩阵。 多维数组可以用来表示更高维度的数据&#xff0c;例如三维数组可以表示一系列的矩阵。 用过的函数 20240229 1、读取excel文件…...

边缘计算网关在机床生产中的应用-天拓四方

随着工业4.0的推进&#xff0c;物联网&#xff08;IoT&#xff09;技术在各个工业领域中的应用日益广泛。特别是在机床行业&#xff0c;物联网技术的引入不仅提高了生产效率&#xff0c;还实现了对机床设备的实时监控和远程维护。在这一背景下&#xff0c;边缘计算网关的角色愈…...

maven配置文件(一)Settings配置

一、仓库 1、关系 我们依赖的外部服务是需要有地方进行存储的&#xff0c;而存储的地方就称之为仓库。其中仓库又分为本地仓库、中央仓库、镜像仓库、私服。 &#xff08;1&#xff09;本地仓库 当项目在本地编译或运行时&#xff0c;直接加载本地的依赖服务无疑是最快的。默…...

选择何种操作系统作为网站服务器

选择操作系统时&#xff0c;需考虑稳定性、安全性、成本、兼容性和技术支持等因素&#xff0c;常见选项有Windows Server和Linux发行版。 选择网站服务器的操作系统是一个关键的决策&#xff0c;因为它将影响到网站的性能、稳定性、安全性以及未来的扩展性&#xff0c;目前市场…...

【LeetCode】升级打怪之路 Day 11:栈的应用、单调栈

今日题目&#xff1a; Problem 1: 栈的应用 155. 最小栈 | LeetCode20. 有效的括号 | LeetCode150. 逆波兰表达式求值 | LeetCode Problem 2: 单调栈 496. 下一个更大元素 I739. 每日温度503. 下一个更大元素 II 目录 Problem 1&#xff1a;栈 - “先进后出”的应用LC 155. 最…...

题目 1454: 蓝桥杯历届试题-蚂蚁感冒

题目描述: 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是1厘米/秒。 当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。 这些蚂蚁中&#xff0c;有1只蚂蚁感冒了。并且在和其它蚂蚁…...

WP外贸营销型网站模板

WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建wordpress企业官网使用。 零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jia…...

Linux获取进程(系统启动时间和运行时间)运行时间

Linux获取进程运行时间 思路&#xff1a;使用 ps - o命令 ps -p 986 -o etime可以获取进程986的执行时间&#xff0c;不论系统时间有没有发生改变&#xff0c;它都可以返回正确的结果: 总结&#xff1a;etime 是真正的程序运行时间&#xff0c;而不是系统运行时间与进程启动…...

服务器内部错误的原因

服务器内部错误的原因 软件问题。服务器上运行的软件可能存在程序错误、内存泄漏、配置错误等&#xff0c;这些错误可能导致服务器崩溃、服务无法正常运行或响应时间过长 硬件故障。服务器的硬件组件&#xff08;如处理器、内存、硬盘等&#xff09;可能会因故障或损坏而无法正…...

不愧是华为的,太厉害了。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 实习去了博彦科技&#xff08;外包&#xff09;&#xff0c;做的…...

贪心算法(区间问题)

452. 用最少数量的箭引爆气球 题目(求无重复区间) 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着…...

【Javascript】设计模式之策略模式

文章目录 1、使用策略模式计算奖金2、JavaScript 版本的策略模式3、应用&#xff1a;表单验证3.1 用策略模式进行表单验证3.2 给某个文本输入框添加多种校验规则 4、策略模式的优缺点 策略模式的定义是&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0…...

vue面试题:如何保存页面的当前的状态?

如何保存页面的当前的状态&#xff1f; 既然是要保持页面的状态&#xff08;其实也就是组件的状态&#xff09;&#xff0c;那么会出现以下两种情况&#xff1a;组件会被卸载&#xff1a;&#xff08;1&#xff09;将状态存储在LocalStorage / SessionStorage优点&#xff1a;缺…...

Java的编程之旅34——Interger包装类

1.API简介 Java的API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一组提供给程序员使用的代码库&#xff0c;用于开发Java应用程序。Java的API包括了各种类和接口&#xff0c;用于处理输入输出、图形用户界面、网络通信、数据库…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...