MyBatis进阶
日志的使用
我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所以我们采用专门的日志系统来处理.
步骤
- 导入坐标
- 拷贝日志配置文件到项目
讲解
• 导入坐标
<!--log start-->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.6</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.6</version>
</dependency>
<!--log end-->
• log4j.properties
#日志输出级别,最低级别为DEBUG,输出到stdout
#error > warn > info > debug > trace
log4j.rootLogger=DEBUG,stdout
#输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#可以灵活的指定布局模式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#时间
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %t %l %d %rms:%m%n
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:\\test\\mm_backend.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p [%t] {%c}-%m%n
log4j.rootLogger=INFO, stdout , R
此句为将等级为 INFO 的日志信息输出到 stdout 和 R 这两个目的地,stdout 和 R 的定义在下面的代码,可 以任意起名。等级可分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置 OFF 则不打出任何信息, 如果配置为 INFO 这样只显示 INFO, WARN, ERROR 的 log 信息,而 DEBUG 信息不会被显示,具体讲解可参照 第三部分定义配置文件中的 logger。
使用Mybatis完成CRUD
1.需求
使用Mybatis完成CRUD
新增用户步骤
AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
https://blog.csdn.net/u010502101/article/details/78823056
1. UserDao中添加新增方法
public interface UserDao {/*** 添加用户* @param user 要添加到数据库的数据* @return 受到影响的行数*/public int addUser(User user);
}
2. 在UserDao.xml中加入新增配置
<insert id="addUser" parameterType="User">//因为配置文件里起了别名,所以这里直接User就行了,不然还是要写全路径。insert into t_user (username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address})//占位符见下面根据id查询的xml里面有说明。
</insert>
3. 添加操作测试
public class TestMybatis {private UserDao userDao;private SqlSession sqlSession;private InputStream is;@Before//用这个注解,执行@Test之前会先执行这个方法public void init() throws IOException {//1.让mybatis框架去加载主配置文件//1.1 将主配置文件SqlMapConfig.xml转换成字节输入流is = Resources.getResourceAsStream("SqlMapConfig.xml");//1.2创建一个SqlSessionFactoryBuilderSqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();//1.3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);//1.4使用sqlSessionFactory对象创建处SqlSession对象sqlSession = sqlSessionFactory.openSession();//使用了工厂模式//2.使用sqlSession对象创建处UserDao接口的代理对象userDao = sqlSession.getMapper(UserDao.class);//使用了动态代理}@Testpublic void testAddUser(){//3.调用userDao代理对象的addUser()方法添加用户User user = new User(null,"zl","男",new Date(),"成都");//注意!这里是null,pojo里面id必须为Integer类型!int类型不能为null。userDao.addUser(user);//目标是添加完用户之后,获取到该用户的id,可以在以后的多表中,进行关联查询System.out.println(user.getUid());//这个说明见下面这个}//获取从pojo获取@After//同理,@Test之后执行这个。public void destroy() throws IOException {//提交事务sqlSession.commit();//4.关闭资源sqlSession.close();is.close();}
}
新增用户 id 的返回值
新增用户后, 同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。
• SelectKey获取主键
<!--我们可以发现, 这个 sql 语句中使用#{}字符, #{}代表占位符,我们可以理解是原来 jdbc 部分所学的?,它们都是代表占位符, 具体的值是由 User 类的属性来决定的,前提必须名字pojo里面的名字和占位符里面的一样,才会给匹配上去。然后sql前面的名字是和数据库里字段名匹配。parameterType 属性:代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。selectKey标签: 查询主键keyColumn 表示要查询的列名keyProperty 表示要赋值的属性名,返回的赋值给pojo了resultType 表示查询出来的结果的类型order 表示在前或者在后执行select last_insert_id() 查询最后一个自增长的id的值
-->
<insert id="addUser" parameterType="User"><selectKey resultType="int" order="AFTER" keyProperty="uid" keyColumn="uid">select last_insert_id()</selectKey>insert into t_user (username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address})
</insert>
根据id查询用户
UserDao添加根据id查询的方法
public User findById(Integer id);
UserDao.xml文件中新增配置
<select id="findById" parameterType="int" resultType="User">select * from t_user where uid=#{uid}
</select>
修改用户
UserDao添加修改的方法
public void updateUser(User user);
UserDao.xml文件中新增配置
<update id="updateUser" parameterType="User">update t_user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where uid=#{uid}
</update>
测试:
先调用根据id查询要修改的人的信息,再修改。所以,xml文件里应该修改所有的信息,在这里不能单个修改。
删除用户
UserDao中添加删除方法
public int deleteById(int id);
UserDao.xml文件中新增配置
<delete id="deleteById" parameterType="int">delete from t_user where uid=#{id}
</delete>
注意:
数据库删除中间的任意一行后,比如删除第3个。原来顺序是1234,会变成124。就是不是一个完整的顺序了!!!如果想调整成完整的顺序,就需要别的操作来操作一下。
模糊查询
方式一(不推荐使用)
UserDao中添加模糊查询方法
public List<User> searchByUsername(String name);
UserDao.xml文件中新增配置
<select id="searchByUsername" parameterType="String" resultType="User">select * from t_user where username like #{name}
</select>
测试方法
查询名字里有l的。
@Test
public void testSearchByUsername(){List<User> userList = userDao.searchByUsername("%l%");for (User user : userList) {System.out.println(user);}
}
方式二
UserDao中添加模糊查询方法
public List<User> searchByUsername(String name);
UserDao.xml文件中新增配置
<!--模糊查询另外一种在SQL语句中引用方法的参数的方式:${}1. 引用pojo中的属性: '${属性名}'2. 引用简单类型的参数: '${value}',但是高版本的mybatis中可以'${任意字符串}'
-->
<select id="searchByUsername" parameterType="String" resultType="User">方式一:<!--select * from t_user where username like "%"#{name}"%"-->方式二:<!--select * from t_user where username like concat("%",#{name},"%")-->select * from t_user where username like "%${value}%"
//方式三:才是最常用。
</select>
测试方法
@Test
public void testSearchByUsername(){List<User> userList = userDao.searchByUsername("l");//上面三个都是传一个l就行。for (User user : userList) {System.out.println(user);}
}
#{}与${}的区别
- #{}一定不能写在引号里面,${}一定要写在引号里面,因为他是字符串拼接
- 如果是pojo、map类型的参数,无论是#{}还是${}里面都是属性名
- 如果是简单类型的参数,#{}里面可以写任意字符串,但是${}里面只能写value(以前的版本)
- 如果使用#{}引入参数的话,其实是先使用?这个占位符,然后再设置参数;而使用${}引入参数的话,是直接拼接SQL语句
建议尽量使用#{}。
SqlSessionFactory工具类的抽取
步骤:
- 创建SqlSessionFactoryUtils
- 定义一个openSqlSession ()方法获得sqlSession
- 定义释放资源方法
- 保证SqlSessionFactory只有一个(静态代码块)
实现:
package com.gavin.utils;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;/*** 1. 类加载的时候就创建出来了一个SqlSessionFactory对象* 2. 我们得声明一个方法,用于创建SqlSession对象,因为每次执行SQL语句的sqlSession对象不能是同一个*/
public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {try{//1 将主配置文件SqlMapConfig.xml转换成字节输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2创建一个SqlSessionFactoryBuilderSqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();//3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象sqlSessionFactory = factoryBuilder.build(is);is.close();} catch (IOException e) {e.printStackTrace();}}/*** 创建SqlSession对象* @return*/public static SqlSession openSqlSession(){return sqlSessionFactory.openSession();}/*** 提交事务并且关闭SqlSession* @param sqlSession*/public static void commitAndClose(SqlSession sqlSession){sqlSession.commit();sqlSession.close();}/*** 回滚事务并且关闭SqlSession* @param sqlSession*/public static void rollbackAndClose(SqlSession sqlSession){sqlSession.rollback();sqlSession.close();}
}
测试
public class TestSqlSessionFactoryUtils {@Testpublic void test1(){//1. 创建SqlSession对象SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();//2. 创建UserDao的代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//3. 调用userDao对象的findById()方法System.out.println(userDao.findById(6));//4. 关闭资源,提交事务SqlSessionFactoryUtils.commitAndClose(sqlSession);}
}
parameterType深入
传递简单类型
单个参数,方法就以简单类型传入即可,那么在映射配置文件中的parameterType的值就是这个简单类型的别名;在SQL语句中引入简单类型的参数#{任意字符串}
User findById(int id);
select * from t_user where uid=#{id}
传递 pojo 对象 或者 Map
- 将多个参数封装到一个POJO中,那么在映射配置文件中parameterType的值就是这个POJO的全限定名或者别名; 在SQL语句中引入参数#{POJO的属性名}或者’${POJO的属性名}’
- 将多个参数封装到一个Map中(要封装的参数没有对应的POJO),那么在映射配置文件中parameterType的值是map; 在SQL语句中引入参数#{map的key}或者’${map的key}’
void addUser(User user);void updateUser(Map map);
<insert id="addUser" parameterType="User">insert into t_user (username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address})
</insert><update id="updateUser" parameterType="map">update t_user set username=#{username},sex=#{sex} where uid=#{uid}
</update>
@Test
public void test2() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User(null, "麻子", "男", new Date(), "重庆");mapper.addUser(user);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}@Test
public void test3(){SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);Map map = new HashMap();map.put("username","老八");map.put("sex","女");map.put("uid",7);mapper.updateUser(map);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
传递多个参数
方式一:通过参数索引
User findByUsernameAndAddress(String username, String address);
<select id="findByUsernameAndAddress" resultType="User">select * from t_user where username=#{arg0} and address=#{arg1}
</select>
方式二:通过注解
@Param使用注解指定参数的名称
User findByUsernameAndSex(@Param("name") String username,@Param("sex") String sex);
<select id="findByUsernameAndSex" resultType="User">select * from t_user where username=#{name} and sex=#{sex}
</select>
传递 pojo 包装对象类型
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
需求:根据用户id查询用户信息并进行分页,查询条件放到 QueryVo 的 user 属性中。
QueryVo.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class QueryVo {public QueryVo(Long currentPage, Integer pageSize, User queryCondition) {this.currentPage = currentPage;this.pageSize = pageSize;this.queryCondition = queryCondition;}private Long currentPage;private Integer pageSize;//查询条件private User queryCondition;private Long offset;public Long getOffset(){return (currentPage-1)*pageSize;}
}
UserDao.java
List<User> searchByCondition(QueryVo queryVo);
UserDao.xml
<select id="searchByCondition" parameterType="QueryVo" resultType="User">select * from t_user where sex=#{queryCondition.sex} and address=#{queryCondition.address}limit #{offset},#{pageSize}
</select>
测试
@Test
public void test6() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User();user.setSex("男");user.setAddress("北京");QueryVo queryVo = new QueryVo(1l,5,user);List<User> userList = mapper.searchByCondition(queryVo);for (User user1 : userList) {System.out.println(user1);}SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
resultType深入
输出简单类型
查询的结果是单个数据, 映射配置文件中的resultType属性的值就是这个数据的类型
/*** 查询用户的总个数* @return*/
Long findTotal();
<select id="findTotal" resultType="long">select count(*) from t_user
</select>
输出pojo对象(一个pojo对象就对应一行数据)或者一个Map
查询的结果是一行数据:
• 将这一行数据存储到POJO对象中, 映射配置文件的resultType的值就是POJO的全限定名或者别名,此时就要求查询结果的字段名和类型 要和POJO的属性名和类型一致
/*** 根据id查询一条数据* @param id* @return*/
User findById(int id);
<select id="findById" parameterType="int" resultType="User">select * from t_user where uid=#{uid}
</select>
• 将这一行数据存储到Map对象,映射配置文件的resultType的值就是map,那么此时查询结果中的字段名就是 map的key,字段值就是map的value
/*** 根据用户名查询用户* @param username* @return*/
Map findByUsername(String username);
<select id="findByUsername" parameterType="string" resultType="map">select *from t_userwhere username = #{username}
</select>
输出pojo列表(一个pojo列表就对应多行数据)或者Map的列表
查询的结果是多行数据:
• 将多条数据存储到List中,映射配置文件的resultType的值就是POJO的别名
List<User> findAll();
<select id="findAll" resultType="User">select *from t_user
</select>
• 将多条数据存储到List
List<Map> findAll2();
<select id="findAll2" resultType="map">select *from t_user
</select>
resultMap结果类型
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。(下次课讲)
那我们今天就来看返回的列名与实体类的属性不一致时的情况. 下次课再接着研究复杂的封
UserInfo
package com.gavin.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo implements Serializable {private Integer userId;private String username;private String userSex;private String userBirthday;private String userAddress;
}
UserDao
/*** 查询所有用户信息,封装到UserInfo对象* @return*/
List<UserInfo> findAllUserInfo();
UserDao.xml
<resultMap id="userInfoMap" type="UserInfo" autoMapping="true">
Column是数据库字段名<id column="uid" property="userId"></id><result column="sex" property="userSex"></result><result column="birthday" property="userBirthday"></result><result column="address" property="userAddress"></result>
</resultMap><select id="findAllUserInfo" resultMap="userInfoMap">select *from t_user
</select>
测试
public class TestMybatis {@Testpublic void test1() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);List<UserInfo> userInfoList = mapper.findAllUserInfo();for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}SqlSessionFactoryUtils.commitAndClose(sqlSession);}
}
相关文章:

MyBatis进阶
日志的使用 我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所以我们采用专门的日志系统来处理. 步骤 导入坐标拷贝…...

容器化部署Kafka的最佳实践:基于KRaft模式的无ZooKeeper方案
一、docker 部署kafka单节点 1.1安装docker 可以参考这篇CentOS 7安装docker并配置镜像加速 1.3 运行kafka(注意修改zookeeper,kafka地址) docker run -d --name kafka -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://172.16.10.180:9092 -p …...

DeepSeek核心算法解析:如何打造比肩ChatGPT的国产大模型
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列一DeepSeek核心算法解析:如何…...
LeetCode-633. 平方数之和
1、题目描述 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 b2 c 。 示例 1: 输入:c 5 输出:true 解释:1 * 1 2 * 2 5示例 2: 输入:c 3 输出:f…...

前端面试技巧与实践
在当今快速发展的互联网行业中,前端开发已经成为了一个至关重要的角色。随着技术的不断进步和用户需求的日益复杂,前端工程师的职责不再仅仅是实现页面的布局和交互,而是需要具备全方位的技术能力和工程思维。根据2023年Stack Overflow的开发…...

windows Redis Insight 如何查看宝塔docker里的redis数据
1、ping 命令用于测试网络连通性,它只需要目标 IP 地址作为参数,不需要端口号。正确的命令如下: ping 公网地址2、使用 Telnet 测试端口连通性 telnet 公网地址 端口 telnet 47.108.67.228 6379如果连接成功,窗口会变为空白&am…...

sql数据执行失败,三个命令依次执行
set global innodb_strict_mode off set global.sql_mode ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION; set sql_mode ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION;...

BGP配置华为——RR反射器配置
实验拓扑 与之前实验同理将loop0作为routerID使用,且R1和R2上用loop1接口用于模拟用户其他网段 实验要求 1,在AS100内运行OSPF协议 2.配置路由反射器,使得从R1进入的数据能够反射到全局网络 3.在R1和R2上分别宣告自己的loop1口网段用于观…...

基于Flask的艺恩影片票房分析系统的设计与实现
【Flask】基于Flask的艺恩影片票房分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统利用Python编程语言进行后端开发,结合Echarts进行数据的可视化展示&a…...

架构设计系列(三):架构模式
一、概述 关于移动应用开发中常见的架构模式,这些模式是为了克服早期模式的局限性而引入。常见的 架构模式有: MVC, MVP, MVVM, MVVM-C, and VIPER 二、MVC, MVP, MVVM, MVVM-C, and VIPER架构模式 MVC、MVP、MVVM、MVVM-C 和 VIPER 是移动应用开发中…...

零基础学QT、C++(一)安装QT
目录 如何快速学习QT、C呢? 一、编译器、项目构建工具 1、编译器(介绍2款) 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢? 那就是项目驱动法&…...
SQL注入(SQL Injection)详解与实战
文章目录 一、什么是SQL注入?二、常见SQL注入类型三、手动注入步骤(以CTF题目为例)四、CTF实战技巧五、自动化工具:SQLMap六、防御措施七、CTF例题八、资源推荐 一、什么是SQL注入? SQL注入是一种通过用户输入构造恶意…...

【Prometheus】prometheus结合domain_exporter实现域名监控
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

Java 设计模式之命令模式
文章目录 Java 设计模式之命令模式概述UML代码实现简单实现复杂实现 Java 设计模式之命令模式 概述 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可…...

BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项
BT401音频蓝牙模块如何开启ble的透传? 首先BT401的蓝牙音频模块,分为两个版本,dac版本和iis数字音频版本 DAC版本:就是BT401蓝牙模块【9和10脚】直接输出模拟音频信号,也就是说,直接推动耳机可以听到声音 …...
利用二分法+布尔盲注、时间盲注进行sql注入
一、布尔盲注: import requestsdef binary_search_character(url, query, index, low32, high127):while low < high:mid (low high 1) // 2payload f"1 AND ASCII(SUBSTRING(({query}),{index},1)) > {mid} -- "res {"id": payloa…...
Vue 项目登录的基本流程
Vue 用户登录的基本流程包括以下6个步骤: 步骤: 1. 创建登录表单 在前端,首先要创建一个登录表单,用户输入账号(用户名、邮箱、手机号等)和密码。 示例:Login.vue <template><div…...

kubernetes源码分析 kubelet
简介 从官方的架构图中很容易就能找到 kubelet 执行 kubelet -h 看到 kubelet 的功能介绍: kubelet 是每个 Node 节点上都运行的主要“节点代理”。使用如下的一个向 apiserver 注册 Node 节点:主机的 hostname;覆盖 host 的参数࿱…...

Web3 开发者周刊 36 | 构建自主未来:Agent、可扩展性与赏金
欢迎来到 Web3 开发者周刊 36,这里汇聚了赋能您的 Web3 构建之旅的各种资源。本周我们将剖析基于Agent的系统,讨论来自 Vitalik 关于以太坊 L1 和 L2 的最新思考,并提供最新高价值Bounty消息。 开始Build吧! ✅ One Trillion Age…...

零基础入门机器学习 -- 第十一章机器学习模型的评估与优化
如何判断你的模型到底行不行? 11.1 为什么需要评估模型? 场景设定:信用卡欺诈检测 想象你是ABC银行的风控经理,你每天的工作就是盯着上百万笔交易,防止客户的信用卡被盗刷。 你们银行新推出了一款机器学习模型&…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...