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)
已被提交的事务对数据库的修改应该永久保存在数据库中

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

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

相关文章

二进制 Deploy Kubernetes v1.23.17 超级详细部署

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

什么是 BSD 协议?

BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用&#xff0c;修改源代码&#xff0c;也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码&#xff0c;或者以BSD协议代码为基础做二次开发自己的产品时&#xff0c;需要满足三个条件&…

Git的ssh方式如何配置,如何通过ssh方式拉取和提交代码

git的ssh配置 HTTPS和SSH的区别设置SSH方式配置单个仓库配置账户公钥 大家通过git拉取代码的时候&#xff0c;一般都是通过http的方式&#xff0c;简单方便。但是细心的童鞋肯定也注意到Git也是支持ssh方式的。可能很多人也试过使用这个方式&#xff0c;但是好像没有那么简单。…

Python爬虫实战案例——第五例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 目标&#xff1a;采集三国杀官网的精美壁纸 地址&#xff1a;aHR0cHM6Ly93d3…

IDEA2023.2.1中创建第一个Tomcat的web项目

首先&#xff0c;创建一个普通的java项目。点击【file】-【new】-【project】 创建一个TomcatDemo项目 创建如下图 添加web部门。点击【file】-【project structure】 选择【modules】-选中项目“TomcatDemo” 点击项目名上的加号【】&#xff0c;添加【web】模块 我们就会发现…

网络协议学习地图分享

最近在回顾网络知识点的时候&#xff0c;发现华为数通有关报文格式及网络协议地图神仙网站&#xff0c;这里涵盖了各个协议层及每个协议层对应的协议内容&#xff0c;最人性的化的一点是点击每个单独的协议可以跳转到该协议详细报文格式页面&#xff0c;有对应的说明和解释&…

单片机内存管理

源码说明 源码包含memory.h 和 memory.c 两个文件&#xff08;嵌入式C/C代码的“标配”&#xff09;&#xff0c;其源码中包含重要的注释。 memory.h文件包含结构体等定义&#xff0c;函数API申明等&#xff1b; memory.c文件是实现内存管理相关API函数的原型。 memory.h …

【JAVA-Day22】深度解析 Java 的包机制

深度解析 Java 的包机制 深度解析 Java 的包机制摘要引言一、什么是包机制1.1 包的定义1.2 包的命名规范1.3 包的声明1.4 包的导入1.5 包的访问权限1.6 包的层次结构1.7 包的目录结构 二、包的命名冲突问题三、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默…

​全球人类读书会《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉博士著作

​全球人类读书会《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉博士著作

【小吉送书—第二期】阿里后端开发:抽象建模经典案例

文章目录 0.引言1.抽象思维2.软件世界中的抽象2.1 命名抽象2.2 分层抽象2.3 原则抽象 3. 经典抽象案例3.1 方案一&#xff1a;战术抽象&#xff0c;多快好省&#xff0c;跑步前进3.2 方案二&#xff1a;深入分析&#xff0c;透过表象&#xff0c;探寻本质 5. 推荐一本书&#x…

Mac专用投屏工具AirServer 7 .27 for Mac中文免费激活版

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具&#xff0c;能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App&#xff0c;从 iOS 设备无线传送到 Mac 电脑的屏幕上&#xff0c;把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…

Redis:分布式锁误删原因分析

一、线程阻塞 例如&#xff0c;线程一获取分布式锁&#xff0c;但是线程一阻塞时间过长&#xff0c;导致锁超时释放。此时线程二获取分布式锁。当线程一阻塞结束后&#xff0c;释放分布式锁&#xff0c;但是释放的却是线程二的锁。此时线程二就不安全了&#xff0c;线程三也可…

destoon关于archiver归档的性能优化

今天在处理一个项目时候发现archiver单个模块归档超过百万数据&#xff0c;打开速度就特慢&#xff0c;所以打开archiver下index.php文件进行分析&#xff0c;发现有句sql作怪&#xff0c;查询需要三四分钟&#xff0c;所以要修改这个。 $result $db->query("SELECT …

【Linux】Linux工具

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 一、Linux安装软件&#xff1a; 1.yum安装 2.Linux和Windows文件互传 问题: 3.yum卸载软件 二、vim编辑器 1.命令模式 2.vim配置项说明 3.vim操作总结 一、Linux安装软件&#…

【Vue】快速入门案例与工作流程的讲解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue快速入门》。&#x1f…

win部署CRM

win部署crm&#xff09; 1.phpstudy2.composer3.代码4.其他配置 周末锴哥让我帮他部署了一个CRM&#xff0c;写个教程&#xff0c;方便之后他用。锴哥用的是 NxCrm&#xff0c;先把代码下下来。 1.phpstudy 1.首先是下载小皮面板&#xff0c;配置php的环境。这里面下载了php8…

UML类图

优质博客&#xff1a;IT-BLOG-CN UML&#xff08;Unidied Modeling Language&#xff09;统一建模语言&#xff1a;用来设计软件的可视化建模语言&#xff0c;能够表达软件设计中的动态与静态信息。UML定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部…

外星人入侵游戏-(创新版)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Improving 3D Imaging with Pre-Trained Perpendicular 2D Diffusion Models

使用预先训练的垂直 2D 扩散模型改进 3D 成像 论文链接&#xff1a;https://arxiv.org/abs/2303.08440 项目链接&#xff1a;https://github.com/hyn2028/tpdm Abstract 扩散模型由于其众多的优点已经成为一种流行的图像生成和重建方法。然而&#xff0c;大多数基于扩散的逆…

YOLOv8学习

1 YOLOv8训练自己的数据集 1.1 部署和运行 1.1.1 第一步&#xff0c;下载代码 源码地址 1.1.2 第二步&#xff0c;创建环境 默认已经安装好conda conda create -n yolopy38 python3.8conda activate yolopy38安装所需要的包&#xff0c;先cd到代码目录下 pip install -r…