【JavaEE Spring】MyBatis 操作数据库(基础操作)

MyBatis 操作数据库

  • 本节目标
  • 前⾔
  • JDBC 操作⽰例回顾
  • 1. 什么是MyBatis?
  • 2. MyBatis⼊⻔
    • 2.1 准备⼯作
      • 2.1.1 创建⼯程
      • 2.1.2 数据准备
    • 2.2 配置数据库连接字符串
    • 2.3 写持久层代码
    • 2.4 单元测试
  • 3. MyBatis的基础操作
    • 3.1 打印⽇志
    • 3.2 参数传递
    • 3.3 增(Insert)
    • 3.4 删(Delete)
    • 3.5 改(Update)
    • 3.6 查(Select)
      • 3.6.1 起别名
      • 3.6.2 结果映射
      • 3.6.3 开启驼峰命名(推荐)
  • 4. MyBatis XML配置⽂件
    • 4.1 配置连接字符串和MyBatis
    • 4.2 写持久层代码
      • 4.2.1 添加 mapper 接⼝
      • 4.2.2 添加 UserInfoXMLMapper.xml
      • 4.2.3 单元测试
    • 4.3 增删改查操作
      • 4.3.1 增(Insert)
      • 4.3.2 删(Delete)
      • 4.3.3 改(Update)
      • 4.3.4 查(Select)
  • 5. 其他查询操作
    • 5.1 多表查询
      • 5.1.1 准备⼯作
      • 5.1.2 数据查询
    • 5.2 #{} 和 ${}
    • 5.3 排序功能
    • 5.4 like 查询

本节目标

  1. 使⽤MyBatis完成简单的增删改查操作, 参数传递.
  2. 掌握MyBatis的两种写法: 注解 和 XML⽅式
  3. 掌握MyBatis 相关的⽇志配置

前⾔

在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层,即:Controller、Service、Dao .

之前的案例中,请求流程如下: 浏览器发起请求, 先请求Controller, Controller接收到请求之后, 调⽤Service进⾏业务逻辑处理, Service再调⽤Dao, 但是Dao层的数据是Mock的, 真实的数据应该从数据库
中读取.

我们学习MySQL数据库时,已经学习了JDBC来操作数据库, 但是JDBC操作太复杂了.

JDBC 操作⽰例回顾

  1. 创建数据库连接池 DataSource
  2. 通过 DataSource 获取数据库连接 Connection
  3. 编写要执⾏带 ? 占位符的 SQL 语句
  4. 通过 Connection 及 SQL 创建操作命令对象 Statement
  5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
  6. 使⽤ Statement 执⾏ SQL 语句
  7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量
  8. 处理结果集
  9. 释放资源

问题提出:

对于 JDBC 来说,整个操作⾮常的繁琐,我们不但要拼接每⼀个参
数,⽽且还要按照模板代码的⽅式,⼀步步的操作数据库,并且在每次操作完,还要⼿动关闭连接等,⽽所有的这些操作步骤都需要在每个⽅法中重复书写. 那有没有⼀种⽅法,可以更简单、更⽅便的操作数据库呢?

答案是肯定的,这就是我们要学习 MyBatis 的真正原因,它可以帮助我们更⽅便、更快速的操作数据库.

1. 什么是MyBatis?

  • MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发。

  • MyBatis 官网介绍

  • 持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的.在这里插入图片描述
    简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具

2. MyBatis⼊⻔

Mybatis操作数据库的步骤:

  1. 准备⼯作(创建springboot⼯程、数据库表准备、实体类)
  2. 引⼊Mybatis的相关依赖,配置Mybatis(数据库连接信息)
  3. 编写SQL语句(注解/XML)
  4. 测试

2.1 准备⼯作

2.1.1 创建⼯程

创建springboot⼯程,并导⼊ mybatis的起步依赖、mysql的驱动包在这里插入图片描述
项⽬⼯程创建完成后,⾃动在pom.xml⽂件中,导⼊Mybatis依赖和MySQL驱动依赖

<!--Mybatis 依赖包-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version>
</dependency>
<!--mysql驱动包-->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

2.1.2 数据准备

创建⽤⼾表, 并创建对应的实体类User

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[⽤⼾表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`username` VARCHAR ( 127 ) NOT NULL,`password` VARCHAR ( 127 ) NOT NULL,`age` TINYINT ( 4 ) NOT NULL,`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',`phone` VARCHAR ( 15 ) DEFAULT NULL,`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; 
-- 添加⽤⼾信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

实体类的属性名与表中的字段名⼀⼀对应

import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

2.2 配置数据库连接字符串

Mybatis中要连接数据库,需要数据库相关参数配置

  • MySQL驱动类
  • 登录名
  • 密码
  • 数据库连接字符串

如果是application.yml⽂件, 配置内容如下:

#数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

2.3 写持久层代码

在项⽬中, 创建持久层接⼝UserInfoMapper
在这里插入图片描述

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserInfoMapper {//查询所有⽤⼾@Select("select username, `password`, age, gender, phone from userinfo")public List<UserInfo> queryAllUser();
}

Mybatis的持久层接⼝规范⼀般都叫 XxxMapper
@Mapper注解:表⽰是MyBatis中的Mapper接⼝

  • 程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理
  • @Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容.

2.4 单元测试

在创建出来的SpringBoot⼯程中,在src下的test⽬录下,已经⾃动帮我们创建好了测试类 ,我们可以直接使⽤这个测试类来进⾏测试.

在这里插入图片描述

测试类上添加了注解 @SpringBootTest,该测试类在运⾏时,就会⾃动加载Spring的运⾏环境.我们通过@Autowired这个注解, 注⼊我们要测试的类, 就可以开始进⾏测试了

运⾏结果如下:
在这里插入图片描述

返回结果中, 可以看到, 只有SQL语句中查询的列对应的属性才有赋值

3. MyBatis的基础操作

3.1 打印⽇志

在Mybatis当中我们可以借助⽇志, 查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果

在配置⽂件中进⾏配置即可

配置MyBatis打印日志

mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

重新运⾏程序, 可以看到SQL执⾏内容, 以及传递参数和执⾏结果
在这里插入图片描述

3.2 参数传递

需求: 查找id=4的⽤⼾,对应的SQL就是: select * from userinfo where id=4

解决⽅案:在queryById⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句

使⽤ #{} 的⽅式获取⽅法中的参数

如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…} ⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致

在这里插入图片描述

3.3 增(Insert)

在这里插入图片描述
在这里插入图片描述
返回主键
Insert 语句默认返回的是 受影响的⾏数
但有些情况下, 数据插⼊之后, 还需要有后续的关联操作, 需要获取到新插⼊数据的id

⽐如订单系统
当我们下完订单之后, 需要通知物流系统, 库存系统, 结算系统等, 这时候就需要拿到订单ID

如果想要拿到⾃增id, 需要在Mapper接⼝的⽅法上添加⼀个Options的注解

    // 插入一条信息@Options(useGeneratedKeys = true,keyProperty = "id") // 获取自增主键 ID@Insert("insert into userinfo (username,password,age,gender,phone ) values(#{username},#{password},#{age},#{gender},#{phone})")public Integer insert(UserInfo userInfo);
  • useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 etGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false.
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)

测试代码

在这里插入图片描述
运⾏结果:
在这里插入图片描述

3.4 删(Delete)

在这里插入图片描述

3.5 改(Update)

在这里插入图片描述

3.6 查(Select)

我们在上⾯查询时发现, 有⼏个字段是没有赋值的, 只有Java对象属性和数据库字段⼀模⼀样时, 才会进⾏赋值

接下来我们多查询⼀些数据

@Select("select id, username, `password`, age, gender, phone, delete_flag, 
create_time, update_time from userinfo")
List<UserInfo> queryAllUser();

查询结果:
在这里插入图片描述
从运⾏结果上可以看到, 我们SQL语句中, 查询了delete_flag, create_time, update_time, 但是这⼏个属性却没有赋值.

MyBatis 会根据⽅法的返回结果进⾏赋值

  • ⽅法⽤对象 UserInfo接收返回结果, MySQL 查询出来数据为⼀条, 就会⾃动赋值给对象.
  • ⽅法⽤List接收返回结果, MySQL 查询出来数据为⼀条或多条时, 也会⾃动赋值给List.
  • 但如果MySQL 查询返回多条, 但是⽅法使⽤UserInfo接收, MyBatis执⾏就会报错.

原因分析:
当⾃动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略⼤⼩写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性在这里插入图片描述
解决办法:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

3.6.1 起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样
在这里插入图片描述

3.6.2 结果映射

在这里插入图片描述
如果其他SQL, 也希望可以复⽤这个映射关系, 可以给这个Results定义⼀个名称在这里插入图片描述
使⽤ id 属性给该 Results 定义别名, 使⽤ @ResultMap 注解来复⽤其他定义的 ResultMap

在这里插入图片描述

3.6.3 开启驼峰命名(推荐)

mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换

驼峰命名规则: abc_xyz => abcXyz

  • 表中字段名:abc_xyz
  • 类中属性名:abcXyz

Java 代码不做任何处理

    // 查询所有用户@Select("select * from userinfo")public List<UserInfo> queryAllUser();

在这里插入图片描述

4. MyBatis XML配置⽂件

Mybatis的开发有两种⽅式:

  1. 注解
  2. XML

上⾯学习了注解的⽅式, 接下来我们学习XML的⽅式

使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中.

MyBatis XML的⽅式需要以下两步:

  1. 配置数据库连接字符串和MyBatis
  2. 写持久层代码

4.1 配置连接字符串和MyBatis

此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置。

如果是application.yml⽂件, 配置内容如下:

#数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
#配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:mapper-locations: classpath:mapper/**Mapper.xml

4.2 写持久层代码

持久层代码分两部分

  1. ⽅法定义 Interface
  2. ⽅法实现: XXX.xml

在这里插入图片描述

4.2.1 添加 mapper 接⼝

数据持久层的接⼝定义:

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserInfoXMlMapper {List<UserInfo> queryAllUser();
}

4.2.2 添加 UserInfoXMLMapper.xml

数据持久成的实现,MyBatis 的固定 xml 格式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoMapper"></mapper>

创建UserInfoXMLMapper.xml, 路径参考yml中的配置
在这里插入图片描述
查询所有⽤⼾的具体实现 :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserInfoXMlMapper"><select id="queryAllUser" resultType="com.example.demo.model.UserInfo">select username,`password`, age, gender, phone from userinfo</select>
</mapper>

以下是对以上标签的说明:

  • <mapper> 标签:需要指定 namespace 属性,表⽰命名空间,值为 mapper 接⼝的全限定名,包括全包名.类名。
  • <select> 查询标签:是⽤来执⾏数据库的查询操作的:
    • id :是和 Interface (接⼝)中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法。
    • resultType :是返回的数据类型,也就是开头我们定义的实体类.

在这里插入图片描述

4.2.3 单元测试

@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid queryAllUser() {List<UserInfo> userInfoList = userInfoMapper.queryAllUser();System.out.println(userInfoList);}
}

运⾏结果如下:

在这里插入图片描述

4.3 增删改查操作

接下来,我们来实现⼀下⽤⼾的增加、删除和修改的操作.

4.3.1 增(Insert)

UserInfoMapper接⼝:

Integer insertUser(UserInfo userInfo);

UserInfoMapper.xml实现

<insert id="insertUser">insert into userinfo (username, `password`, age, gender, phone)values (#{username}, #{password}, #{age}, #{gender}, #{phone})
</insert>

返回⾃增 id

接⼝定义不变, Mapper.xml 实现 设置useGeneratedKeys 和keyProperty属性

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, `password`, age, gender, phone)values (#{username}, #{password}, #{age}, #{gender}, #{phone})
</insert>

4.3.2 删(Delete)

UserInfoMapper接⼝:
在这里插入图片描述
UserInfoMapper.xml实现:
在这里插入图片描述

4.3.3 改(Update)

在这里插入图片描述

4.3.4 查(Select)

同样的, 使⽤XML 的⽅式进⾏查询, 也存在数据封装的问题

解决办法和注解类似:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

接下来看下xml如果来写结果映射

在这里插入图片描述
在这里插入图片描述

5. 其他查询操作

5.1 多表查询

多表查询和单表查询类似, 只是SQL不同⽽已

5.1.1 准备⼯作

上⾯建了⼀张⽤⼾表, 我们再来建⼀张⽂章表, 进⾏多表关联查询.

⽂章表的uid, 对应⽤⼾表的id.

数据准备

-- 创建⽂章表
DROP TABLE
IF EXISTS articleinfo;CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR (100) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT (4) DEFAULT 0 COMMENT '0-正常, 1-删除',create_time DATETIME DEFAULT now(),update_time DATETIME DEFAULT now()
) DEFAULT charset 'utf8mb4';-- 插⼊测试数据
INSERT INTO articleinfo (title, content, uid)
VALUES('Java', 'Java正文', 1)

对应Model:

@Data
public class ArticleInfo {private Integer id;private String title;private String content;private Integer uid;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

5.1.2 数据查询

需求: 根据uid查询作者的名称等相关信息

SQL:

SELECTta.id, ta.title, ta.content,ta.uid,tb.username,tb.age,tb.genderFROMarticleinfo AS taLEFT JOIN userinfo AS tb ON ta.uid = tb.id;

补充实体类:
在这里插入图片描述
在这里插入图片描述

5.2 #{} 和 ${}

MyBatis 参数赋值有两种⽅式, 咱们前⾯使⽤了 #{} 进⾏赋值, 接下来我们看下⼆者的区别

  • #{} 处理的预编译 SQL, 使用占位符 ? 进行站位的
  • ${} 是直接拼接在SQL 后面
  • #{} 可以对于字符串类型, 会自动加上 ‘’ 分号, ${} 不会

#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别.

  1. 性能更⾼
    绝⼤多数情况下, 某⼀条 SQL 语句可能会被反复调⽤执⾏, 或者每次执⾏的时候只有个别的值不同(⽐如 select 的 where ⼦句值不同, update 的 set ⼦句值不同, insert 的 values 值不同). 如果每次都需要经过上⾯的语法解析, SQL优化、SQL编译等,则效率就明显不⾏了.在这里插入图片描述
    预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译(只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率

  2. 更安全(防⽌SQL注⼊)
    SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。

由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击。

sql 注⼊代码: ' or 1='1

在这里插入图片描述
在这里插入图片描述
可以看出来, 查询的数据并不是⾃⼰想要的数据. 所以⽤于查询的字段,尽量使⽤ #{} 预查询的⽅式

5.3 排序功能

排序的 desc 和 asc, 使用${} 直接拼接即可

5.4 like 查询

在这里插入图片描述

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

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

相关文章

太赞了!微信自动回复法宝,让沟通更高效!

如今&#xff0c;微信已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;对于一些有多个微信账号的人说&#xff0c;常常会因为微信号太多&#xff0c;消息太多没能及时回复&#xff0c;或是客户咨询的问题很多都差不多&#xff0c;每次都要复制粘贴很是麻烦。 要想一…

记录yolov8_obb训练自己的数据集

一.数据集制作 1.标注软件&#xff1a;roLabelImg roLabelImg是基于labelImg改进的&#xff0c;是用来标注为VOC格式的数据&#xff0c;但是在labelImg的基础上增加了能够使标注的框进行旋转的功能。 2.数据格式转换 2.1 xml转txt # 文件名称 &#xff1a;roxml_to_dota.p…

Leetcode—40.组合总和II【中等】

2023每日刷题&#xff08;七十七&#xff09; Leetcode—40.组合总和II 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int…

深度解析SD-WAN和混合WAN的网络方案区别

在企业网络的不断发展中&#xff0c;根据业务需要选择不同的广域网&#xff08;WAN&#xff09;解决方案显得至关重要。传统的基于传输控制协议/因特网协议&#xff08;TCP/IP&#xff09;的WAN是一种私有广域网&#xff0c;由企业网络和互联网服务提供商&#xff08;ISP&#…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

Vue 动态组件与异步组件:深入理解与全面应用

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 动态组件实现原理&#xff1a;用法示例&#xff1a; 2. 异步组件实现原理&#xff1a;用法示例&#xff1a; 3. 异步组件的高级应用a. 异步组件的命名&#xff1a;b. 异步组件的加载状态管理&#xff1a; ⭐ 写在最后 ⭐ 专栏简…

element plus表格的表头和内容居中

文章目录 需求分析 需求 对于 element-plus 中的 table 进行表头和内容的居中显示 分析 单列的表头和内容居中 &#xff1a; 在对应的那一列加上align“center” 即可 <el-table-column prop"name" label"商品名称" align"center" />…

c++QT文件IO

1、QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗。弹出的结果&#xff08;选择文件的路径&#xff09;通过返回值获取。 1&#xff09;获取一个打开或保存的文件路径 // 获取一个打开或保存的文件路…

Unity3D控制人物移动的多种方法

系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…

从编程中思考:大脑的局部与全局模式(一)

郭靖正在帐篷中用Unity写代码&#xff0c;刚写完一段代码。欧阳锋从帐篷外走进来&#xff0c;正要说点什么&#xff0c;郭靖反应敏捷&#xff0c;转身反手一招神龙摆尾击出&#xff0c;将欧阳锋震出帐篷&#xff0c;灰溜溜逃跑。 using UnityEngine;public class LocalGlobalD…

Maven 综合案例

1. 项目需求和结构分析 需求案例&#xff1a;搭建一个电商平台项目&#xff0c;该平台包括用户服务、订单服务、通用工具模块等。 项目架构&#xff1a; 用户服务&#xff1a;负责处理用户相关的逻辑&#xff0c;例如用户信息的管理、用户注册、登录等。 spring-context 6.0.…

P1320 压缩技术(续集版)(C语言)

基本思路是&#xff1a; 1.读入字符串并计算n值 2.字符串连接&#xff08;要用到strcat&#xff09; 3.输出n值 4.计算字符数并输出 其中输出时第一个数字是0的个数&#xff0c;这个很容易被遗漏。 #include<stdio.h> #include<string.h> int main() {char a[…

centos 7.6 进入单用户模式

1、重启服务器&#xff0c;在选择内核界面使用上下箭头移动 2、选择内核并按“e” 将“RO”改成 rw ,删除 rhgb quiet 添加 init/bin/bash Ctrl X 进入单用户模式 为防止乱码&#xff0c;修改语言为英语 修改完密码建议输入&#xff1a;touch /.autorelabel 更新系统信…

imgaug库图像增强指南(34):揭秘【iaa.Clouds】——打造梦幻般的云朵效果

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

mysql 导入数据 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘

前言: mysql 导入数据 遇到这个错误 1273 - Unknown collation: utf8mb4_0900_ai_ci 具体原因没有深究 但应该是设计数据库的 字符集类型会出现这个问题 例如: char varchar text..... utf8mb4 类型可以存储表情 在现在这个时代会用很多 以后会用的更多 所以不建议改…

SV-7101V网络音频终端产品简介

SV-7101V网络音频终端产品简介 网络广播终端SV-7101V&#xff0c;接收网络音频流&#xff0c;实时解码播放。本设备只有网络广播功能&#xff0c;是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。18123651365微信 产品特点 ■ 提供固件网络远程升级■ 标准RJ…

CSS之边框样式

让我为大家介绍一下边框样式吧&#xff01;如果大家想更进一步了解边框的使用&#xff0c;可以阅读这一篇文章&#xff1a;CSS边框border 属性描述none没有边框,即忽略所有边框的宽度(默认值)solid边框为单实线dashed边框为虚线dotted边框为点线double边框为双实线 代码演示&…

教你怎么用Docker 部署前端

越来越多的前端团队选择用 Docker 部署前端项目&#xff0c;方法是将项目打包成一个镜像&#xff0c;然后在服务端直接拉镜像启动项目。这种方式可以忽略服务器环境差异&#xff0c;更容易做版本管理。 但我们平常使用 Docker 拉取镜像时&#xff0c;默认会从 Docker Hub 这个…

PWM调光 降压恒流LED芯片FP7127:为照明系统注入新能量(台灯、GBR、调光电源、汽车大灯)

目录 一、降压恒流LED芯片FP7127 二、降压恒流LED芯片FP7127具有以下特点&#xff1a; 三、降压恒流LED芯片FP7127应用领域&#xff1a; LED照明和调光的新纪元随着LED照明技术的不断发展&#xff0c;人们对于照明调光的需求也越来越高。PWM调光技术作为一种常用的调光方法&…

一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

1. JVM 概述 JVM&#xff1a;Java Virtual Machine&#xff0c;也就是 Java 虚拟机 所谓虚拟机是指&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即&#xff1a;虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中…