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

MyBatis初级

文章目录

  • 一、mybatis
    • 1、概念
    • 2、JDBC缺点
      • 2.1、之前jdbc操作
      • 2.2 、原始jdbc操作的分析
    • 3、mybatis的使用
      • 3.1、导入maven依赖
      • 3.2、新建表
      • 3.3、实体类
      • 3.4、编写mybatis的配置文件
      • 3.5、编写接口 和 映射文件
      • 3.6、编写测试类
      • 3.7、注意事项
    • 4、代理方式开发
    • 5、mybatis和spring整合
      • 5.1、开发步骤
        • 5.1.1、导入maven依赖
        • 5.1.2、创建账户的实体类 Account
        • 5.1.3、创建mapper接口和对应的xml文件
        • 5.1.4、Service接口类和实现类
        • 5.1.5、数据库配置 db.properties
        • 5.1.6、spring配置文件
        • 5.1.7、mybatis的配置文件
        • 5.1.8、测试功能
  • 二、整合的总结
  • 三、mybatis缓存
    • 1、一级缓存
    • 2、二级缓存
  • 四、隔离级别
  • 五、事务

一、mybatis

1、概念

  • 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!
  • ORM(Object Relational Mapping 对象关系映射):指的是持久化数据和实体对象的映射模式。
  • mybatis:mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
  • mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
  • 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。在这里插入图片描述

2、JDBC缺点

2.1、之前jdbc操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.2 、原始jdbc操作的分析

  • 原始 JDBC 的操作问题分析

    1. 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能。
    2. sql语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护。
    3. 查询操作时,需要手动将结果集中的数据封装到实体对象中。
    4. 增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符。 
    
  • 原始 JDBC 的操作问题解决方案

    1. 使用数据库连接池初始化连接资源。 
    2. 将 sql 语句抽取到配置文件中。 
    3. 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射    
    
  1. 使用数据库连接池初始化连接资源。
  2. 将sql语句抽取到配置文件中。
  3. 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射

3、mybatis的使用

①添加MyBatis的maven包

②创建user数据表

③编写User实体类

④编写核心文件MyBatisConfig.xml

⑤编写映射文件UserMapper.xml 和 UserMapper接口

⑥编写测试类

3.1、导入maven依赖

  <!--    数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><!--    日志依赖--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

3.2、新建表

在这里插入图片描述

CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) DEFAULT NULL,
password varchar(255) DEFAULT NULL,
age int(11) DEFAULT NULL,
phone varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

3.3、实体类

public class User {private int id;private String username;private String password;private String phone;private int age;set get 方法
}

3.4、编写mybatis的配置文件

可以参考官方文档

https://mybatis.org/mybatis-3/zh/getting-started.html

# 数据库信息 db.propertiesdriver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/linjiu?useUnicode=true&characterEncoding=utf-8
username=root
password=root# 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration 核心根标签-->
<configuration><!--引入数据库连接的配置文件--><properties resource="db.properties"/><!--配置LOG4J--><settings><setting name="logImpl" value="log4j"/></settings><!--起别名--><typeAliases><typeAlias type="com.xinzhi.model.User" alias="user"/><!--<package name="com.xinzhi.model"/>--></typeAliases><!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个--><environments default="mysql"><!--environment配置数据库环境  id属性唯一标识--><environment id="mysql"><!-- transactionManager事务管理。  type属性,采用JDBC默认的事务--><transactionManager type="JDBC"></transactionManager><!-- dataSource数据源信息   type属性 连接池--><dataSource type="POOLED"><!-- property获取数据库连接的配置信息 --><property name="driver" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></dataSource></environment></environments><!-- mappers引入映射配置文件 --><mappers><!-- mapper 引入指定的映射配置文件   resource属性指定映射配置文件的名称 --><mapper resource="UserMapper.xml"/></mappers>
</configuration># 日志文件  log4j.properties
# Global logging configuration
# ERROR WARN INFO DEBUG
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3.5、编写接口 和 映射文件

public interface UserMapper {List<User> selectAll();User selectById(int id);
}//映射文件  
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatisDTD约束-->
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--mapper:核心根标签namespace属性:名称空间
-->
<mapper namespace="com.linjiu.mapper.UserMapper"><!--select:查询功能的标签id属性:唯一标识resultType属性:指定结果映射对象类型parameterType属性:指定参数映射对象类型--><select id="selectAll" resultType="user">SELECT * FROM user</select><select id="selectById" resultType="com.linjiu.model.User" parameterType="int">select * from user where id=#{id}</select>
</mapper>

mapper.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=""></mapper>

3.6、编写测试类

 @Testpublic  void main1( ) throws IOException {//加载核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获得sqlSession工厂对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//获得sqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//执行sql语句List<User> users = sqlSession.selectList("com.linjiu.mapper.UserMapper.selectAll");//打印结果System.out.println(users);User user = sqlSession.selectOne("com.linjiu.mapper.UserMapper.selectById", 1);System.out.println(user);//打印结果sqlSession.close();}
  • 注意如果是增删改需要提交事务 sqlSession.commit();
  • 如果sqlSessionFactory.openSession(true),括号中添加了true,那么就是自动提交事务。

3.7、注意事项

  • environments标签
# 事务管理器(transactionManager)- JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。- MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
# 数据源(dataSource)- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。- JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

4、代理方式开发

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象。
Mapper 接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的全限定名相同
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

   @Testpublic  void main1( ) throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();// 获取到mapper的代理对象,代理对象直接操作数据库UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectAll();System.out.println(users);User user = mapper.selectById(1);System.out.println(user);sqlSession.close();}

面试题:

​ mybatis中# 和 $的区别

5、mybatis和spring整合

5.1、开发步骤

  • 1 导入maven依赖
  • 2 创建账户的实体类
  • 3 创建mapper接口和对应的xml文件
  • 4 Service接口类和实现类
  • 5 数据库的配置文件
  • 6 spring配置文件
  • 7 mybatis的配置文件
  • 8 测试功能

5.1.1、导入maven依赖

 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.0.7.RELEASE</version></dependency><!-- 基于AspectJ的aop依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!-- spring 事务管理和JDBC依赖包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.7.RELEASE</version></dependency><!-- spring 单元测试组件包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.7.RELEASE</version></dependency><!-- 单元测试Junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- mysql数据库驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.35</version></dependency><!-- dbcp连接池的依赖包 --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><!-- mybatis和spring的整合依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.5</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build>

5.1.2、创建账户的实体类 Account

public class Account {private int id;private String name;private double money;set  get 方法
} 
CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`money` decimal(11,0) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

5.1.3、创建mapper接口和对应的xml文件

public interface AccountMapper {int update(@Param("name") String name,@Param("money") double money);double queryMoney(String name);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--mapper:核心根标签namespace属性:名称空间
-->
<mapper namespace="com.linjiu.dao.AccountMapper"><!-- 查询 --><select id="queryMoney" parameterType="string" resultType="double">SELECT money from account where name = #{name}</select><!-- 修改 --><update id="update" parameterType="account">UPDATE account SET money = #{money} WHERE name = #{name}</update></mapper>

说明:

  • @param() 当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用

  • 当配置文件中有多个参数的时候,parameterType该怎么写呢? 一般可以使用实体类,也可以使用map。底层还是使用了反射的原理,根据对象的字段去匹配数据库相应的字段

5.1.4、Service接口类和实现类

public interface IAccountService {/*** 转账功能* @param from 主动转账的人* @param to   收款的人* @param money  金额*/void transfer(String from, String to, double money);
}@Service
@Transactional
public class AccountServiceImpl implements IAccountService {@Autowiredprivate AccountMapper accountMapper;public void transfer(String from, String to, double money) {// 先查询from账户的钱double fromMoney = accountMapper.queryMoney(from);// 对from账户进行扣钱操作accountMapper.update(from, fromMoney-money);//手动制造异常System.out.println(1 / 0);// 先查询to账户的钱double toMoney = accountMapper.queryMoney(to);// 对to账户进行加钱操作accountMapper.update(to, toMoney-money);System.out.println("支付宝到账:"+money+"元");}
}

5.1.5、数据库配置 db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/linjiu?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

5.1.6、spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"><!--引入外部的配置文件--><context:property-placeholder location="classpath:db.properties"/><!--	配置数据源--><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!--	配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!--开启事务注解--><tx:annotation-driven transaction-manager="transactionManager" /><!--	xml方式配置事务,一般使用上面注解的方式,因为方便和简单,其实事务也是对业务层逻辑的增强-->
<!--	<tx:advice transaction-manager="transactionManager" id="txAdvice" >-->
<!--		<tx:attributes>-->
<!--			<tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>-->
<!--		</tx:attributes>-->
<!--	</tx:advice>-->
<!--	-->
<!--	<aop:config>-->
<!--		<aop:pointcut id="myPointCut" expression="execution(* com.soft.impl.*.*(..))"/>-->
<!--		<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointCut"/>-->
<!--	</aop:config>--><!--	配置sqlSessionFactory,主要是指定数据源,配置文件的位置--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/><property name="mapperLocations" value="classpath:mapper/*.xml"/></bean><!--	扫描mapper文件--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.linjiu.dao"/></bean><!--	组件扫描,扫描指定包下的注解--><context:component-scan base-package="com.linjiu"/></beans>

5.1.7、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><!--    开启二级缓存,默认是关闭的--><settings><setting name = "cacheEnabled" value = "true" /></settings><!--    别名--><typeAliases><package name="com.linjiu.model" /></typeAliases><!--    map.xml文件的位置指定,因为sqlsessionfactory中已经指定过了,所以可以不配置--><mappers><!--        <mapper resource="mapper/AccountMapper.xml"/>--></mappers></configuration>

5.1.8、测试功能

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AppTest {@Autowiredprivate IAccountService accountService;@Testpublic void testTransfer() throws Exception {accountService.transfer("husband", "wife", 100);}
}

说明:

  • @RunWith(SpringJUnit4ClassRunner.class) 让测试运行于Spring测试环境
  • @ContextConfiguration(locations = {“classpath:applicationContext.xml”})

二、整合的总结

  • 其实整合的目的就是把mapper对象放入到容器中。(从接口生成对象,底层还是反射)

  • 注意配置文件的加载,测试类中指定了spring的配置文件, spring的配置文件中又指定了mybatis配置文件和mapper映射文件。

三、mybatis缓存

mybatis的缓存主要是针对查询操作的

1、一级缓存

  • 一级缓存默认是开启的, SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。
  • 当调用 SqlSession 的修改,添加,删除,commit(),close()等,方法时,就会清空一级缓存。

2、二级缓存

  • 二级缓存是 mapper 映射级别的缓存, 默认是不开启的,需要手动开启二级缓存

  • 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,也就是序列化

    <!-- 开启二级缓存的支持 --> 
    <setting name="cacheEnabled" value="true"/></settings>
    

四、隔离级别

1.读未提交(Read uncommitted):脏读

脏读: 一个事务在执行的过程中读取到了其他事务还没有提交的数据

Tom的账户money=0,公司发工资把5000元打到Tom的账户上,Tom的money=money+5000元,但是该事务并未提交,而Tom正好去查看账户,发现工资已经到账,账户money=5000元,非常高兴,可是不幸的是,公司发现发给Tom的工资金额不对,应该是2000元,于是迅速回滚了事务,修改金额后,将事务提交,Tom再次查看账户时发现账户money=2000元,Tom空欢喜一场,从此郁郁寡欢,走上了不归路……

2.读已提交(Read committed):

可避免 脏读 的发生。

两次读取的数据不一样,自己事务没有提交的时候可以读取别的已经提交的事务。

Tom拿着工资卡去消费,酒足饭饱后在收银台买单,服务员告诉他本次消费1000元,Tom将银行卡给服务员,服务员将银行卡插入POS机,POS机读到卡里余额为3000元,就在Tom磨磨蹭蹭输入密码时,他老婆以迅雷不及掩耳盗铃之势把Tom工资卡的3000元转到自己账户并提交了事务,当Tom输完密码并点击“确认”按钮后,POS机检查到Tom的工资卡已经没有钱,扣款失败,Tom十分纳闷,明明卡里有钱,于是怀疑POS有鬼,和收银小姐姐大打出手,300回合之后终因伤势过重而与世长辞,Tom老婆痛不欲生,郁郁寡欢,从此走上了不归路…

3.可重复读(Repeatable read):幻读

MySql默认隔离级别。自己事务没有提交的时候,读不到别的已经提交的事务。

Tom的老婆工作在银行部门,她时常通过银行内部系统查看Tom的工资卡消费记录。2019年5月的某一天,她查询到Tom当月工资卡的总消费额为80元,Tom的老婆非常吃惊,心想“老公真是太节俭了,嫁给他真好!”,而Tom此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录并提交了事务,沉浸在幸福中的老婆查询了Tom当月工资卡消费明细一探究竟,可查出的结果竟然发现有一笔1000元的消费,Tom的老婆瞬间怒气冲天,外卖订购了一个大号的榴莲,傍晚降临,Tom生活在了水深火热之中,只感到膝盖针扎的痛…

4.串行化(Serializable ):

可避免 脏读、不可重复读、幻读 的发生。

五、事务

事务有以下特性(ACID):
1、原子性(Atomicity)
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

2、一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

3、隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

4、持久性(Durability)
已被提交的事务对数据库的修改应该永久保存在数据库中

相关文章:

MyBatis初级

文章目录 一、mybatis1、概念2、JDBC缺点2.1、之前jdbc操作2.2 、原始jdbc操作的分析 3、mybatis的使用3.1、导入maven依赖3.2、新建表3.3、实体类3.4、编写mybatis的配置文件3.5、编写接口 和 映射文件3.6、编写测试类3.7、注意事项 4、代理方式开发5、mybatis和spring整合5.1…...

Spring 学习(二)AOP

一、什么是AOP Aspect Oriented Programming&#xff0c;即面向切面编程。对一个大型项目的代码而言&#xff0c;整个系统要求关注安全检查、日志、事务等功能&#xff0c;这些功能实际上“横跨”多个业务方法。在一般的OOP编程里&#xff0c;需要在每一个业务方法内添加相关非…...

笔记1.1 计算机网络基本概念

计算机网络是通信技术与计算机技术紧密结合的产物 通信系统模型&#xff1a; 计算机网络是一种通信网络 计算机网络是互连的、自洽的计算机集合。 互连&#xff1a;互联互通 自洽&#xff1a;无主从关系 通过交换网络互连主机 Internet&#xff1a;数以百万计的互连的计算设…...

液压切管机配套用液压泵站比例阀放大器

液压切管机配套用液压泵站是液压系统的动力源&#xff0c;可按机械设备工况需要提供一定压力、流量和清洁度的工作介质。它由泵组、油箱组件、控温组件、滤油器组件及蓄能器组件等组合而成&#xff0c;液压泵站主要服务于大型管道工程。...

C++ Primer Plus 第七章笔记

目录 函数基本知识 没有返回值的函数&#xff1a;void函数 有返回值的函数&#xff1a; 函数原型 1.为什么需要函数原型&#xff1f; 2.函数原型的语法 3.函数原型的功能 按值传递函数参数 形参和实参 局部变量 参数问题 使用const指针参数 调用自身的函数&#xf…...

常用数据库的 API - 开篇

API API 这个词在大多数人看来可能和 CNS 差不多&#xff0c;前者天天听说就是用不上&#xff0c;后者天天读就是发不了。 不过&#xff0c;通过今天的一个简短介绍&#xff0c;今后 API 这个东西你就用上了&#xff0c;因为在文章最后我将会展示一个最最基础且高频的 API 使…...

C++之生成详细汇编代码(二百一十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

AIGC|当一个程序员学会用AI来辅助编程实践

一、辅助编程 作为主要以 JAVA 语言为核心的后端开发者&#xff0c;其实&#xff0c;早些时间我也用过比如 Codota、Tabnine、Github 的 Copilot、阿里的 AI Coding Assistant 等 IDEA 插件&#xff0c;但是我并没有觉得很惊奇&#xff0c;感觉就是生成一些代码片段罢了&#x…...

9.14号作业

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 有些功能&#xff0c;不会 #include <iostream>using namespace std; //创建vector类 class Vector { private:int *data;int size;int capacity; public://无参构造Vector(){}//拷贝构造Vector(c…...

【面试题】C/C++ 中指针和引用的区别

指针是一个独立的对象&#xff0c;它可以指向不同的变量或对象&#xff0c;可以重新赋值给其他变量。而引用是已存在的变量的别名&#xff0c;它必须在定义时初始化&#xff0c;并且不能重新绑定到另一个变量。指针可以是空指针&#xff08;nullptr&#xff09;&#xff0c;它不…...

spring boot 整合多数据源

多数据源产生的场景 一般情况下&#xff0c;不会有多数据源这样的场景出现&#xff0c;但老项目或者特殊需求的项目&#xff0c;可能会有这样的场景 同一个应用需要访问两个数据库不用数据库中间件的读写分离 注入数据源选择的时机 声明两个数据源实例&#xff0c;在getConnect…...

数据集成:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

xml配置文件密码特殊字符处理

错误姿势&#xff1a; 正确姿势&#xff1a;采取转义符的方式 常用转义符&#xff1a;...

遥感数据与作物模型同化

基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具&#xff0c;可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系&#xff0c;为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了…...

UI库DHTMLX Suite v8.2发布全新表单组件,让Web表单实现高度可定制!

DHTMLX Suite v8.2日前已正式发布&#xff0c;此版本的核心是DHTMLX Form&#xff0c;这个小部件接收了4个备受期待的新控件&#xff0c;如Fieldset、Avatar、Toggle和ToggleGroup。官方技术团队还为Grid和TreeGrid小部件中的页眉/页脚工具提示提供了一系列新的配置选项等。 在…...

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著...

什么是卷积002

文章目录 前言1.卷积网络和传统网络区别2.卷积神经网络整体架构1.输入层2. 卷积层3.池化层4.全连接层 5.神经网络6.经典网络1.Alexnet2. Vgg3.Resnet 残差网络-特征提取 7.感受野 前言 大纲目录 首先链接图像颜色通道 1.卷积网络和传统网络区别 右边的就是CNN&#xff0c;卷…...

黑马JVM总结(八)

&#xff08;1&#xff09;StringTable面试题 1.8 1.6时 &#xff08;2&#xff09;StringTable的位置 jvm1.6时StringTable是常量池的一部分&#xff0c;它随着常量池存储在永久代当中&#xff0c;在1.7、1.8中从永久代变成了堆中&#xff0c;为什么做这个更改呢&#xff1f…...

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位

近日&#xff0c;第二届广东省网络空间安全标准化技术委员会&#xff08;GD/TC 124&#xff09;&#xff08;以下简称省网安标委&#xff09;正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中&#xff0c;示范引领核心技术攻关、创新产品…...

Nginx配置指南:如何定位、解读与优化Linux上的Nginx设置

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…...

辉瑞与吉利德科学:制药巨头的新冠病毒之战

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;猛兽财经认为&#xff0c;华尔街低估了辉瑞&#xff08;PFE&#xff09;和吉利德科学&#xff08;GILD&#xff09;的前景&#xff0c;因为它们在开发新冠病毒疫苗和药物方面都…...

x86架构基础汇编知识

​ 通用寄存器 EAX 32位 函数返回值 AX 低16位 AH 高八位 AL 低八位 EBX 32位 ECX 32位 循环次数&#xff0c;this指针 EDX 32位 EBP 32位 栈底寄存器 ESP 32位 栈顶寄存器 ESI 源索引寄存器 EDI 目标索引寄存器 EIP 无法直接通过汇编操作 例子 mov al&#xff0c;0xff …...

ThreadLocal的原理

ThreadLocal是Java中的一个类&#xff0c;它提供了线程本地变量的功能。每个线程都可以独立地访问自己的ThreadLocal变量&#xff0c;并且不会受到其他线程的干扰。 public class ThreadLocal<T> { ThreadLocal的原理是通过使用一个ThreadLocalMap来存储每个线程的变量副…...

Chrome 108版(64-bit 108.0.5359.125)网盘下载

还在用Selenium的朋友们注意了&#xff0c;目前Chrome的最新版是116&#xff0c;而官方的Chromedriver只支持到115版。 可惜Google不提供旧版Chrome的下载方式&#xff0c;需要旧版的很难回去了。如果真的想要旧版的Chrome&#xff0c;只能民间自救。 我在2022年12月备份了C盘…...

Mars3d插件参考开发教程并在相关页面引入

问题场景&#xff1a; 1.在使用Mars3d热力图功能时&#xff0c;提示mars3d.layer.HeatLayer is not a constructor 问题原因: 1.mars3d的热力图插件mars3d-heatmap没有安装引用。 解决方案&#xff1a; 1.参考开发教程&#xff0c;找到相关的插件库&#xff1a;Mars3D 三维…...

Windows 性能突然打鸡血,靠 Bug 修复了多年顽疾

要说 的 Bug 集中地&#xff0c;当属资源管理器。 速度缓慢、卡顿、崩溃&#xff0c;不同设备、不同版本的用户都有不同的感受。 严格来说&#xff0c;这其实是 Windows 的传统艺能&#xff0c;要完美修复可不容易。 而作为小老弟的文件资源管理器&#xff0c;时不时来个无响…...

亚马逊封买家账号的原因有哪些

亚马逊可能封锁买家账号的原因有多种&#xff0c;主要是出于保护市场和维护平台秩序的考虑。以下是一些可能导致亚马逊封锁买家账号的常见原因&#xff1a; 1、涉及违规行为&#xff1a;如果买家违反了亚马逊的使用政策&#xff0c;如发表虚假评价、滥用退货政策、欺诈或盗窃等…...

1.0零基础尝试DCM通讯(c-store)

前言 本项目是对医院放疗及相关设备的互通互联。对dcm文件及数据协议是本项目的基础。 今天在项目组成员支持下,对dcm通讯进行了初步的尝试,有人之路,这个过程可以说是非常愉快,于是乎准备将这个愉快的过程记录,方便自己查阅和后来人。 c-store 本次的安装和测试使用的…...

vue之封装tab类组件

vue之封装tab类组件 vue之封装tab类组件CSS样式方面JS方面 vue之封装tab类组件 需求&#xff1a;点击【上一步】、【下一步】按钮&#xff0c;切换tab&#xff0c;且有淡入浅出的动画。 CSS样式方面 <div class"parent"><div class"childDiv" id…...

固定资产管理中净值怎么算

在资产管理的领域中&#xff0c;我们经常听到“净值”这个词。然而&#xff0c;对于许多人来说&#xff0c;净值的概念仍然模糊不清。本文将试图揭示固定资产管理的净值计算方法&#xff0c;并提供一些创新的观点。  我们需要明确什么是净值。在财务术语中&#xff0c;净值是…...

wordpress 摘要 插件/网页设计流程步骤

参考http://www.manning.com/hatcher3 或者看《Lucene in action》第二版中关于Hot backup部分&#xff0c;也可以直接采用下面的代码。 为什么要热备份 Lucene对索引是没有保证的&#xff08;说的有点别扭原文用词是guarantee&#xff09;&#xff0c;意思是因为各种原因导致的…...

做招聘网站价格/自助建站网站模板

目录 零、前言 一、算法思想 二、实现思路 四、源码 零、前言 今天我学习了二分查找&#xff08;折半查找法&#xff09;&#xff0c;它是用于在有序集合中查找某一元素的便捷算法&#xff1b;算法思想易于理解&#xff0c;很多同学看了就觉得自己会了&#xff0c;但是约易…...

网站建设公司做前端/如何做好市场推广

7.1 问题 编写一个remote_comm.py脚本&#xff0c;实现以下功能&#xff1a; 在文件中取出所有远程主机IP地址 在shell命令行中接受远程服务器IP地址文件、远程服务器密码以及在远程主机上执行的命令 通过多线程实现在所有的远程服务器上并发执行命令 7.2 步骤 实现此案例需要…...

wordpress实现选项卡/百度热词指数

主机发现 靶机 nmap扫描端口 扫描服务 -sT 说明用tcp协议&#xff08;三次握手&#xff09;扫描 -sV扫描版本 O扫描系统 UDP扫描 漏洞脚本扫描 web渗透 Squid代理分析 检索信息 可以判断是代理 3128端口与代理有关 对3128端口进行目录爆破 dirb爆破 goboster爆破 没法扫…...

广州网站建设制作价格/西安做网页的公司

ember 动态切换组件本文由Edwin Reynoso和Nilson Jacques进行了同行评审。 感谢所有SitePoint的同行评审员使SitePoint内容达到最佳状态&#xff01; 组件是Ember应用程序的重要组成部分。 它们允许您定义自己的&#xff0c;特定于应用程序HTML标记&#xff0c;并使用JavaScri…...

海口市住房和城乡建设局网站/seo搜狗

目前滑动指示器最著名的是JakeWarton的ViewpagerIndicator&#xff0c;用别人的东西固然方便&#xff0c;但是也带来很多使用上的疑惑&#xff0c;这篇博客&#xff0c;我们使用HorizontalScrollView自己写一个viewPager指示器。 这里首先说一下很多自己写的indicator只限于可…...