MyBatis框架知识点①

news2024/11/24 16:27:52

MyBatis

  • 1.MyBatis的特点
  • 2.搭建MyBatis项目
      • 依赖文件配置
      • 编写MyBatis中全局配置文件
      • 数据库SQL
      • 编写实体类
      • 编写映射文件
      • 加载映射文件
      • log4j配置
      • 编写测试程序
  • 3.增删改查的基本操作
      • 查询操作
      • 新增操作
      • 修改
      • 删除操作
  • 4. Mapper代理方式
      • Mybatis 工具类
      • 实体类
      • Mapper接口
      • mapper文件
      • 加载mapper文件:
      • 测试

1.MyBatis的特点

MyBatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL
本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、
结果集检索等JDBC繁杂的过程代码。

优点:

1.简单易学:
      本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件 + 配置几个sql映射文件,易于学习,易于使用。

2.灵活:
      Mybatis不会对应用程序或者数据库的现有设计强加任何影响,sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。

3.解除sql与程序代码的耦合:
      通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。

4.sql和代码的分离,提高了可维护性。

5.提供丰富且强大的标签:
		提供映射标签,支持对象与数据库的orm字段关系映射。
		提供对象关系映射标签,支持对象关系组建维护。
		提供xml标签,支持编写动态sql。

2.搭建MyBatis项目

先快速搭建一个maven项目,去除不必要的配置

依赖文件配置

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

    <!-- mysql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>

    <!-- log4j Mybatis的日志输出组件 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

编写MyBatis中全局配置文件

在src/main/resources目录下创建mybatis-config.xml,作用:配置了数据源、事务等MyBatis运行环境等。
注:如果src/main下面没有resources目录,那么我们手动创建一个,让其成为Resources Root。

<?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 文件的根节点 -->
<configuration>

    <!--
    environments:多个配置环境;通过default属性可以对多个环境快速切换。
    environments default属性的值必须和某个environment的id值一致。
    -->
    <!-- 和spring整合后 environments配置将废除,了解即可 -->
    <environments default="mysql">
       

        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8&amp;useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

数据库SQL

新建一个数据库ssm与表
在这里插入图片描述

CREATE TABLE `dept` (
`deptno` int PRIMARY KEY AUTO_INCREMENT,
`dname` varchar(20),
`loc` varchar(40)
);
INSERT INTO `dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES (40, 'OPERATIONS', 'BOSTON');
CREATE TABLE `emp` (
`empno` int PRIMARY KEY AUTO_INCREMENT,
`ename` varchar(20),
`job` varchar(20),
`mgr` int,
`hiredate` date,
`sal` double,
`comm` double,
`deptno` int,
CONSTRAINT `FK_EMP_DEPTNO` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
);
INSERT INTO `emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 1300,
NULL, 20);
INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 2100,
300, 30);
INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1750,
500, 30);
INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 3475,
NULL, 20);
INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1750,
1400, 30);
INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 3350,
NULL, 30);
INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2950,
NULL, 10);
INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3500,
NULL, 20);
INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5500,
NULL, 10);
INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 2000,
0, 30);
INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1600,
NULL, 20);
INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '0198-12-31', 1450,
NULL, 30);
INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3500,
NULL, 20);
INSERT INTO `emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1800,
NULL, 10);

数据插入成功:
在这里插入图片描述

编写实体类

实体类作为Mybatis进行sql映射使用,实体类通常与数据库表对应,Emp.java如下:
注:实体类是用来和数据库表对应的,我们最好全部使用引用类型。

import java.util.Date;
public class Emp 
{
		private Integer empno;
		private String ename;
		private String job;
		private Integer mgr;
		private Date hiredate;
		private Double sal;
		private Double comm;
		private Integer deptno;
     //get,set方法省略
}

编写映射文件

在src/main/resources下创建mapper目录,在该目录下创建sql映射文件Emp.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">
<!--
    namespace: 命名空间,作用是mapper文件进行分类管理,用于隔离sql语句。
    注意:如果使用mapper代理的方式进行开发,namespace有特殊的作用。
-->
<mapper namespace="emp">

    <select id="selectById" parameterType="java.lang.Integer"
            resultType="com.wedu.po.Emp">
        select empno, ename, job, hiredate, mgr, sal, comm, deptno from emp where
            empno=#{empno}
    </select>
</mapper>

加载映射文件

在MyBatis的全局配置文件mybatis-config.xml中添加映射文件位置。

<!-- 加载映射文件的位置 -->
<mappers>
   <mapper resource="mapper/Emp.xml"/>
</mappers>

log4j配置

Mybatis日志输出:log4j.properties配置文件。

#井号表示注释,配置内容为键值对格式,每行只能有一个键值对,键值对之间以=连接
#指定logger
#设定log4j的日志级别和输出的目的地
#INFO日志级别,Console和logfile输出的目的地
#等级 OFF,ERROR,WARN,INFO,DEBUG,TRACE,ALL
log4j.rootLogger=DEBUG,Console
#指定appender
#设定Logger的Console,其中Console为自定义名称,类型为控制台输出
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#设定Logger的logfile,其中logfile为自定义名称,类型为文件
#org.apache.log4j.FileAppender文件
#org.apache.log4j.RollingFileAppender文件大小到达指定尺寸后产生一个新的文件
#org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#设定文件的输出路径
log4j.appender.logfile.File=d:/log/test.log
#设定文件最大尺寸 单位可以使KB,MB,GB
log4j.appender.logfile.MaxFileSize=2048KB
#输出格式
#设定appender布局Layout
# %d 输出日志的日期和时间,指定格式:%d{yyyy-MM-dd HH:mm:ss SSS}
# %p 输出的日志级别
# %c 输出所属类的全类名
# %M 方法名
# %m 输出代码中指定消息
# %n 一个换行符
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %p %c.%M() --%m%n
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p %c.%M() --%m%n

编写测试程序

package com.wedu;

import com.wedu.po.Emp;
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;

public class MybatisTest {
    @Test
    public void test() throws IOException {
        //1.创建读取全局配置文件的流
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //2.通过配置文件流创建会话工厂
        SqlSessionFactory factory = builder.build(in);

        //3.通过会话工厂创建会话对象(SqlSession)
        SqlSession session = factory.openSession();

        Emp emp = session.selectOne("emp.selectById", 7369);
        System.out.println(emp);

        session.close();
    }
}

在这里插入图片描述

3.增删改查的基本操作

实现以下功能:
1. 查询所有员工信息;
2. 添加员工;
3. 更新员工;
4. 删除员工;

查询操作

mapper文件:
在这里插入图片描述
Java代码:

package com.wedu;

import com.wedu.po.Emp;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {
    private  SqlSession session;

    @Before
    public void setUp() throws IOException{
        //1.创建读取全局配置文件的流
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //2.通过配置文件流创建会话工厂
        SqlSessionFactory factory = builder.build(in);
        //3.通过会话工厂创建会话对象(SqlSession)
        session = factory.openSession();
    }

    @Test
    public void test() throws IOException {

        Emp emp = session.selectOne("emp.selectById", 7369);
        System.out.println(emp);

    }
    @Test
    public void testSelectAll(){
        List<Emp> emps = session.selectList("emp.selectAll");
        emps.forEach(System.out::println);
    }
    @After
    public void traeDown(){
        session.close();
    }

}

在这里插入图片描述

新增操作

mapper文件:
在这里插入图片描述
测试:

 @Test
    public void testinsert(){
        Emp emp= new Emp();
        emp.setEname("张三");
        emp.setJob("java");
        emp.setSal(500.0);
        int count= session.insert("emp.insert",emp);
        System.out.println(count);
        //mybatis的事务是需要手动提交
        session.commit();
    }

在这里插入图片描述
对应的数据库,一定要手动提交事务,不然没有数据库没有数据
在这里插入图片描述

修改

mapper文件:
在这里插入图片描述
测试:

@Test
    public void testUpdate() throws IOException {

        Emp emp = new Emp();
        emp.setEmpno(7936);
        emp.setEname("JERRY");
        emp.setJob("MANAGER");
        emp.setMgr(7698);
        emp.setHiredate(new Date(new Date().getTime() + 1000*60*60*24));
        emp.setSal(7800.0);
        emp.setComm(800.0);
        int count= session.update("emp.update",emp);
        System.out.println(count);
        //mybatis的事务是需要手动提交
        session.commit();
    }

在这里插入图片描述

删除操作

mapper文件:
在这里插入图片描述
测试:

@Test
    public void testDelete() throws IOException {

        int result = session.delete("emp.delete", 7936);
        System.out.println("影响数据库的条数为:" + result);
        session.commit();
    }

在这里插入图片描述

4. Mapper代理方式

Mapper代理开发方式只需要程序员编写Mapper接口(相当于Dao接口),由MyBatis框架根据接口定
义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
程序员编写Mapper接口需要遵循一些开发规范,MyBatis可以自动生成Mapper接口实现类代理对象。

   开发规范
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper.xml中定义的每个标签的id与Mapper接口方法名相同。
3、Mapper.xml中定义的每个sql的parameterType的类型与Mapper接口方法的参数类型相同。
4、Mapper.xml中定义的每个sql的resultType的类型与Mapper接口方法返回值类型相同。
}

注:Mapper.xml映射文件最好和Mapper接口名称一致。

Mybatis 工具类

为了简化MyBatis的开发,可将MyBatis进一步封装。
在这里插入图片描述

package com.wedu.util;

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 java.io.IOException;
import java.io.InputStream;

/**
 * Mybatis工具类
 */
public class MybatisUtil {
    /**
     * 不让用户在外界创建工具类对象
     */
    private MybatisUtil() {
    }
    /**
     * 初始化SqlSessionFactory对象
     */
    private static SqlSessionFactory factory;
    static {
        try {
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取SqlSession对象的方法
     */
    public static SqlSession getSession() {
        return factory.openSession();
    }
}

实体类

import java.util.Date;
public class Emp 
{
		private Integer empno;
		private String ename;
		private String job;
		private Integer mgr;
		private Date hiredate;
		private Double sal;
		private Double comm;
		private Integer deptno;
     //get,set方法省略
}

Mapper接口

在这里插入图片描述

  • 批量查询:方法返回值为List类型,表示SqlSession对象将调用selectList()方法。
  • 单条查询:方法返回值为单个实体对象,表示SqlSession对象将调用selectOne()方法。
  • 增删改:
    1.方法返回值为void,表示SqlSession对象中insert,update,delete方法的返回值不做任何处理。
    2.方法返回值为int类型,表示SqlSession对象中insert,update,delete方法的返回值直接返回。
    3.方法返回值为boolean类型,表示根据SqlSession对象中的insert,update,delete方法返回值(影响数据库的条数)判断操作是否成功,如果影响数据库的条数大于0条,表示成功,否则表示失败。

mapper文件

在这里插入图片描述

<?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">
<!--namespace:与Mapper接口的全限定名保持一致-->
<mapper namespace="com.wedu.mapper.EmpMapper">
    <!--
    statementId与Mapper接口的方法名称保持一致;
    parameterType的类型必须与方法的参数类型保持一致;
    resultType的类型必须与方法的返回值类型保持一致;
    -->
    <select id="select" resultType="com.wedu.po.Emp">
        select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
    </select>

    <select id="selectById" parameterType="java.lang.Integer"
            resultType="com.wedu.po.Emp">
        select empno,ename,job,hiredate,mgr,sal,comm,deptno from emp where
            empno=#{empno}
    </select>

    <insert id="insert" parameterType="com.wedu.po.Emp">
        insert into emp(ename,job,mgr,hiredate,sal,comm,deptno)
        values(#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})
    </insert>

    <update id="update" parameterType="com.wedu.po.Emp">
        update emp set
            ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},comm=#{comm},deptno=#{deptno}
        where empno=#{empno}
    </update>

    <delete id="delete" parameterType="java.lang.Integer">
        delete from emp where empno=#{empno}
    </delete>

</mapper>

加载mapper文件:

在这里插入图片描述

测试

package com.wedu;

import com.wedu.po.Emp;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class MybatisTest {
    private  SqlSession session;

    @Before
    public void setUp() throws IOException{
        //1.创建读取全局配置文件的流
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //2.通过配置文件流创建会话工厂
        SqlSessionFactory factory = builder.build(in);
        //3.通过会话工厂创建会话对象(SqlSession)
        session = factory.openSession();
    }

    @Test
    public void test() throws IOException {

        Emp emp = session.selectOne("emp.selectById", 7369);
        System.out.println(emp);

    }
    @Test
    public void testSelectAll(){
        List<Emp> emps = session.selectList("emp.selectAll");
        emps.forEach(System.out::println);
    }
    @Test
    public void testinsert(){
        Emp emp= new Emp();
        emp.setEname("张三");
        emp.setJob("java");
        emp.setSal(500.0);
        int count= session.insert("emp.insert",emp);
        System.out.println(count);
        //mybatis的事务是需要手动提交
        session.commit();
    }

    @Test
    public void testUpdate() throws IOException {

        Emp emp = new Emp();
        emp.setEmpno(7936);
        emp.setEname("JERRY");
        emp.setJob("MANAGER");
        emp.setMgr(7698);
        emp.setHiredate(new Date(new Date().getTime() + 1000*60*60*24));
        emp.setSal(7800.0);
        emp.setComm(800.0);
        int count= session.update("emp.update",emp);
        System.out.println(count);
        //mybatis的事务是需要手动提交
        session.commit();
    }

    @Test
    public void testDelete() throws IOException {

        int result = session.delete("emp.delete", 7936);
        System.out.println("影响数据库的条数为:" + result);
        session.commit();
    }
    @After
    public void traeDown(){
        session.close();
    }

}

比如运行插入:
在这里插入图片描述
在这里插入图片描述

Mybatis官方推荐使用mapper代理方式开发mapper接口,程序员不用编写mapper接口实现类,使用
mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

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

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

相关文章

一览科技创始人罗江春:AI涌现,文娱迎来黄金十年

编者荐语&#xff1a; 一览科技创始人兼CEO罗江春先生在11月28日的极新AIGC峰会上发表了以“AI涌现&#xff0c;文娱迎来黄金十年”为题的演讲&#xff0c;关于AIGC对文娱行业的加持以及AI创业公司的方向和基本点&#xff0c;罗江春先生给出了未来的方向。 以下文章来源于一览…

广度(宽度)优先搜素——层层递进

分析算法及题目 完整代码实现 广度优先搜索&#xff08;Breadth-First Search&#xff0c;BFS&#xff09;是一种图和树的遍历算法&#xff0c;与深度优先搜索相对应。BFS从起始节点开始&#xff0c;首先访问起始节点&#xff0c;然后逐层地访问其邻居节点&#xff0c;直到达到…

OpenHarmony应用开发——在标准OpenHarmony上运行应用-标准OpenHarmony工程设置

一、前言 前面我们创建了一个工程并使其在HarmonyOS系统上运行&#xff0c;本文我们来阐述一下如何在标准的OpenHarmony开发板或系统上运行。 二、详细步骤 1.下载并配置OpenHarmony SDK 首先&#xff0c;打开Settings. 将SDK选择为OpenHarmony&#xff0c;第一次选择路径应该…

想要更稳定的数据传输?试试这些Aspera替代方案

在现代数字化时代&#xff0c;数据传输变得越来越重要。由于数据文件的规模、数量和复杂性的增加&#xff0c;以及对数据安全和机密性的需求不断提高&#xff0c;传统的FTP、SCP和HTTP等协议已无法满足现代数据传输的需求。因此&#xff0c;许多组织和企业转向使用Aspera协议进…

外发加工ERP软件功能有哪些?外发加工ERP系统哪家好

不同的外发加工业务有不同的业务流程和管理策略与方式&#xff0c;在当前这个激烈竞争的时代&#xff0c;如何降低经营成本&#xff0c;打通各种信息流&#xff0c;优化资源配置和降低成本&#xff0c;提升生产过程联动效率&#xff0c;加强企业核心竞争力管理等&#xff0c;是…

轻松搭建FPGA开发环境:第二课——UE 安装与配置说明

工欲善其事必先利其器&#xff0c;很多人想从事FPGA的开发&#xff0c;但是不知道如何下手。既要装这个软件&#xff0c;又要装那个软件&#xff0c;还要编译仿真库&#xff0c;网上的教程一大堆&#xff0c;不知道到底应该听谁的。所以很多人还没开始就被繁琐的开发环境搭建吓…

基于ssm+jsp的实验室考勤管理系统网页的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本实验室考勤管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

后端只打印了info等级的日志?-SpringBoot日志打印-Slf4j

在调用log变量的方法来输出日志时&#xff0c;有以上5个级别对应的方法&#xff0c;从不太重要&#xff0c;到非常重要 调用不同的方法&#xff0c;就会输出不同级别的日志。 trace&#xff1a;跟踪信息debug&#xff1a;调试信息info&#xff1a;一般信息warn&#xff1a;警告…

浏览器的一些思考(12.13)

1.在没有浏览器之前是什么样子的&#xff1f; 在没有浏览器之前&#xff0c;人们访问互联网主要通过终端机或图文电视系统。 终端机是一种没有显示器、键盘和鼠标的计算机&#xff0c;只能通过终端模拟器来显示和操作。终端模拟器可以模拟终端机的功能&#xff0c;让用户能够…

只有27亿参数,性能却高25倍!微软发布Phi-2

12月13日&#xff0c;微软在官方网站正式发布了&#xff0c;27亿参数的大语言模型—Phi-2。 Phi-2是基于微软的Phi-1.5开发而成&#xff0c;可自动生成文本/代码、总结文本、数学推理等功能。 虽然Phi-2的参数很小&#xff0c;性能却优于130亿参数的Llama-2和70亿参数的Mistr…

大型软件编程实际应用实例:个体诊所电子处方系统,使用配方模板功能输入症状就可开出处方软件操作教程

一、前言&#xff1a; 在开电子处方的时候&#xff0c;如果能够输入症状就可以一键导入配方&#xff0c;则在很大程度上可以节省很多时间。而且这个配方可以根据自己的经验自己设置&#xff0c;下面以 佳易王诊所电子处方软件为例说明。 二、具体一键导入配方详细操作教程 点击…

YOLOv8独家原创改进:SPPF自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

💡💡💡本文原创自研创新改进:SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响 强烈推荐,适合直接使用,paper创新级别 💡💡💡 在多个数据集验证涨点,尤其对存在多个尺…

20分钟部署ChatGLM3-6B

准备工作 1.下载源代码&#xff1a; https://github.com/THUDM/ChatGLM3 2.下载预训练模型&#xff1a; https://modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以创建一个py文件&#xff0c;直接使用如下代码下载到本地&#xff1a; from modelscope.hub.snapshot_dow…

Esxi中的AlmaLinux硬盘扩容

Esxi中的AlmaLinux硬盘扩容 通过本文能学习到 虚拟机中的AlmaLinux硬盘扩容 本文主要包括3部分内容&#xff1a; 1. 需要进行扩容的原因 2. 写这篇文章的目的 3. 扩容实操需要进行扩容的原因 近日&#xff0c;使用Jenkins部署时&#xff0c;出现镜像向Nexus私服推送镜像时…

三、CM4树莓派文件传输及终端常用命令

一、文件传输 方法1&#xff1a;使用U盘 方法2&#xff1a;VNC文件传输 电脑文件传输到树莓派 树莓派文件传输到电脑 二、终端常用命令 sudo&#xff1a;以超级用户的身份来执行命令 sudo su #切换为超级用户身份 su pi #切换回普通用户pi 目录切换命令pwd#显示当前所在目…

【Linux系统编程二十一】:(进程通信3)--消息队列/信号量(system v标准的内核数据结构的设计模式)

【Linux系统编程二十】&#xff1a;消息队列/信号量(system v标准的内核数据结构的设计模式&#xff09; 一.消息队列二.system v标准的内核数据结构的设计三.四个概念(互斥/临界)四.信号量1.多线程并发访问2.计数器3.原子的4.总结 一.消息队列 一个叫做a进程啊&#xff0c;一个…

【解刊】CCF-C类,1区SCI,1个月21天录用!影响因子持续走高,对国人友好!

计算机类 • 好刊解读 今天小编带来Elsevier旗下计算机领域好刊&#xff0c;如您有投稿需求&#xff0c;可作为重点关注&#xff01;后文有相关领域真实发表案例&#xff0c;供您投稿参考~ 01 期刊简介 Computer Communications ✅出版社&#xff1a;Elsevier ✅ISSN&#…

【自定义Source、Sink】Flink自定义Source、Sink对ClickHouse进行读和批量写操作

ClickHouse官网文档 Flink 读取 ClickHouse 数据两种驱动 ClickHouse 官方提供Clickhouse JDBC.【建议使用】第3方提供的Clickhouse JDBC. ru.yandex.clickhouse.ClickHouseDriver ru.yandex.clickhouse.ClickHouseDriver.现在是没有维护 ClickHouse 官方提供Clickhouse JDBC…

谈谈常用的分布式ID的设计方案?

典型回答 首先&#xff0c;我们需要明确通常的分布式ID定义&#xff0c;基本的要求包括&#xff1a; 全局唯一&#xff0c;区别于单点系统的唯一&#xff0c;全局是要求分布式系统内唯一。 有序性&#xff0c;通常都需要保证生成的ID是有序递增的。例如&#xff0c;在数据库存…

控制笔记本电脑性能,增强性能/控制发热---Thinkpad x280

1、引言 手上有一台收来办公的Thinkpad x280,但安装的联想管家却没有性能调节选项&#xff0c;导致电脑性能释放很不顺手。由于有室外办公需求&#xff0c;也就有续航需求&#xff0c;也是让它减少发热&#xff1b;同时我想在室内的时候&#xff0c;完整发挥它的性能&#xff…