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

框架——MyBatis的入门案例

  1. 框架概述

1.1什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交与的方法;
另一种定义认为,框架是可被应用开发者定制的应用骨架。
前者是从应用方面而后者是从目的方面给出的定义。简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

1.2框架要解决的问题

框架要解决的最重要的一个问题是技术整合的问题,在J2EE 的 架中,有着各种各样的技术,不同的软件企业需要从J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦
这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层

1.3软件开发的分层重要性

框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为了实现 软件工程中的“高内聚、低合"。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的 MVC 软件设计思想就是很好的分层思想。

1.4分层开发下的常见框架

常见的JavaEE开发框架:

  1. 解决数据的持久化问题的框架

MyBatis

MyBatis本是apache的一个开源项目Batis,2010年这个项目由apache software foundation 迁移d到了googe code,并且改名为MyBatis。2013年11月迁移到Github。

iBATIS一词来源于"intemer和“abatis的组合,是一个基于Java的持久层框架。BATIS提供的持久层框架包括SQL Maps和DataAccess Objects (DAOs)
作为持久层的框架,还有一个封装程度更高的架就是Hibernate,但这个框架因为各种原因目前在国内的流行程度下降大多,现在公司开发也越来越少使用。目前使用SpringData来实现数据持久化也是一种趋势。

2. 解决WEB层问题的MVC框架

Spring MVC

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,Spring 摇架提供了构建Web 应用程序的全功能MVC模块。使用 Spring 可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts仰扁挫蹦傍靶哀现在一般不用),Struts2等。

3. 解决技术整合问题的框架

spring框架

Spnng挺架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松合性角度而言,绝大部分Java应用都可以从Spring中受益。
  • 目的:解决企业应用开发的复杂性

  • 功能:使用基本的JavaBean代智EJB,并提供了更多的企业应用功能

  • 范围:任何Java应用

Spring是一个轻量级控制反转(loC)和面向切面(AOP)的容器框架。

2.MyBatis简介

2.1什么是MyBatis?

MyBatis是一个开源轻量级的数据持久化框架,是JDBC和Hibernate的替代方案。

MyBatis 前身为IBatis,2002 年由 Clinton Begin 发布。2010 年从Apache 移到 Google并改名为 MyBatis,2013 年又迁移到了Github。

  • mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。

  • mybatis通过xml或注解的方式将要执行的各种statement 配置起来并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为iava对象并返回。

  • 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbcapi底层访问细节,使我们不用与jdbcapi打交道,就可以完成对数据库的持久化操作。

  • MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。

MyBatis 的中文官网:https://mybatis.org/mybatis-3/zh/index.html

2.2为什么要使用MyBatis?

MvBatis主要的目的就是简化]DBC操作,并且满足高并发和高响应的要求.

回顾一下DBC代码:

public class GoodsDao {private String jdbcdriver="com.mysql.cj.jdbc.Driver";private String jdbcurl="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";private String jdbcuser="root";private String jdbcpassword="root";private Connection con=null;private PreparedStatement pstm=null;private ResultSet rs=null;private int row=0;public Goods FindById(int gid){Goods goods=new Goods();try {//1.加载驱动Class.forName(jdbcdriver);//2.获取数据库连接con=DriverManager.getConnection(jdbcurl,jdbcuser,jdbcpassword);//3.编写sql语句String sql="select * from t_goods where gid=?";//4.预处理对象pstm=con.prepareStatement(sql);//传参pstm.setObject(1,gid);//5.执行sql语句rs=pstm.executeQuery();if (rs.next()){//把当前数据行中的数据取出来,存储到Goods对象中goods.setGid(rs.getInt("gid"));goods.setGname(rs.getString("gname"));goods.setPrice(rs.getDouble("price"));goods.setMark(rs.getString("mark"));}} catch (Exception e) {e.printStackTrace();}finally {try {if (pstm!=null){pstm.close();}if (con!=null){con.close();}} catch (Exception e) {e.printStackTrace();}}return goods;}
}

分析以上JDBC存在的问题:

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题.

  1. sql 语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

  1. 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语的where条件不一定可能多也可能少,修改sql还要修改代码,系统不易维护。

  1. 对结果集解析存在硬编码(查询列名),sl 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。

再次回顾mybatis特点:

  1. mybatis 内部封装了jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载动、创建连接、创建 statement等繁杂的过程。

  1. mybatis 通过 ml或注解的方式将要执行的各种statement 配置起来,并通过 ava对象和statement 中sal 的动态参数进行射生成最终执行的sql语句,最后由mybatis框架执行sgl并将结果映射为java对象并返回。

  1. 采用ORM 思想解决了实体和数据库映射的问题,对 dbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

3.MyBatis的入门案例

下面我们来用一个入门的案例,了解一下MyBatis的基本操作步骤和使用方法。

查询、增加、删除案例

3.1创建测试的数据库

-- 判断存在即删除数据库
drop database if exists mydb;
-- 创建数据库
create database mydb;
-- 使用数据库
use mydb;drop table if exists t_user;
-- 创建表
create table t_user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');select * from t_user where username=? and password=?;
select * from t_user;

3.2创建一个Java项目并导入mybatis框架的jar包

在项目中创建一个lib文件夹放入mybatis框架的jar包,并导入项目中。

3.3创建跟表对应的实体类。

在src中创建com.chen.bean包,然后创建User实体类。
package com.zhao.bean;public class User {private Integer uid;private String username;private String password;private String phone;private String address;public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"uid=" + uid +", username='" + username + '\'' +", password='" + password + '\'' +", phone='" + phone + '\'' +", address='" + address + '\'' +'}';}
}

3.4创建针对表操作的接口类。

在src中创建com.chen.dao包,然后创建UserDao的接口,然后在接口中定义针对数据库的增删
改查等操作。
package com.zhao.dao;import com.zhao.bean.User;import java.util.List;public interface UserDao {/*** 查询所有用户信息*/List<User> selectAll();int add(User user);int delete(int uid);}

3.5在接口的包中创建对应的mapper映射配置文件。

在dao接口的同目录下创建跟接口名字一样的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace是映射的dao接口-->
<mapper namespace="com.zhao.dao.UserDao"><!--通过select标签进行查询id:映射接口的方法名parameterType:指定参数的类型(如果集合类型只需指定集合元素的类型即可)resultType:指定返回的类型--><select id="selectAll" resultType="com.zhao.bean.User">select * from t_user;</select><insert id="add" parameterType="com.zhao.bean.User">insert into t_user(username,password,phone,address) values(#{username},#{password},#{phone},#{address});</insert>
</mapper>

3.6在src目录中创建mybatis框架的核心配置文件。

在src中创建一个文件,命名为SqlMapConfig.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><!--配置环境信息===就是配置连接数据库的参数default:指定配置的环境信息的ID,表示默认连接该环境--><environments default="mysql"><environment id="mysql"><!-- 配置事务的处理方式:模式使用JDBC的事务处理--><transactionManager type="jdbc"></transactionManager><!-- 数据源的默认type设置pooled,表示使用连接池--><dataSource type="pooled"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment><environment id="oracle"><transactionManager type=""></transactionManager><dataSource type=""></dataSource></environment></environments><!--mapper配置文件--><mappers><mapper class="com.zhao.dao.UserDao"/></mappers>
</configuration>

3.7在测试类中进行测试

使用mybatis框架需要按照框架的步骤进行。
package com.zhao.test;import com.zhao.bean.User;
import com.zhao.dao.UserDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserTest {//1.加载核心配置文件的字节输入流InputStream stream = null;//2.创建SalSessionFactory的构建对象--框架使用的是构建者模式SqlSessionFactoryBuilder builder = null;//3.通过构建对象加载配置文件的输入流获取SqlSessionFactorySqlSessionFactory factory = null;//4.通过工厂对象获取SqlSession对象--执行jabc的SqlSession sqlSession = null;//5.通过SqlSession对象获取接口对应的代理对象UserDao userDao = null;@Beforepublic void init() throws IOException {//1.加载核心配置文件的字节输入流stream = Resources.getResourceAsStream("mybatis.xml");//2.创建SalSessionFactory的构建对象--框架使用的是构建者模式builder = new SqlSessionFactoryBuilder();//3.通过构建对象加载配置文件的输入流获取SqlSessionFactoryfactory = builder.build(stream);//4.通过工厂对象获取SqlSession对象--执行jabc的sqlSession = factory.openSession();//5.通过SqlSession对象获取接口对应的代理对象userDao = sqlSession.getMapper(UserDao.class);}@Afterpublic void distroy() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}

查询:

 @Testpublic void testSelectAll() throws IOException {//6.通过代理对象执行查询方法List<User> userList = userDao.selectAll();//7.遍历集合for (User user : userList) {System.out.println(user);}}
查询运行结果如下:
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
User{uid=1, username='张三', password='666', phone='18965423548', address='南阳'}
User{uid=2, username='李四', password='333', phone='18754263548', address='许昌'}
User{uid=3, username='小美', password='123', phone='18565234759', address='信阳'}
User{uid=4, username='mybatis', password='333', phone='111', address='来来来'}
User{uid=5, username='mybatis', password='333', phone='111', address='来来来'}
Process finished with exit code 0

增加

@Testpublic void testAdd() throws IOException {//定义user对象,封装数据User user = new User();user.setUsername("mybatis");user.setPassword("333");user.setPhone("111");user.setAddress("来来来");int n = userDao.add(user);if (n > 0) {System.out.println("success");} else {System.out.println("error");}}
增加运行结果:
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
success
Process finished with exit code 0

数据库添加成功

删除

@Testpublic void testDelete() throws IOException {int n = userDao.delete(4);if (n > 0) {System.out.println("删除成功");}}

删除运行结果:

log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
删除成功
Process finished with exit code 0

数据库删除成功:

相关文章:

框架——MyBatis的入门案例

框架概述1.1什么是框架框架&#xff08;Framework&#xff09;是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交与的方法&#xff1b;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义…...

hadoop兼容性验证

前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;主要解决海量数据的存储和海量数据的分析计算问题&#xff0c;广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念–hadoop生态圈 Hadoop优缺点&#xff1a; 优点&#xff1a; 1、高可靠性&#x…...

运维提质增效,有哪些办法可以做

凡是代码&#xff0c;难免有 bug。 开发者们的日常&#xff0c;除了用一行行代码搭产品外&#xff0c;便是找出代码里的虫&#xff0c;俗称 debug。 随着移动互联网的快速发展&#xff0c;App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…...

c++基础——结构体

结构体结构体&#xff08;struct&#xff09;&#xff0c;可以看做是一系列称为成员元素的组合体。可以看做是自定义的数据类型。定义结构体struct abc {int x;int y; } e[array_length];const abc a; abc b, B[array_length], tmp; abc *c;上例中定义了一个名为 abc 的结构体&…...

applicationContext相关加载

spring refresh 概述 refresh是一个方法&#xff0c;spring中所有的ApplicationContext容器都需要通过refresh方法初始化&#xff1b; 处理步骤 其中refresh方法包含12个主要的处理步骤&#xff1a; 1、第1个步骤做前置准备 2、第2~6步骤创建BeanFactory&#xff08;Appl…...

数据同步工具Sqoop

大数据Hadoop之——数据同步工具SqoopSqoop基本原理及常用方法 1 概述 Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;项目旨在协助RDBMS&#xff08;Relational Database Management System&#xff1a;关系型数据库管理系统&#xff09;与Hadoop之间进行高效的大数据交…...

Kafka 版本

kafka-2.11-2.1.1 : Kafka 1.0.0 后&#xff0c;Kafka 版本命名规则从 4 位到 3 位Kafka版本号是 2.1.1前 2 : 大版本号 (MajorVersion)中 1 : 小版本号或次版本号 (Minor Version)后 1 : 修订版本号 (Patch) Kafka 0.7 最早开源版本 &#xff1a; 只提供最基础的消息队列功…...

ElasticSearch 在Java中的各种实现

ES JavaAPI的相关体系&#xff1a; 词条查询 所谓词条查询&#xff0c;也就是ES不会对查询条件进行分词处理&#xff0c;只有当词条和查询字符串完全匹配时&#xff0c;才会被查询到。 等值查询-term 等值查询&#xff0c;即筛选出一个字段等于特定值的所有记录。 【SQL】 s…...

SpringBoot整合Knife4j

文章目录前言一、Knife4j是什么&#xff1f;二、使用步骤1.导入依赖2.编写配置文件3.编写controller和实体类4.测试总结前言 接上篇整合Swagger链接奉上http://t.csdn.cn/9mXSu 一、Knife4j是什么&#xff1f; 官方文档&#xff1a;https://doc.xiaominfo.com/ knife4j可以理解…...

MyISAM和InnoDB存储引擎的区别

目录前言存储引擎区别事务外键表单的存储数据查询效率数据更新效率如何选择前言 MyISAM和InnoDB是使用MySQL最常用的两种存储引擎&#xff0c;在5.5版本之前默认采用MyISAM存储引擎&#xff0c;从5.5开始采用InnoDB存储引擎。 存储引擎 存储引擎是&#xff1a;数据库管理系统…...

SpringMVC自定义处理多种日期格式的格式转换器

package cn.itcast.utils;import org.springframework.core.convert.converter.Converter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;/*** 把字符串转换日期*/public class StringToDateConverter implements Converter<String…...

NYUv2生成边界GT(1)

看了cityscape和NYUv2生成边界GT的代码后&#xff0c;因为自己使用的是NYUv2数据集&#xff0c;所以需要对自己的数据集进行处理。CASENet生成边界GT所使用的代码是MATLAB&#xff0c;所以又重新看了一下MATLAB的代码&#xff0c;并进行修改&#xff0c;生成了自己的边界代码。…...

Spring基本概念与使用

文章目录一、Spring概念1.容器2.IoC3.DI4.Ioc与DI的关系二、Spring创建与使用1.Maven2.添加Spring框架支持注&#xff1a;国内的Maven源配置3.简单实例&#xff08;1&#xff09;创建一个Bean对象。&#xff08;2&#xff09;将Bean对象存储到Spring当中&#xff08;3&#xff…...

安恒信息java实习面经

目录1.Java ME、EE、SE的区别&#xff0c;Java EE相对于SE多了哪些东西&#xff1f;2.jdk与jre的区别3.说一下java的一些命令&#xff0c;怎么运行一个jar包4.简单说一下java数据类型及使用场景5.Map跟Collection有几种实现&#xff1f;6.面向对象的特性7.重载和重写的区别8.重…...

第八章:枚举类与注解

第八章&#xff1a;枚举类与注解 8.1&#xff1a;枚举类的使用 ​ 类的对象只有有限个&#xff0c;确定的。我们称此类为枚举类。当需要定义一组常量是&#xff0c;强烈建议使用枚举类。如果枚举类中只有一个对象&#xff0c;则可以作为单例模式的实现方式。 如何定义枚举类 …...

Ceph介绍

分布式存储概述 常用的存储可以分为DAS、NAS和SAN三类 DAS&#xff1a;直接连接存储&#xff0c;是指通过SCSI接口或FC接口直接连接到一台计算机上&#xff0c;常见的就是服务器的硬盘NAS&#xff1a;网络附加存储&#xff0c;是指将存储设备通过标准的网络拓扑结构&#xff…...

remove 和 erase 的区别

remove 和 erase 的区别 以容器vector来说明remove和erase的区别 在STL中&#xff0c;vector容器也提供了remove()和erase()函数&#xff0c;用于从vector中删除元素。虽然这两个函数都可以实现删除元素的功能&#xff0c;但是它们之间还是有一些区别的。 remove() remove(…...

NFTScan:怎么使用 NFT API 开发一个 NFT 数据分析平台?

对很多开发者来说&#xff0c;在 NFT 数据海洋中需要对每个 NFT 进行索引和筛选是十分困难且繁琐的&#xff0c;NFT 数据获取仍是一大问题。而数据平台提供的 API 使得开发者可以通过接口获取区块链上 NFT 的详细信息&#xff0c;并对其进行分析、处理、统计和可视化。在本篇文…...

ECOLOY直接更换流程表单后导致历史流程中数据为空白的解决方案

用户反馈流历史流程打开是空白了没有内容。 一、问题调查分析&#xff1a; 工作流“XX0204 员工培训协议审批流程”workflowId37166产生的7个具体流程中&#xff0c;创建日期为2021年的4个具体流程原先引用的数据库表单应该是“劳动合同签订审批表”(formtable_main_190)&…...

mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制

一、前言&#xff08;以下均为读完 高性能Mysql第四版 后的个人理解&#xff0c;建议阅读&#xff0c;挺不错的&#xff09;在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别&#xff1a;事务的ACID标准(1)原子性-atomicity&#xff1a;一个事务作为一个不可分割…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...