什么是MyBatis?无论是基础教学还是技术精进,你都应该看这篇MyBatis
文章目录
- 学习之前,跟你们说点事情,有助于你能快速看完文章
- 一、先应用再学习,代码示例
- 1. 第一个MyBatis程序
- 2. MyBatis整合Spring
- 3. SpringBoot整合MyBatis
- 二、MyBatis整体流程,各组件的作用域和生命周期
- 三、说说MyBatis-config.xml核心配置文件吧
- 四、讲讲xxxMapper.xml文件中的标签吧
- 五、MyBatis剩下的问题,在这里总结一下
参考文章:什么是MyBatis
学习之前,跟你们说点事情,有助于你能快速看完文章
先对MyBatis整套流程做个总结,看懂了就直接跳过这里的示例吧。
假设现在要全部都配置好了,我现在要测试UserMapper接口
- 完成了jar包导入后,需要配置数据源以及xml文件位置
- 创建数据库、实体类、实体接口
- 为每个接口配置xxxMapper.xml文件,规定每个方法做什么
- 测试:获取SqlSessionFactoryBuilder、sqlSessionFactory、sqlSession、xxxMapper
- 执行xxxMapper.方法时需要根据方法名,在核心配置文件找到对象的xxxMapper.xml,然后在xxxMapper.xml找到对应方法的CRUD操
很多同学对classpath
这个东西不明白,在MyBatis中的classpath
表示:main/java
、main/resources
、第三方jar包的根目录
一、先应用再学习,代码示例
1. 第一个MyBatis程序
省流
配置篇
:引入jar包、配置核心配置文件mybatis-config.xml、编写MyBatis工具类
数据库
:创建数据表
编程篇
:创建实体类、创建Mapper层、创建xxxMapper.xml文件
测试篇
:MybatisUtils.getSqlseesion();
sqlSession.getMapper(UserDao.class);
配置MyBatis
引入MyBatis的Jar包
<!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency><!--配置全局--><!--在build中配置resource,来防止我们资源到处失败的问题--><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources></build>
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><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="com.mysql.cj.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="com/mybatis/dao/UserMapper.xml"/></mappers>
</configuration>
编写MyBatis工具类
public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {//使用Mybatis第一步: 获取sqlSessionFactory对象String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。//sqlSession 完全包含了面向数据库执行SQL命令所需的所有方法public static SqlSession getSqlseesion() {// SqlSession sqlSession = sqlSessionFactory.openSession();return sqlSessionFactory.openSession();}
}
到这里,MyBatis就已经配置完成了。下面是根据业务需求,应用MyBatis。
数据库搭建
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`pwd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'小明','123456'),(2,'张三','abcdef'),(3,'李四','987654');
编程篇
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id; //idprivate String name; //姓名private String pwd; //密码
}
public interface UserMapper {//查询全部用户List<User> getUserList();
}
编写xxxMapper接口的配置文件xxxMapper.xml
<?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.mybatis.dao.UserMapper"><select id="getUserList" resultType="com.mybatis.pojo.User">select * from mybatis.user</select>
</mapper>
测试接口
@Testpublic void test(){SqlSession sqlSession = MybatisUtils.getSqlseesion();UserDao userdao = sqlSession.getMapper(UserDao.class);List<User> userList = userdao.getUserList();for(User user : userList){System.out.println(user);}sqlSession.close();}
2. MyBatis整合Spring
省流
配置篇
:引入jar包、配置核心配置文件mybatis-config.xml、配置核心配置文件spring-dao.xml
数据库
:创建数据表
编程篇
:实体类、Mapper接口、xxxMapper.xml文件、UserMapperImpl、bean传入Spring容器
测试篇
:ClassPathXmlApplicationContext("spring-dao.xml")
context.getBean("userMapper", UserMapper.class);
配置MyBatis+Spring篇
<!--spring核心ioc-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version>
</dependency>
<!--做spring事务用到的-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.2.5.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.5.RELEASE</version>
</dependency>
<!--mybatis依赖-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version>
</dependency>
<!--mybatis和spring集成的依赖-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version>
</dependency>
<!--mysql驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version>
</dependency>
<!--阿里公司的数据库连接池-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version>
</dependency><build><!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中--><resources><resource><directory>src/main/java</directory><!--所在的目录--><includes><!--包括目录下的.properties,.xml 文件都会扫描到--><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><!--指定jdk的版本--><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins>
</build>
创建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><!--settings:控制mybatis全局行为--><settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--设置别名--><typeAliases><!--name:实体类所在的包名表示com.bjpowernode.domain包中的列名就是别名你可以使用Student表示com.bjpowenrode.domain.Student包下的所有类的类名则为别名--><package name="com.SpringStudy.domain"/></typeAliases><!--一个mapper标签指定一个文件的位置。从类路径开始的路径信息target/classes(类路径)--><mappers><!--name:是包名, 这个包中的所有mapper.xml一次都能加载--><package name="com.SpringStudy.dao"/></mappers>
</configuration>
创建Spring配置文件spring-dao.xml
```xml
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd<!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid我们这里使用Spring提供的JDBC:--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="123456"/></bean><!--sqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><!--关联mybatis配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><property name="mapperLocations" value="classpath:com/kuang/mapper/*.xml"/></bean><!--SqlSessionTemplate:就是我们使用的sqlSession--><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><!--只能使用构造器注入sqlSessionFactory,因为它没有set方法--><constructor-arg index="0" ref="sqlSessionFactory" /></bean>
</beans>
到这里,Spring与MyBatis整合配置已经完成
数据库篇
数据库搭建
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`pwd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'小明','123456'),(2,'张三','abcdef'),(3,'李四','987654');
编程篇
创建实体类User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id; //idprivate String name; //姓名private String pwd; //密码
}
创建实体类接口Mapper
public interface UserMapper {//查询全部用户List<User> getUserList();
}
编写xxxMapper接口的配置文件xxxMapper.xml
<?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.mybatis.dao.UserMapper"><select id="getUserList" resultType="com.mybatis.pojo.User">select * from mybatis.user</select>
</mapper>
需要UserMapper接口的UserMapperImpl 实现类,私有化sqlSessionTemplate
public class UserMapperImpl implements UserMapper {//我们的所有操作,都使用sqlSession来执行,在原来,现在都使用SqlsessionTemplateprivate SqlSessionTemplate sqlSession;public void setSqlSession(SqlSessionTemplate sqlSession) {this.sqlSession = sqlSession;}public List<User> selectUser() {UserMapper mapper = sqlSession.getMapper(UserMapper.class);return mapper.selectUser();}
}
将自己写的实现类,注入到Spring配置文件spring-dao.xml
<bean id="userMapper" class="com.kuang.mapper.UserMapperImpl"><property name="sqlSession" ref="sqlSession"/></bean>
测试篇
@Testpublic void test () throws IOException {ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");UserMapper userMapper = context.getBean("userMapper", UserMapper.class);for (User user : userMapper.selectUser()) {System.out.println(user);}}
3. SpringBoot整合MyBatis
省流
配置篇
:引入jar包、配置核心配置文件application.yml
数据库
:创建数据表
编程篇
:实体类、Mapper接口、xxxMapper.xml文件、UserMapperImpl、bean传入Spring容器
测试篇
:ClassPathXmlApplicationContext("spring-dao.xml")
context.getBean("userMapper", UserMapper.class);
配置篇
SpringBoot+MyBatis配置文件
<!--Springboot需要的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Mybatis项目需要的依赖--><!--mysqlq驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--Springboot-Mybatis整合需要的依赖-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency><build><!--目的是把src/main/java目录中的xml文件包含到输出结果中。输出到classes目录中--><resources><resource><directory>src/main/java</directory><!--所在的目录--><includes><!--包括目录下的.properties,.xml 文件都会扫描到--><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><!--指定jdk的版本--><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins>
</build>
配置核心配置类application.yml:放在Resource文件夹下,SpringBoot会自己扫描到
spring:datasource:name: pro_man_sys_dburl: jdbc:mysql://localhost:3306/pro_man_sys_db?serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverresources:static-locations: classpath:/static,classpath:/resources,file:/root/uploadFilesmybatis:type-aliases-package: com.shiliuzi.modelmapper-locations: classpath:mapper/*.xml
数据库篇
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`pwd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'小明','123456'),(2,'张三','abcdef'),(3,'李四','987654');
编程篇
创建实体类User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id; //idprivate String name; //姓名private String pwd; //密码
}
创建实体类接口Mapper
@Mapper
public interface UserMapper {//查询全部用户List<User> getUserList();
}
配置Mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration core file-->
<mapper namespace="com.guo.mapper.UserMapper"><select id="queryUserList" resultType="User"></select>
</mapper>
二、MyBatis整体流程,各组件的作用域和生命周期
不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
sqlSessionFactoryBuilder
利用xml解析资源来解析MyBatis-config.xml核心配置文件,创建了sqlSessionFactory就可以丢弃
sqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
sqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
三、说说MyBatis-config.xml核心配置文件吧
主要说说接口和对应xml映射文件的位置问题,可以通过mapper映射标签解决
Mybatis中接口和对应的mapper文件不一定要放在同一个包下,如果放在一起的目的是为了Mybatis进行自动扫描,并且要注意此时Java接口的名称和mapper文件的名称要相同,否则会报异常,由于此时Mybatis会自动解析对应的接口和相应的配置文件,所以就不需要配置mapper文件的位置了。
如果接口和mapper文件不在同一个包下,就不能进行自动扫描解析了,需要对接口和文件分别进行配置。
<!--方式一:使用相对于类路径的资源引用-->
<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers><!--方式一:使用映射器接口实现类的完全限定类名 -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers><!--方式三:将包内的映射器接口实现全部注册为映射器 -->
<mappers><package name="org.mybatis.builder"/>
</mappers>
四、讲讲xxxMapper.xml文件中的标签吧
如果童鞋们将上述的三个项目搭建认真看完并且总结了,我相信MyBatis在使用层面就没什么问题了,这里就再补充一下xxxMapper.xml文件的标签问题就好了。
1. CRUD标签
<!--对象中的属性,可以直接取出来--><select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User">select * from mybatis.user where id = #{id}</select><insert id="addUser" parameterType="com.kuang.pojo.User">insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});</insert><update id="updateUser" parameterType="com.kuang.pojo.User">update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id} ;</update><delete id="deleteUser" parameterType="int">delete from mybatis.user where id = #{id};</delete>
2. parameterType传入参数
parameterType = 实体类
如果 User 类型的参数对象传递到了语句中,会查找 id、username 和 password 属性,然后将它们的值传入预处理语句的参数中。对传递语句参数来说,这种方式真是干脆利落。
<insert id="insertUser" parameterType="User">insert into users (id, username, password) values (#{id}, #{username}, #{password})
</insert>
parameterType = map
<!--对象中的属性,可以直接取出来 传递map的key--><insert id="addUser" parameterType="map">insert into mybatis.user (id, pwd) values (#{userid},#{passWord});</insert>
@Testpublic void addUser2(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);Map<String, Object> map = new HashMap<String, Object>();map.put("userid",5);map.put("passWord","2222333");mapper.addUser2(map);sqlSession.close();}
五、MyBatis剩下的问题,在这里总结一下
- MyBatis的事务问题:CRUD需要提交事务!可以通过手动提交和自动提交完成:
- 手动提交:sqlSession.commit();
- 自动提交:sqlSessionFactory.openSession(true);
- 属性名和字段名不一致:通过ReslutMap
但是MyBatis-plus底层会去识别数据库字段,然后遇到下划线就会转化为下一个字母的大写,也就是驼峰命名转化。
<resultMap id="WaterSupplyProduction" type="com.ruoyi.domain.monitor.WaterSupplyProduction"><!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --><!-- property:主键在pojo中的属性名 --><!-- column:主键在数据库中的列名 --><id property="id" column="id"/><!-- 定义普通属性 --><result property="areaName" column="area_name"/><result property="factoryId" column="factory_id"/><result property="monitorRecordId" column="monitor_record_id"/><result property="riverLevel" column="river_level"/><result property="riverTurbidity" column="river_turbidity"/><result property="riverFlowRate" column="river_flow_rate"/><result property="handledTurbidity" column="handled_turbidity"/><result property="poolLevel" column="pool_level"/><result property="factoryWaterTurbidity" column="factory_water_turbidity"/><result property="factoryWaterPH" column="factory_water_pH"/><result property="factoryWaterChlorine" column="factory_water_chlorine"/><result property="factoryWaterRate" column="factory_water_rate"/><result property="createTime" column="create_time"/></resultMap><select id="selectAll" resultMap="WaterSupplyProduction">select * from water_supply_production</select>
- 使用注解开发项目:实际上就是将xxxMapper.xml与xxxMapper整合在一起
如果把xxxMapper.xml与xxxMapper整合在一起,那就应该把Mapper映射器位置改成xxxMapper接口位置
<mappers><mapper class="com.itheima.dao.UserMapper"></mapper></mappers>
public interface UserMapper {@Select("select * from user")List<User> getUsers();//方法存在多个参数,所有的参数前面必须加上@param("id")@Select("select * from user where id = #{id}")User getUserById(@Param("id") int id);@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{paswword})")int addUser(User user);@Update("update user set name=#{name},pwd=#{password} where id=#{id}")int updateUser(User user);@Delete("delete from user where id=#{id}")int deleteUser(@Param("id") int id);
}
- MyBatis的二级缓存
在MyBatis-config.xml核心配置文件开启二级缓存支持
<!-- 配置二级缓存 -->
<settings> <!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/>
</settings>
在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking = true)
public interface UserMapper{}
相关文章:

什么是MyBatis?无论是基础教学还是技术精进,你都应该看这篇MyBatis
文章目录学习之前,跟你们说点事情,有助于你能快速看完文章一、先应用再学习,代码示例1. 第一个MyBatis程序2. MyBatis整合Spring3. SpringBoot整合MyBatis二、MyBatis整体流程,各组件的作用域和生命周期三、说说MyBatis-config.xm…...

【编程基础之Python】10、Python中的运算符
【编程基础之Python】10、Python中的运算符Python中的运算符算术运算符赋值运算符比较运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级运算符总结Python中的运算符 Python是一门非常流行的编程语言,它支持各种运算符来执行各种操作。这篇文章将详细介绍…...

Android的基础介绍
一、Android介绍 Android是一种基于Linux的自由及开放源代码的操作系统,Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。 Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序——…...

用户登录请求100w/每天, JVM如何调优
用户登录请求100w/每天, JVM如何调优 大概可以分为以下8个步骤。 Step1:新系统上线如何规划容量? 1.套路总结 任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数,这个容量与资源规划并不仅仅是系统架构师的随意估算的&am…...

C/C++每日一练(20230306)
目录 1. 判断素数的个数 ☆ 2. 分隔链表 ★★ 3. 数据流的中位数 ★★ 1. 判断素数的个数 在一个数组A中存放100个数据,用子函数判断该数组中哪些是素数,并统计该素数的个数,在主函数中输出该素数的个数。 代码: #includ…...

多线程的创建、Thread类、线程安全、同步、通信
目录 多线程的创建 方式一:继承Thread类 方式二:实现Runnable接口 方式三:JDK 5.0新增:实现Callable接口 Thread的常用方法 线程安全 线程安全问题是什么、发生的原因 线程安全问题案例模拟 线程同步 同步思想概述 方式…...

GraphPad Prism v9.5.1.733 科研绘图软件多语言
GraphPad Prism集生物统计、曲线拟合和科技绘图于一体,其所具有的功能均非常实用和精炼,包括了一些特色的功能,如ROC曲线分析、Bland-Altman分析等;曲线拟合功能是GraphPad Prism8 汉化版超越其他统计软体的制胜法宝,GraphPad Prism8 汉化版的线性/非线性拟合功能使用操作…...

基于intel soc+fpga智能驾驶舱和高级驾驶辅助系统软件设计(三)
虚拟化操作系统介绍 车载平台有逐渐融合的趋势,车载 SoC 的计算性能和应用快速增长,面临着多种应用在 多个显示子系统融合在一起的问题,这就要求平台运行多个操作系统。虚拟化(Virtualization) 技术飞速发展࿰…...

什么?年终奖多发1块钱竟要多缴9.6W的税
对于大多数的工薪阶级来说,目前现行的个人所得税适用于全年累计收入一次性税收优惠。 有可能有的人不理解一次性税收优惠是什么意思,所以这里我首先解释下什么是一次性税收优惠,然后在讲一下为什么明明公司多发了钱,到手反而会更…...
动态绑定右键菜单控件
一、动态绑定右键菜单控件 /// <summary> /// 通过递归获取执行控件 /// </summary> /// <typeparam name"T"></typeparam> /// <param name"c"></param> /// <pa…...

JavaScript基础三、数据类型
零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…...

Python 随机漫步
目录 1. 创建 RandomWalk 类 2. 选择方向 3. 绘制随机漫步图 4. 总结 本篇博客将使用 Python 来 生成随机漫步数据,再使用 Matplotlib 库,将以引人注目的方式将这些数据呈现出来。 随机漫步 顾名思义就是随机走出的步伐,它是这样行…...

Spark SQL优化机制
Spark SQL优化机制Spark SQLCatalyst 优化器逻辑优化物理优化TungstenUnsafe RowWSCGRDD 缺点 : RDD的算子都是高阶函数 ,Spark Core 不知函数内的操作,只能闭包形式发给 Executors, 无法优化 DataFrame 不同点: 数据的表示形式…...

十五、Spring中的八大模式
1 简单工厂模式 BeanFactory的getBean()方法,通过唯一标识来获取Bean对象。是典型的简单工厂模式(静态工厂模式); 2 工厂方法模式 FactoryBean是典型的工厂方法模式。在配置文件中通过factory-method属性来指定工厂方法&#x…...

GrabCut算法、物体显著性检测
图割GraphCus算法。利用颜色、纹理等信息对GraphCut进行改进,形成效果更好的GrabCut算法。 对图像的目标物体和背景建立一个K维的全协方差高斯混合模型。 其中,单高斯模型的概率密度函数用公式表示为: 高斯混合模型可表示为n个单高斯模型的概…...

亚马逊、速卖通、lazada店铺一直不出单,没流量怎么办?
近几年,跨境电商入驻的卖家越来越多,平台的流量越来越分散,导致店铺没有流量没有订单的情况经常发生,因此卖家对店铺的优化尤为主要。 对于亚马逊卖家来说,几乎每天都会问虽然我把我的产品放在货架上,但没…...

深度剖析C语言符号篇
致前行的人: 人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定冷静,学习如何从慌乱中找到生机。 目录 1.注释符号: 2.续接符和转义符: 3.回车与换行…...
【学习总结】ORBSLAM3使用自己相机数据
本文仅用于自己学习总结。本文档记录如何修改ORBSLAM3的接口,用自己的图片和数据。 单目视觉,无IMU,离线数据运行的配置过程 euroc_examples.sh 首先从euroc_examples.sh这个运行指令改。这个文件在最新版的代码中被删掉了,但通…...

C++单例模式实现
目录 1.提出的需求 2.如何定义一个类,使得这个类最多只能创建一个对象? 3.代码 4.小结 C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 1.提出的需求 在架构设计时&am…...

343. 整数拆分
343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10 输出: 36…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...