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

Mybatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录

一、JDBC编程和ORM模型

1. JDBC回顾

2. JDBC的弊端 

3. ORM模型

Mybatis和hibernate 区别: 

4. mybatis 解决了jdbc 的问题

二、MyBatis简介

1. MyBatis快速开始 

1.1 导入jar包

1.2 引入 mybatis-config.xml 配置文件 

1.3 引入 Mapper 映射文件 

1.3 测试

2. 实现增删改查

1. 导入jar包  配置文件等

2. 创建 MyBatisUtil 类

3. 完成增删改查功能

4. 测试类

三、MyBatis生命周期

四、总结


一、JDBC编程和ORM模型

1. JDBC回顾

  1. 加载驱动 导入JDBC 连接数据库的 jar 包,利 用 CLASS.forName 加载驱动;
  2. 获取连接 利用DriverManager 获取 Connection,然后创建 Statement;
  3. 执行SQL语句 利用 Statement 执行 SQL 语句并结 合 ResultSet 处理结果集映射 Java 对象;
  4. 关闭资源 先开后关的顺序关闭 ResultSet, Statement,Connection 等资源。

2. JDBC的弊端 

  • 硬编码:SQL语句存在Java代码中,不能很好的分离数据库语句和 Java语句,造成代码不易维护;
  • 代码重复度高 :量的重复代码,以 ResultSet 为例,每次都需要重复解析结果集;
  • 底层技术:JDBC属于底层的技术,不支持分布式,缓存等技术,对于复杂场景的应对不好;
  • SQL参数固定:SQL语句的参数固定,使得SQL语句不灵活,无法满足多变的场景。

Jdbc的本质

JDBC是SUN公司制定的一套接口(interface)
目的:解耦合——>降低程序的耦合度,提高程序的扩展力

3. ORM模型

        ORM 模型是数据库的表和简单 Java 对象(Plain Ordinary Java Object,简称 POJO就是javabean)的映射关系模型,主要解决数据库数据和 POJO 对象的相互映射。 

  • Java对象:POJO 对象(Plain Ordinary Java Object): 简单的 Java 对象,实际就是 普通 JavaBeans。
  • 映射配置配置分为:类与数据库中表 的映射;对象与表中记录的 映射;类的属性与数据库中 表的字段的映射。
  • 数据库:按照数据结构来组织、存储 和管理数据的仓库,ORM 模型中最底层的内容。

OBject Relation Mapping 对象关系映射

对象指的是面向面向对象,关系指的是数据库中的表,

例如Java语言中的POJO类与数据库模型之间的对应关系。

常见的ORM模型

  • Hibernate Hibernate 是一个 全自动 的ORM 模 型,Hibernate 可以自动生成 SQL 语 句,自动执行
  • MyBatis MyBatis 是一款 半自动 的ORM 模型,它支持定制化SQL、存储过程以及高级映射.

Mybatis和hibernate 区别: 

  • Hibernate是全自动化ORM; Mybatis是半自动化ORM。
  • Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上; Mybatis需要手写SQL语句以及结果映射。
  • Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降; Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。
  • Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂, 对多字段的结构进行部分映射困难;                                                                                        Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系, 复杂的SQL语句Mybatis效率更高

Mybatis优势: 可以进行更细致的SQL优化;容易掌握

Hibernate优势; dao层开发比mybatis简单,mybatis需要维护SQL和结果映射 hibernate数据库移植性好

4. mybatis 解决了jdbc 的问题

  • 1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。                                                                                                        解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
  • 2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。                                                                                                                    解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
  • 3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。                                                                                                        解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
  • 4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象 解析比较方便。                                                                              解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

二、MyBatis简介

为什么选择MyBatis 

  • 简单易学:易于学习,易于使用,通过文档和源 代码,可以比较完全的掌握它的设计 思路和实现;
  • 灵活度高:通过定制 SQL 语句,可以比较灵活的 访问数据库,获取数据;
  • 功能完整:提供了连接管理,缓存支持,线程支 持,(分布式)事务管理等功能,还 提供了其他 ORM 模型的支持。

        MyBatis是一款ORM模型,支持定制化SQL、存储过程以及高级映射。可以使用简单的 XML 或注解来配置和映射 原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

  • 半自动化 支持定制化SQL、存储过程以及高级映射;
  • 集成方便 不仅方便 Spring 等 JavaEE 框架的集成,还与其他 ORM 模型集成也很方便。

1. MyBatis快速开始 

1.1 导入jar包

同之前一样 

1.2 引入 mybatis-config.xml 配置文件 

该配置文件主要是连接数据库所需的配置信息 放到src下

1.3 引入 Mapper 映射文件 

配置 SQL语句和映射的配置文件放到mapper包下配置文件前面不能有空格

1.3 测试

 javabean 主要作用 传递数据  不属于任何层 

Student类

public class Student {//属性 对应 数据库中的字段 ---名字一致 类型一致//长像相似就行private int sid;private String snameString;private Date birthday;//这里日期是java.util.Date 包下private String ssex;private int classid;get/set方法省略构造方法省略
}
public class TestFirst {public static void main(String[] args) throws IOException {// 1. 加载驱动// 2. 获取连接// 3. sql语句 --执行// 处理逻辑// 解析结果集// 4. 释放资源// 1. 加载配置文件InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");// 2. 工厂来获取工厂对象SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//		alt+shift+l// 3. 通过工厂生产产品SqlSession sqlSession = sessionFactory.openSession();// 4. 产品的功能
//		sqlSession.insert(null);
//		sqlSession.update(null);
//		sqlSession.delete(null);
//		sqlSession.selectOne(null); -- 查询一个对象
//		sqlSession.selectList(null); -- 查询多个对象// 查询所有学生信息List<Student> sList = sqlSession.selectList("chaxunxuesheng");// 测试sList.forEach(System.out::println);// 释放资源sqlSession.close();}

 测试成功:

在mybatis中 所有的id 不允许重复 不然mybatis 直接报错 就是上面的 chuangjianxuesheng

2. 实现增删改查

1. 导入jar包  配置文件等

主配置文件:

<?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><!-- 和spring整合后 environments配置将废除 --><environments default="development"><environment id="development"><!-- 使用jdbc事务管理 --><transactionManager type="JDBC" /><!-- 数据库连接池 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver" /><property name="url"value="jdbc:mysql://localhost:3306/myhomework03?serverTimezone=GMT" /><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment></environments><mappers><mapper resource="com/zkt/mapper/StudentMapper.xml" /></mappers>
</configuration>

StudentMapper代码:

<?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="test">
<select id="quanchaxuesheng" resultType="com.zkt.bean.Student">select * from student
</select>
<select id="danchaxuesheng" resultType="com.zkt.bean.Student" parameterType="int">select * from student where sid = #{v}
</select>
<insert id="tianjiaxuesheng" parameterType="com.zkt.bean.Student">insert into student(sname,birthday,ssex,classid)values(#{sname},#{birthday},#{ssex},#{classid})
</insert>
<delete id="shanchuxuesheng" parameterType="int">delete from student where sid = #{v}
</delete>
<update id="xiugaixuesheng" parameterType="com.zkt.bean.Student">update studentset sname = #{sname},birthday = #{birthday},ssex = #{ssex},classid = #{classid} where sid = #{sid}
</update>
</mapper>

2. 创建 MyBatisUtil 类

用来创建 MyBatis的数据库SqlSession会话类

创建 SqlSession 类访问数据库:创建出 SqlSession后,利用 SqlSession访问数据库

public class DaoUtil {private static SqlSessionFactory factory;static {try {InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//执行对象public static SqlSession getSqlSession() {return factory.openSession();}//资源释放public static void closeResource(SqlSession sqlSession) {sqlSession.close();}

3. 完成增删改查功能

要与配置文件中一致

增删改 没有resulttype

只有查询有

public class StudentDaoImpl implements IStudentDao {@Overridepublic int addStudent(Student s) {SqlSession sqlSession = DaoUtil.getSqlSession();int ret = sqlSession.insert("tianjiaxuesheng", s);// 事务 -- 增删改if (ret > 0) {sqlSession.commit();} else {sqlSession.rollback();}DaoUtil.closeResource(sqlSession);return ret;}@Overridepublic int updateStudent(Student s) {SqlSession sqlSession = DaoUtil.getSqlSession();int ret = sqlSession.update("xiugaixuesheng", s);// 事务 -- 增删改if (ret > 0) {sqlSession.commit();} else {sqlSession.rollback();}DaoUtil.closeResource(sqlSession);return ret;}@Overridepublic int deleteStudent(int sid) {SqlSession sqlSession = DaoUtil.getSqlSession();int ret = sqlSession.delete("shanchuxuesheng", sid);// 事务 -- 增删改if (ret > 0) {sqlSession.commit();} else {sqlSession.rollback();}DaoUtil.closeResource(sqlSession);return ret;		}@Overridepublic Student findStudentBySid(int sid) {SqlSession sqlSession = DaoUtil.getSqlSession();Student s = sqlSession.selectOne("danchaxuesheng", sid);DaoUtil.closeResource(sqlSession);return s;}@Overridepublic List<Student> findAllStudent() {SqlSession sqlSession = DaoUtil.getSqlSession();List<Student> sList = sqlSession.selectList("quanchaxuesheng");DaoUtil.closeResource(sqlSession);return sList;}}

4. 测试类

public class Test {public static void main(String[] args) {IStudentDao isd = new StudentDaoImpl();
//		List<Student> sList = isd.findAllStudent();
//		sList.forEach(System.out::println);//		Student s = isd.findStudentBySid(5);
//		System.out.println(s);//		Student s1 =new Student();
//		s1.setSname("刘备");
//		s1.setSsex("男");
//		s1.setBirthday(new Date());
//		s1.setClassid(2);
//		int ret =isd.addStudent(s1);
//		if (ret>0) {
//			System.out.println("添加成功");
//		}else {
//			System.out.println("添加失败");
//		}//		int ret=isd.deleteStudent(13);
//		if (ret>0) {
//			System.out.println("删除成功");
//		}else {
//			System.out.println("删除失败");
//		}Student s2 =new Student();s2.setSid(9);s2.setSname("张飞");s2.setSsex("女");s2.setBirthday(new Date());s2.setClassid(1);int ret =isd.updateStudent(s2);if (ret>0) {System.out.println("修改成功");}else {System.out.println("修改失败");}}
}

全部查询单个查询添加

删除

修改

三、MyBatis生命周期

  • SqlSessionFactoryBuilder 构造器,会根据配置信息 生成 SqlSessionFactory。 SqlSessionFactory 利用工厂模式生产 SqlSession;
  • SqlSession 既可以发送 SQL 语句去 执行并返回结果,也可以 获取 Mapper 的接口;
  • SQL Mapper 映射器,给出对应的 SQL 和映射规则,负责 发送 SQL 和处理结果;

  • 1)读取MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  • 2)加载映射文件。映射文件即SQL 映射文件,该文件中配置了操作数据库的SQL 语句, 需要在MyBatis 配置文件mybatis-config.xml 中加载。mybatis-config.xml 文件可以 加载多个映射文件,每个文件对应数据库中的一张表。
  • 3)构造会话工厂:通过MyBatis 的环境等配置信息构建会话工厂SqlSessionFactory。
  • 4)创建会话对象:由会话工厂创建SqlSession 对象,该对象中包含了执行SQL 语句的 所有方法。
  • 5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的SQL 语句,同时负责查询缓存的维护。
  • 6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL 语句的id、参数等信息。
  • 7)输入参数映射:输入参数类型可以是Map、List 等集合类型,也可以是基本数据类型 和POJO 类型。输入参数映射过程类似于JDBC 对preparedStatement 对象设置参数 的过程。 8)输出结果映射:输出结果类型可以是Map、List 等集合类型,也可以是基本数据类 型和POJO 类型。输出结果映射过程类似于JDBC 对结果集的解析过程。

四、总结

• 什么是 ORM 

        • 对象关系映射,用于实现面向对象编程语言里不同类型系统的数据之间的转换;

• MyBatis 的优势

         • 简单易学,灵活度高,功能完整;

• MyBatis 的生命周期

        • SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,SQL Mapper;

 

相关文章:

Mybatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录 一、JDBC编程和ORM模型 1. JDBC回顾 2. JDBC的弊端 3. ORM模型 Mybatis和hibernate 区别: 4. mybatis 解决了jdbc 的问题 二、MyBatis简介 1. MyBatis快速开始 1.1 导入jar包 1.2 引入 mybatis-config.xml 配置文件 1.3 引入 Mapper 映射文件 1.3 测试 …...

论文阅读YOLO-World: Real-Time Open-Vocabulary Object Detection

核心&#xff1a; 开放词汇的实时的yolo检测器。重参数化的视觉语言聚合路径模块Re-parameterizable VisionLanguage Path Aggregation Network (RepVL-PAN)实时核心&#xff1a;轻量化的检测器离线词汇推理过程重参数化 方法 预训练方案&#xff1a;将实例注释重新定义为区域…...

SM2的签名值byte数组与ASN.1互转

ASN.1抽象语言标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式,它提供了一整套正规的格式用于描述对象的结构。 一、该结构的应用场景 例如在做待签名的数字信封时,数字信封使用ASN.1封装,这个时…...

云计算与生成式AI的技术盛宴!亚马逊云科技深圳 Community Day 社区活动流程抢先知道!

小李哥最近要给大家分享7月7日在深圳的即将举办的亚马逊云科技生成式AI社区活动Community Day &#xff0c;干货很多内容非常硬核&#xff0c;不仅有技术分享学习前沿AI技术&#xff0c;大家在现场还可以动手实践沉浸式体验大模型&#xff0c;另外参与现场活动还可以领取诸多精…...

【鸿蒙学习笔记】基础组件Progress:进度条组件

官方文档&#xff1a;Progress 目录标题 作用最全属性迭代追加进度赋值风格样式 作用 进度条组件 最全属性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 颜色.width(200)// 大小.height(50)// 高度.value(50)// 进度可更…...

前程无忧滑块

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …...

一站式uniapp优质源码项目模版交易平台的崛起与影响

一、引言 随着信息技术的飞速发展&#xff0c;软件源码已成为推动行业进步的重要力量。源码的获取、交易和流通&#xff0c;对于开发者、企业以及项目团队而言&#xff0c;具有极其重要的意义。为满足市场对高质量源码资源的迫切需求&#xff0c;一站式uniapp优质源码项目模版…...

Python中vars用法

在 Python 中&#xff0c;vars() 函数返回对象的 __dict__ 属性的字典。这个字典包含了对象的所有属性和它们的值。vars() 函数可以用于模块、类、实例&#xff0c;或者拥有 __dict__ 属性的任何其它对象。这里有几个使用 vars() 的例子&#xff1a; 一.模块 如果对一个模块使…...

【机器学习】基于Transformer的迁移学习:理论与实践

引言 在机器学习领域&#xff0c;迁移学习已成为提升模型训练效率和性能的重要策略&#xff0c;特别是在标注数据稀缺的场景下。Transformer模型自2017年由Google提出以来&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域取得了突破性进展&#xff0c;并逐渐扩展到…...

如何应对情绪和培养理性的书

以下是几本关于如何应对情绪和培养理性的书籍推荐&#xff1a; 《情绪智商》&#xff08;Emotional Intelligence&#xff09; - 丹尼尔戈尔曼&#xff08;Daniel Goleman&#xff09; 这本书探讨了情绪智商&#xff08;EQ&#xff09;的重要性以及如何通过提高EQ来改善个人和职…...

[数据集][目标检测]电缆钢丝绳线缆缺陷检测数据集VOC+YOLO格式1800张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1800 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注…...

【Git 学习笔记】Ch1.1 Git 简介 + Ch1.2 Git 对象

还是绪个言吧 今天整理 GitHub 仓库&#xff0c;无意间翻到了几年前自学 Git 的笔记。要论知识的稳定性&#xff0c;Git 应该能挤进前三——只要仓库还在&#xff0c;理论上当时的所有开发细节都可以追溯出来。正好过段时间会用到 Git&#xff0c;现在整理出来就当温故知新了。…...

Python 中别再用 ‘+‘ 拼接字符串了!

目录 引言 为什么不推荐使用 "" 示例代码 更高效的替代方法 使用 join 方法 示例代码 使用格式化字符串&#xff08;f-strings&#xff09; 示例代码 引言 大家好&#xff0c;在 Python 编程中&#xff0c;我们常常需要对字符串进行拼接。你可能会自然地想到…...

六西格玛绿带培训的证书有什么用处?

近年来&#xff0c;六西格玛作为一套严谨而系统的质量管理方法&#xff0c;被广泛运用于各行各业。而六西格玛绿带培训证书&#xff0c;作为这一方法论中基础且重要的认证&#xff0c;对于个人和企业而言&#xff0c;都具有不可忽视的价值。本文将从多个角度深入探讨六西格玛绿…...

《妃梦千年》第二十章:风雨欲来

第二十章&#xff1a;风雨欲来 战斗的胜利让林清婉和皇上的关系更加亲密&#xff0c;但宫中的阴谋却并未因此而停止。一天&#xff0c;林清婉正在寝宫中思考未来的对策&#xff0c;忽然接到一个紧急消息。小翠匆匆跑来&#xff0c;神色紧张&#xff1a;“娘娘&#xff0c;太后…...

深入理解二分法

前言 二分法&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;广泛应用于计算机科学和工程领域。它用于在有序数组中查找特定元素&#xff0c;其时间复杂度为 O(log n)&#xff0c;显著优于线性搜索的 O(n)。本文将深入介绍二分法的原理、实现及其应用场…...

【C命名规范】遵循良好的命名规范,提高代码的可读性、可维护性和可复用性

/******************************************************************** * brief param return author date version是代码书写的一种规范 * brief &#xff1a;简介&#xff0c;简单介绍函数作用 * param &#xff1a;介绍函数参数 * return&#xff1a;函数返回类型说明 * …...

Hbase面试题总结

一、介绍下HBase架构 --HMaster HBase集群的主节点&#xff0c;负责管理和协调整个集群的操作。它处理元数据和表的分区信息&#xff0c;控制RegionServer的负载均衡和故障恢复。--RegionServer HBase集群中的工作节点&#xff0c;负责存储和处理数据。每个RegionServer管理若…...

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高&#xff0c;p先和 [] 结合说明p是一个数组&#xff0c;p先和*结合说明p是一个指针 括号保证p先和*结合&#xff0c;说明p是一个指针变量&#xff0c;然后指…...

Rust学习笔记 (命令行命令) : 用override set 设置工具链

在cargo run某个项目时出现了如下错误&#xff1a;error: failed to run custom build command for ring v0.16.20&#xff08;无法运行“Ring v0.16.20”的自定义构建命令&#xff09;&#xff0c;在PowerShell命令行运行命令 rustup override set stable-msvc后成功运行。 o…...

AU音频软件|Audition 2025网盘下载与安装教程指南

说起AU&#xff0c;有些小伙伴可能第一印象是化学元素金&#xff08;Aurum&#xff09;。实际上&#xff0c;本文要介绍的AU&#xff0c;全称是Adobe Audition&#xff0c;是一款专业音频编辑和混音软件‌&#xff0c;广泛应用于音乐制作、广播、电影及视频声音设计等领域。 目…...

随机访问介质访问控制:网络中的“自由竞争”艺术

想象一场自由辩论赛——任何人随时可以发言&#xff0c;但可能多人同时开口导致混乱。这正是计算机网络中随机访问协议的核心挑战&#xff1a;如何让多个设备在共享信道中高效竞争&#xff1f;本文将深入解析五大随机访问技术及其智慧。 一、核心思想&#xff1a;自由竞争 冲突…...

ESP-Brookesia:融合 AI 大模型,全新一代 GUI 开发与管理平台

乐鑫信息科技 (688018.SH) 推出 ESP-Brookesia ——一款专为物联网设备打造、集成 AI 交互能力的 UI 开发与管理框架。 ESP-Brookesia 深度融合 AI 大模型技术&#xff0c;为智能屏显应用赋予语音识别、自然语言对话、拟人化反馈等能力&#xff0c;帮助开发者构建更智能、更具…...

Excel自动分列开票工具推荐

软件介绍 本文介绍一款基于Excel VBA开发的自动分列开票工具&#xff0c;可高效处理客户对账单并生成符合要求的发票清单。 软件功能概述 该工具能够将客户对账单按照订单号自动拆分为独立文件&#xff0c;并生成可直接导入发票清单系统的标准化格式。 软件特点 这是一款体…...

BeanFactory 和 FactoryBean 有何区别与联系?

导语&#xff1a; Spring 是后端面试中的“常青树”&#xff0c;而 BeanFactory 与 FactoryBean 的关系更是高频卡人点。很多候选人混淆两者概念&#xff0c;答非所问&#xff0c;轻则失分&#xff0c;重则直接被“pass”。本文将从面试官视角&#xff0c;深入剖析这一经典问题…...

0x-4-Oracle 23 ai-sqlcl 25.1.1 独立安装-配置和优化

一、独立安装sqlcl 1. ​安装 Java 环境​ SQLcl 需要 Java 1.8.0_220 或更高版本&#xff0c; Oracle Linux9.6 上已经默认安装Oracle 23ai后Java 是11 lts版本 如果java jdk安装错误将遇上SQLcl困扰n多人的bug sql /nolog 错误&#xff1a;找不到或加载主类 oracle.dbto…...

CAN通信收发测试(USB2CAN模块测试实验)

1.搭建测试环境 电脑&#xff1a;安装 USB 驱动&#xff0c;安装原厂调试工具&#xff0c;安装cangaroo&#xff08;参考安装包的入门教程即可&#xff09; USB驱动路径&#xff1a;~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径&#xff1a;~\CAN分析仪资料2…...

vue3+TS+eslint9配置

记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中&#xff0c;配置方式发生了变化。Flat Config 格式&#xff08;eslint.config.js 或 .ts&#xff09;不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉&#xff0c;要不然保存的时候不会格式化。…...

如何打造一款金融推理工具Financial Reasoning Workflow:WebUI+Ollama+Fin-R1+MCP/RAG

在之前的文章中&#xff0c;我探讨了如何使用具身人工智能&#xff0c;让大语言模型智能体来模仿[当今著名对冲基金经理的投资策略]。 在本文中&#xff0c;我将探讨另一种方法&#xff0c;该方法结合了经过金融推理训练的特定大语言模型&#xff08;LLM&#xff09;&#xff0…...

Go 中 map 的双值检测写法详解

Go 中 map 的双值检测写法详解 在 Go 中&#xff0c;if char, exists : pairs[s[i]]; exists { 是一种利用 Go 语言特性编写的优雅条件语句&#xff0c;用于检测 map 中是否存在某个键。让我们分解解释这种写法&#xff1a; 语法结构解析 if value, ok : mapVariable[key]; …...