Mybatis学习记录

Mybatis学习记录

  • 1.快速开始示例
    • 1.1 什么是MyMyBatis?
    • 1.2 代码示例
  • 2.基本使用
    • 2.1 #{}和${}
    • 2.2 参数传入
      • 2.2.1 概念说明
      • 2.2.2 单个简单类型
      • 2.2.3 实体类型
      • 2.2.4 零散简单数据类型
      • 2.2.5 Map类型
    • 2.3 返回值
      • 2.3.1 单个简单类型
      • 2.3.2 实体类型
      • 2.3.3 Map类型
      • 2.3.4 List类型
  • 3.多表映射
    • 3.1 什么是多表映射
    • 3.2 对一映射
    • 3.3 对多映射
    • 3.4 对一映射和对多映射的说明
  • 4.动态语句
    • 4.1 为什么需要动态语句
    • 4.2 if where标签
    • 4.3 set标签
    • 4.4 choose when otherwise标签
    • 4.5 foreach标签
  • 5.MyBatis高级扩展
    • 5.1 批量映射
    • 5.2 分页插件 pageHelper
    • 5.3 MybatisX插件

1.快速开始示例

1.1 什么是MyMyBatis?

MyBatis 是一个用于 Java 编程语言的持久层框架,它可以帮助开发者更轻松地管理数据库交互。它的核心思想是将 SQL 语句从 Java 代码中分离出来,通过 XML 或注解的方式来配置和映射 SQL 查询、更新和删除等操作,简化 Java 应用程序与数据库之间的交互过程

1.2 代码示例

  • 准备数据库
CREATE DATABASE `mybatis-example`;
USE `mybatis-example`;
CREATE TABLE `t_emp`(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id)
);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);
  • 准备实体类
public class Employee {private Integer empId;private String empName;private Double empSalary;public Integer getEmpId() {return empId;}public String getEmpName() {return empName;}public Double getEmpSalary() {return empSalary;}public void setEmpId(Integer empId) {this.empId = empId;}public void setEmpName(String empName) {this.empName = empName;}public void setEmpSalary(Double empSalary) {this.empSalary = empSalary;}@Overridepublic String toString() {return "Employee{" +"empId=" + empId +", empName='" + empName + '\'' +", empSalary=" + empSalary +'}';}
}
  • 定义Mapper接口
public interface EmployeeMapper {//根据id查询员工信息Employee queryById(Integer id);//根据id删除员工int deleteById(Integer id);
}
  • 定义Mapper.xml文件
    (1) namespace = mapper对应接口的全限定符
    (2)声明标签写sql语句crud:select insert update delete,每个标签对应接口的一个方法
    (3)id是对应方法的名称,resultType是返回值。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="mapper.EmployeeMapper"><select id="queryById" resultType="com.atguigu.pojo.Employee">select emp_id empId,emp_name empName, emp_salary empSalary fromt_emp where emp_id = #{id}</select><delete id="deleteById">delete from t_emp where emp_id = #{id}</delete></mapper>
  • 准备MyBatis配置文件
    mybatis框架配置文件: 数据库连接信息,性能配置,mapper.xml配置等。
<?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表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一个具体的环境 --><environment id="development"><!-- Mybatis的内置的事务管理器 --><transactionManager type="JDBC"/><!-- 配置数据源 --><dataSource type="POOLED"><!-- 建立数据库连接的具体信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!-- mapper标签:配置一个具体的Mapper映射文件 --><!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --><mapper resource="mapper/EmployeeMapper.xml"/></mappers></configuration>
  • 测试
public class MybatisTest {@Testpublic void test_01() throws IOException {//1.读取外部配置文件(mybatis-config.xml)InputStream ips = Resources.getResourceAsStream("mybatis-config.xml");//2.创建sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(ips);//3.根据sqlSessionFactory创建sqlSession (每次业务创建一个,用完就释放)SqlSession sqlSession = sqlSessionFactory.openSession();//4.获取接口的代理对象 (代理技术) 调用代理对象的方法,就会查找mapper接口的方法//jdk动态代理技术生成的mapper代理对象EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);// 内部拼接接口的全限定符号.方法名  去查找sql语句标签Employee employee = mapper.queryById(1);System.out.println("employee = " + employee);//5.提交事务(非DQL)和释放资源sqlSession.commit();sqlSession.close();}
}

2.基本使用

2.1 #{}和${}

  • #{ }:常用
    Mybatis会将SQL语句中的#{}转换为占位符
  • ${ }
    ${}形式传参,底层Mybatis做的是字符串拼接操作

2.2 参数传入

2.2.1 概念说明

这里参数传入是指上层方法(例如Service方法)调用Mapper接口时,数据传入的形式。

  • 简单类型:只包含一个值的数据类型
    • 基本数据类型:int、byte、short、double、……
    • 基本数据类型的包装类型:Integer、Character、Double、……
    • 字符串类型:String
  • 复杂类型:包含多个值的数据类型
    • 实体类类型:Employee、Department、……
    • 集合类型:List、Set、Map、……
    • 数组类型:int[]、String[]、……
    • 复合类型:List、实体类中包含集合……

2.2.2 单个简单类型

//Mapper接口中抽象方法的声明
Employee selectEmployee(Integer empId);//xml
<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{empId}
</select>

2.2.3 实体类型

//Mapper接口中抽象方法的声明
int insertEmployee(Employee employee);//xml
<insert id="insertEmployee">insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})
</insert>

2.2.4 零散简单数据类型

零散的多个简单类型参数,如果没有特殊处理,那么Mybatis无法识别自定义名称:

//Mapper接口中抽象方法的声明
int updateEmployee(@Param("empId") Integer empId,@Param("empSalary") Double empSalary);//XML
<update id="updateEmployee">update t_emp set emp_salary=#{empSalary} where emp_id=#{empId}
</update>

2.2.5 Map类型

//Mapper接口中抽象方法的声明
int updateEmployeeByMap(Map<String, Object> paramMap);//XML
<update id="updateEmployeeByMap">update t_emp set emp_salary=#{empSalaryKey} where emp_id=#{empIdKey}
</update>

2.3 返回值

2.3.1 单个简单类型

//Mapper接口中的抽象方法Java
int selectEmpCount();//XML
<select id="selectEmpCount" resultType="int">select count(*) from t_emp
</select>

select标签,通过resultType指定查询返回值类型!

resultType = “全限定符 | 别名 | 如果是返回集合类型,写范型类型即可”
关于别名可以参考MyBatis官方文档官方文档关于别名的说明

2.3.2 实体类型

//Mapper接口的抽象方法
Employee selectEmployee(Integer empId);//XML
<!-- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句 -->
<!-- resultType属性:指定封装查询结果的Java实体类的全类名 -->
<select id="selectEmployee" resultType="com.atguigu.mybatis.entity.Employee">select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{maomi}
</select>

2.3.3 Map类型

//Mapper接口的抽象方法
Map<String,Object> selectEmpNameAndMaxSalary();//XML
<select id="selectEmpNameAndMaxSalary" resultType="map">SELECTemp_name 员工姓名,emp_salary 员工工资,(SELECT AVG(emp_salary) FROM t_emp) 部门平均工资FROM t_emp WHERE emp_salary=(SELECT MAX(emp_salary) FROM t_emp)
</select>

2.3.4 List类型

查询结果返回多个实体类对象,希望把多个实体类对象放在List集合中返回。此时不需要任何特殊处理,在resultType属性中还是设置实体类类型即可。

//Mapper接口中抽象方法
List<Employee> selectAll();//XML
<select id="selectAll" resultType="com.atguigu.mybatis.entity.Employee">select emp_id empId,emp_name empName,emp_salary empSalaryfrom t_emp
</select>

3.多表映射

3.1 什么是多表映射

在实际的开发中,经常需要联合多个表进行查询。例如有2张表:客户表和订单表。分别有如下属性:

customer:customer_id,customer_name
order:order_id,order_name,customer_id

如果有需求:根据客户id查询客户的信息和订单信息。或者根据订单id查询客户的信息。这时会需要联合多个表查询。
如何对查询得到的结果集进行映射,即多表映射。一般需要完成以下工作:

  • 自己编写sql语句完成查询
  • 自己设计存储数据的实体类
  • 自己定义结果集映射
    3.2 和 3.3 中的数据库如下
    在这里插入图片描述
    在这里插入图片描述

3.2 对一映射

  • 需求:根据id查询订单信息和订单对应的客户(显然,一个订单只能对应一个客户,所以是对一)
  • 代码实现
    在这里插入图片描述
//Order
public class Order {private Integer orderId;private String orderName;private Integer customerId;private Customer customerInfo; //因为需要返回客户的信息 所以还需要customer类
}//OrderMapper
public interface OrderMapper {//根据id查询订单信息和订单对应的客户Order queryOrderById(Integer id);
}//OrderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="mapper.OrderMapper"><resultMap id="orderMap" type="pojo.Order"><id column="order_id" property="orderId"/><association property="customerInfo" javaType="pojo.Customer"><id column="customer_id" property="customerId"/></association></resultMap><select id="queryOrderById" resultMap="orderMap">SELECT * FROM t_order  JOIN  t_customer ON  t_order.customer_id = t_customer.customer_idWHERE t_order.order_id = #{id}</select>
</mapper>//mybatis-config.xml  与后面的3.3共用这个mybatis-config.xml
<?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><setting name="logImpl" value="STDOUT_LOGGING"/>//开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn<setting name="mapUnderscoreToCamelCase" value="true"/> //自动映射任何复杂的结果集(无论是否嵌套)<setting name="autoMappingBehavior" value="FULL"/></settings><!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一个具体的环境 --><environment id="development"><!-- Mybatis的内置的事务管理器 --><transactionManager type="JDBC"/><!-- 配置数据源 --><dataSource type="POOLED"><!-- 建立数据库连接的具体信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/multidb?allowMultiQueries=true"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!-- mapper标签:配置一个具体的Mapper映射文件 --><!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --><mapper resource="mapper/OrderMapper.xml"/><mapper resource="mapper/CustomerMapper.xml"/></mappers>
</configuration>

3.3 对多映射

  • 需求:根据id查询客户和客户关联的订单信息(单个客户可能有多个订单信息,所以是对多)
  • 代码实现
//Customer类
public class Customer {private Integer customerId;private String customerName;private List<Order> orderList; //因为需要返回订单信息,是一个列表
}//CustomerMapper接口
public interface CustomerMapper {//根据id查询客户和客户关联的订单信息List<Customer> queryCustomerListById(Integer id);
}//CustomerMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="mapper.CustomerMapper"><resultMap id="customer" type="pojo.Customer"><id column="customer_id" property="customerId"/><collection property="orderList" ofType="pojo.Order"><id column="order_id" property="orderId"/></collection></resultMap><select id="queryCustomerListById" resultMap="customer">SELECT * FROM t_customer INNER JOIN t_order ON t_customer.customer_id=t_order.customer_id WHERE t_customer.customer_id=#{id}</select></mapper>//mbatis-config.xml见3.2代码实现 同

3.4 对一映射和对多映射的说明

  • 开启结果集自动映射,就可以省略部分自定义结果集映射时的代码书写
//在mybatis-config.xml 开启方式如下
<setting name="autoMappingBehavior" value="FULL"/>

开启后就可以省略result部分的书写,mybatis会自动映射

    <resultMap id="orderMap" type="pojo.Order"><id column="order_id" property="orderId"/>
<!--        <result column="order_name" property="orderName"/>-->
<!--        <result column="customer_id" property="customerId"/>--><association property="customerInfo" javaType="pojo.Customer"><id column="customer_id" property="customerId"/>
<!--            <result column="customer_name" property="customerName"/>--></association></resultMap>
  • 对一映射和对多映射中使用的分别是:
<association property="" javaType="">
</association><collection property="" ofType="">
</collection>
  • 对orderMapper.xml和customerMapper.xml中对应的说明(颜色相同说明需要保持一致)
    在这里插入图片描述

4.动态语句

4.1 为什么需要动态语句

在进行按照条件查询的情况下,如果有多个条件,但是有时候有的条件为空,后台需要动态的完成sql语句。例如:淘宝商品筛选中,提供了A-H多个筛选条件,但是客户可能会随机指定几个筛选条件,后台就需要动态的完成sql语句。

4.2 if where标签

  • if 标签test=" "判断test是否成立,如果成立则添加if语句内到睡起来语句中
  • where标签: where内部有任何一个if满足,自动添加where关键字,不满足去掉where。自动去掉多余的and 和 or 关键字。
//接口
List<Employee> queryByCondition(@Param("name") String name, @Param("salary") Double salary);
<select id="queryByCondition" resultType="pojo.Employee">select emp_id empId,emp_name empName, emp_salary empSalary from t_emp<where><if test="name != null">emp_name=#{name}</if><if test="salary != null">and emp_salary=#{salary}</if></where>
</select>

4.3 set标签

set标签自动去掉多余的逗号并自动添加set关键字

//接口
int updateInfo(@Param("id") String id, @Param("name") String name, @Param("salary") int salary);
    <update id="updateInfo" >update t_emp<set><if test="name !=null">emp_name=#{name},</if><if test="salary !=null">emp_salary=${salary}</if></set>where emp_id=#{id}</update>

4.4 choose when otherwise标签

在多个分支条件中,仅执行一个。从上到下依次执行条件判断:遇到的第一个满足条件的分支会被采纳,被采纳分支后面的分支都将不被考虑,如果所有的when分支都不满足,那么就执行otherwise分支。类似switch-case

//根据两个条件查询,如果姓名不为null使用姓名查询,如果姓名为null,薪水不为空就使用薪水查询! 都为null查询全部
List<Employee>queryByNameOrSalary(@Param("name") String name, @Param("salary") Double salary);
    <select id="queryByNameOrSalary" resultType="pojo.Employee">select emp_id empId,emp_name empName, emp_salary empSalary from t_emp t_empwhere<choose><when test="name != null">emp_name = #{name}</when><when test="salary != null">emp_salary = #{salary}</when><otherwise>1=1</otherwise></choose></select>

4.5 foreach标签

collection属性:要遍历的集合
item属性:遍历集合的过程中能得到每一个具体对象,在item属性中设置一个名字,将来通过这个名字引用遍历出来的对象
separator属性:指定当foreach标签的标签体重复拼接字符串时,各个标签体字符串之间的分隔符
open属性:指定整个循环把字符串拼好后,字符串整体的前面要添加的字符串
close属性:指定整个循环把字符串拼好后,字符串整体的后面要添加的字符串
index属性:这里起一个名字,便于后面引用
遍历List集合,这里能够得到List集合的索引值
遍历Map集合,这里能够得到Map集合的key

<foreach collection="empList" item="emp" separator="," open="values" index="myIndex"><!-- 在foreach标签内部如果需要引用遍历得到的具体的一个对象,需要使用item属性声明的名称 -->(#{emp.empName},#{myIndex},#{emp.empSalary},#{emp.empGender})
</foreach>

5.MyBatis高级扩展

5.1 批量映射

在myBatis.config.xml的配置文件中,如果有多个Mapper,通常需要进行多次映射,如下所示:
在这里插入图片描述
可以直接在配置文件中使用以下代码代替:

<mappers><package name="com.daoheng.mapper"/>
</mappers>

但是必须满足以下要求:

  • Mapper 接口和 Mapper 配置文件名称一致:EmployeeMapper.java对应EmployeeMapper.xml
  • 在Rsources下创建mapper接口包一致的文件夹结构存放mapper.xml文件
    在这里插入图片描述

5.2 分页插件 pageHelper

  • pom.xml引入依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.11</version>
</dependency>
  • mybatis-config.xml配置分页插件
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/></plugin>
</plugins>
  • 测试代码
@Testpublic void testTeacherRelationshipToMulti() {EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);PageHelper.startPage(2,2);List<Employee> employees = mapper.queryBySalary(500.0);PageInfo<Employee> pageInfo = new PageInfo<>(employees);System.out.println("pageInfo = " + pageInfo);long total = pageInfo.getTotal(); // 获取总记录数System.out.println("total = " + total);int pages = pageInfo.getPages();  // 获取总页数System.out.println("pages = " + pages);int pageNum = pageInfo.getPageNum(); // 获取当前页码System.out.println("pageNum = " + pageNum);int pageSize = pageInfo.getPageSize(); // 获取每页显示记录数System.out.println("pageSize = " + pageSize);List<Employee> list = pageInfo.getList();//获取查询页的数据集合System.out.println("teachers = " + list);employees.forEach(System.out::println);}//输出
pageInfo = PageInfo{pageNum=2, pageSize=2, size=2, startRow=3, endRow=4, total=4, pages=2, list=Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=4, pages=2, reasonable=false, pageSizeZero=false}[Employee{empId=3, empName='andy', empSalary=500.0}, Employee{empId=4, empName='tom', empSalary=500.0}], prePage=1, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true, hasNextPage=false, navigatePages=8, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
total = 4
pages = 2
pageNum = 2
pageSize = 2
teachers = Page{count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=4, pages=2, reasonable=false, pageSizeZero=false}[Employee{empId=3, empName='andy', empSalary=500.0}, Employee{empId=4, empName='tom', empSalary=500.0}]
Employee{empId=3, empName='andy', empSalary=500.0}
Employee{empId=4, empName='tom', empSalary=500.0}

5.3 MybatisX插件

  • ORM:ORM(Object-Relational Mapping,对象-关系映射)是一种将数据库和面向对象编程语言中的对象之间进行转换的技术。它将对象和关系数据库的概念进行映射,最后我们就可以通过方法调用进行数据库操作
  • 逆向工程:逆向工程是一种自动化生成持久层代码和映射文件的工具,它可以根据数据库表结构和设置的参数生成对应的实体类、Mapper.xml 文件、Mapper 接口等代码文件
  • MybatisX插件能完成逆向工程,但是只能生成单表crud的操作,多表查询依然需要我们自己编写
  • 步骤
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

java 版本企业招标投标管理系统源码+功能描述+tbms+及时准确+全程电子化

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

基于MVO优化的Bi-LSTM多输入回归预测(Matlab)多元宇宙算法优化长短期神经网络回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

探索Java开发面试笔记:以听为目的,助力编程技术提升与面试准备

文章目录 一、制作背景介绍二、 Java开发面试笔记&#xff1a;为你的编程之路加速2.1 公众号主题和目标读者群体2.2 为什么面试笔记对于提高编程视野和技术至关重要2.3 親測效率 三、形式案例3.1 文章形式3.2 手机案例3.3 电脑案例 一、制作背景介绍 做公众号的背景&#xff1a…

【LeetCode:98. 验证二叉搜索树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

就业班 2401--3.1 Linux Day9--文件查找和压缩

一、文件查找与打包压缩 grep: 文件内容过滤 [rootqfedu.com ~]# grep root /etc/passwd #从/etc/passwd文件中过滤root字段 grep ^root root$ root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 查找命令 [rootqfedu.com ~]# which ls ali…

【基于HTML5的网页设计及应用】——float实现页面布局

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Java基础-运算符,表达式和语句

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、Java 运算符 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 条件运算符&#xff…

游戏寻路之A*算法(GUI演示)

一、A*算法介绍 A*算法是一种路径搜索算法,用于在图形网络中找到最短路径。它结合了Dijkstra算法和启发式搜索的思想,通过综合利用已知的最短路径和估计的最短路径来优化搜索过程。在游戏自动寻路得到广泛应用。 二、A*算法的基本思想 在图形网络中选择一个起点和终点。维护…

常用的17个运维监控系统(必备知识)

1. Zabbix Zabbix 作为企业级的网络监控工具&#xff0c;通过从服务器&#xff0c;虚拟机和网络设备收集的数据提供实时监控&#xff0c;自动发现&#xff0c;映射和可扩展等功能。 Zabbix的企业级监控软件为用户提供内置的Java应用服务器监控&#xff0c;硬件监控&#xff0c…

Python web框架fastapi中间件的使用,CORS跨域详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Fastapi 景天的主页&#xff1a;景天科技苑 文章目录 fastapi中间件与CORS1、中间件1.创建中间件方法2.中间件里面添加响应头…

跨地域传文件时 面临的安全、效率等问题要如何解决?

近年来&#xff0c;企业在异国、异地设立分支机构的越来越多&#xff0c;在日常经营中&#xff0c;企业总部和分支机构间存在平行、垂直及互相交叉的管理模式和业务往来需求&#xff0c;因此&#xff0c;大型企业存在必然的跨地域传文件场景&#xff0c;比如跨地理域文件交换、…

揭秘麦肯锡的方法:产品经理解决问题指南

您是否想知道世界上最成功的产品经理如何始终如一地提供不仅满足而且超出预期的解决方案&#xff1f;秘密可能就在于世界上最负盛名的咨询公司之一麦肯锡公司所磨练的方法论。本文深入探讨了麦肯锡的问题解决流程&#xff0c;该流程专为希望提升水平的产品经理量身定制。 01. 麦…

2024最新AI大模型产品汇总

文章目录 1. 写在前面2. 效率工具3. 聊天机器人4. 应用开发工具5. Prompt工具与社区6. 通用基础大模型7. 训练框架8. 开源数据集9. 推理与部署平台及工具 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致…

Flutter整体框架

Flutter整体框架由三部分组成&#xff1a;Framework、Engine和Embedder。 Framework Framework提供了一个用 Dart 语言编写的现代、反应式框架&#xff0c;由许多抽象的层级组成。它包括一套丰富的布局、动画、绘制、手势UI组件及配套代码&#xff0c;以及更基础的异步、文件、…

李沐动手学习深度学习——4.5练习

1. 在本节的估计问题中使用λ的值进行实验。绘制训练和测试精度关于λ的函数。观察到了什么&#xff1f; 修改代码运行如图所示&#xff0c;可以发现对于lamda值的变化而言&#xff0c;对于训练loss和测试loss的影响不大。但是如果λ 太大后&#xff0c;train和test的loss会变得…

Databend 开源周报第 134 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持多语句事务…

基于dashscope在线调用千问大模型

前言 dashscope是阿里云大模型服务平台——灵积提供的在线API组件。基于它&#xff0c;无需本地加载大模型&#xff0c;通过在线方式访问云端大模型来完成对话。 申请API key 老规矩&#xff1a;要想访问各家云端大模型&#xff0c;需要先申请API key。 对于阿里云&#x…

STM32(14)USART

USART:一种片上外设&#xff0c;用来实现串口通信&#xff0c;就是stm32内部的串口 USART简介 串并转换电路 串行通信和并行通信 串行&#xff1a;一根数据线&#xff0c;逐个比特位发送 为什么要串并转换 移位寄存器 USART的基本模型 通过查询SR&#xff08;状态寄存器&…

简介IP地址证书如何申请

IP地址证书通常包含在SSL/TLS证书中&#xff0c;根据验证级别可分为域名验证型(DV)、组织验证型(OV)。对于直接绑定IP地址的场景&#xff0c;需选择支持IP地址验证的SSL证书。 跟常见的域名证书一样&#xff0c;IP地址证书在申请过程中同样需要验证IP的所有权&#xff0c;常见的…

Sublime Text4代码配色自定义方案

文章目录 前言Settings设置效果图 前言 关于Sublime Text对于我的使用体验&#xff0c;只能说内置的代码主题真的都太low了&#xff0c;一点都不好看。所以接下来我分享一下我自定义代码配色。当然&#xff0c;大家也可以通过我给的中文翻译注释来自定义自己喜欢的颜色。废话不…