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

MyBatis系统学习 - 使用Mybatis完成查询单条,多条数据,模糊查询,动态设置表名,获取自增主键

上篇博客我们围绕Mybatis链接数据库进行了相关概述,并对Mybatis的配置文件进行详细的描述,本篇博客也是建立在上篇博客之上进行的,在上面博客搭建的框架基础上,我们对MyBatis实现简单的增删改查操作进行重点概述,在MyBatis中实现简单的增删改查,算是我们在处理业务的时候经常干的事情,使用Mybatis可以帮助我们将数据库操作封装在映射文件或者映射接口中,让开发人员可以通过简单的配置或者接口方法来执行数据库操作,进而无需重复编写繁琐的SQL,并且可以灵活编写SQL语句,可以根据实际需求进行SQL拼接,从而提高数据库操作的灵活性和可用性。

项目目录结构

在这里插入图片描述
PS: 上述的Service层是我为了按照规范进行开发创建的相关类,实际开发中则需要按照上述规范进行,而本篇博客我们将不会使用到service层,所以,读者可以无需创建Service和ServiceImpl。

关注点:

  1. MyBatis实现简单的增删改查也会实现MyBatis实现一些相对复杂的查询功能,其中包括查询List集合,查询一个实体类对象,以及查询单个数据,查询单条为Map的集合和多条Map的集合。
  2. MyBatis获取参数值的两种方式: ${}和#{}
  3. 特殊SQL的执行:模糊查询,批量删除,动态设置表名,添加功能获取自增的主键
  4. 自定义映射resultMap,多对一和一对多映射关系处理

数据库

CREATE TABLE `test`.`user`  (`id` int(11) NOT NULL,`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;CREATE TABLE `test`.`book`  (`uid` int(11) NOT NULL COMMENT '用户id',`book` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '用户借的书的名称',`cool` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'cool星级',PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

实体Bean

public class Book {private Integer uid;private String book;private String cool;public Book() {}public Book(Integer uid, String book, String cool) {this.uid = uid;this.book = book;this.cool = cool;}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getBook() {return book;}public void setBook(String book) {this.book = book;}public String getCool() {return cool;}public void setCool(String cool) {this.cool = cool;}@Overridepublic String toString() {return "Book{" +", uid=" + uid +", book='" + book + '\'' +", cool='" + cool + '\'' +'}';}
}
public class User {private int id;private String name;private  String username;private String sex;private Book book;private Integer uid;private String bookName;private String cool;@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", username='" + username + '\'' +", sex='" + sex + '\'' +", book=" + book +'}';}public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getCool() {return cool;}public void setCool(String cool) {this.cool = cool;}public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public User(int id, String name, String username, String sex) {this.id = id;this.name = name;this.username = username;this.sex = sex;}public User() {}
}

Mapper映射层接口

@Mapper
public interface UserMapper {/*** 查询用户对象*/User selectUser(@Param("user") User user);/*** 插入用户数据*/int insertUser(User user);/*** 更新数据*/int updateUser(@Param("user") User user);/*** 删除用户数据*/int deleteUser(int id);/*** 批量删除用户数据*/int  deleteUserBatch(@Param("ids") String ids);/*** 查询所有用户数据*/List<User> selectAll();/*** 查询单条数据,并转化为Map对象数据*/Map<String,Object> getUserToMap(@Param("id") int id);/*** 查询多条数据斌并转化为Map对象数据*/List<Map<String,Object>> get100UserToMap();/*** 查询多条数据并转换为Map对象的数据的第二种方式*/@MapKey("id")Map<Integer,User> get100UserToMap2();/*** 模糊查询*/List<User> selectUserLike(@Param("user") User user);/*** 动态设置表名查询数据*/List<User> selectUserByTableName(@Param("tableName") String tableName);/** 根据用户id查询信息*/User getUserById(int id);/** 管理其他表一对一查询 */User getUserBookById(int id);
}

Mapper接口对应的映射xml文件

关注

Mapper文件我们需要注意的是:
resultTyperesultType用于指定查询结果的类型。它可以是Java的基本数据类型(如int、String等),也可以是自定义的Java对象。MyBatis会根据查询结果的列名和resultType的类型进行自动映射。示例代码如下:

<select id="getUser" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}
</select>

resultType指定了查询结果的类型为com.example.User,MyBatis会将查询结果自动映射到User对象中。

parameterTypeparameterType用于指定SQL语句的参数类型。它可以是Java的基本数据类型、Java对象或者是一个Map。示例代码如下:

<insert id="insertUser" parameterType="com.example.User">INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

parameterType指定了插入语句的参数类型为com.example.User,MyBatis会将User对象的属性值作为参数传递给SQL语句。

id:id用于唯一标识映射文件(或注解)中的语句。它是一个字符串,可以自定义命名,用于在代码中调用对应的SQL语句。示例代码如下:

<select id="getUserById" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}
</select>

UserMapper.xml文件

<?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="com.miaow.mybatis.mapper.UserMapper"><!--resultMap:设置自定义映射属性:id:表示自定义映射的唯一标识type:查询的数据要映射的实体类的类型子标签:id:设置主键的映射关系result:设置普通字段的映射关系association:设置多对一的映射关系collection:设置一对多的映射关系属性:property:设置映射关系中实体类中的属性名column:设置映射关系中表中的字段名--><resultMap id="userMap" type="User">
<!--        实际山和我们数据库字段别名差不多--><id property="id" column="id"></id><result property="name" column="name"></result><result property="username" column="username"></result><result property="sex" column="sex"></result><association property="book" javaType="Book"><id property="uid" column="uid"></id><result property="book" column="bookName"></result><result property="cool" column="cool"></result></association></resultMap><!--    根据resultMap获取相关数据--><select id="getUserById" resultMap="userMap" parameterType="int">select * from user where id = #{id};</select><!--    管理其他表一对一查询 --><select id="getUserBookById" resultMap="userMap" parameterType="int">select a.*,b.uid as uid,b.book as bookName ,b.cool as cool from user aleft join book b on a.id = b.uidwhere a.id = #{id}</select><!--    插入单条数据* useGeneratedKeys:设置使用自增的主键* keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中--><insert id="insertUser" parameterType="com.miaow.mybatis.bean.User" useGeneratedKeys="true" keyProperty="id" >insert into user values(#{id},#{username},#{name},#{sex})</insert><!--    更新数据 --><update id="updateUser" parameterType="com.miaow.mybatis.bean.User">update user set name = #{user.name} where id = #{user.id}</update><!--    删除单条数据--><delete id="deleteUser" parameterType="int">delete  from  user where id = #{id}</delete>
<!--    批量删除数据--><delete id="deleteUserBatch" parameterType="java.lang.String">delete  from  user where id in (${ids})</delete><!--   根据ID查询相关数据--><select id="selectUser" resultType="com.miaow.mybatis.bean.User">select * from user where id = #{user.id}</select>
<!--    查询数据库所有数据--><select id="selectAll" resultType="com.miaow.mybatis.bean.User">select * from user</select><select id="getUserToMap" resultType="java.util.Map" parameterType="int">select * from user where id = #{id};</select><select id="get100UserToMap" resultType="java.util.Map">select * from user limit 100;</select><select id="get100UserToMap2" resultType="java.util.Map">select * from user limit 100;</select><select id="selectUserLike" resultType="com.miaow.mybatis.bean.User"parameterType="com.miaow.mybatis.bean.User">select * from user where username like "%" #{user.username} "%"</select>
<!--    动态设置表名查询数据 --><select id="selectUserByTableName" resultType="com.miaow.mybatis.bean.User"parameterType="java.lang.String">select * from ${tableName} limit 100</select>
</mapper>

我们根据上述的这个XML文件进行配置进行讲解:
MyBatis实现简单的增删改查也会实现MyBatis实现一些相对复杂的查询功能,其中包括查询List集合,查询一个实体类对象,以及查询单个数据,查询单条为Map的集合和多条Map的集合。

简单的新增

<insert id="insertUser" parameterType="com.miaow.mybatis.bean.User" useGeneratedKeys="true" keyProperty="id" >insert into user values(#{id},#{username},#{name},#{sex})</insert>

我们通过SQL语句和Xml的配置文件写入SQL,但是不知道眼尖的同学看到没有,这里边我写了插入id,实际上是我架构表的时候,没有使用自增,这算是我的锅,如果你配置了自增,我们有没有发现useGeneratedKeys="true" keyProperty="id" 这个语句?
useGeneratedKeys:设置使用自增的主键,默认为False。

我们在插入数据的时候,我们有时候需要直接插入数据的时候,这个时候我们可能不知道我们插入的主键id是多少
这个时候我们只需要配置 useGeneratedKeys=“true” keyProperty=“id” 然后我们就可以直接拿到我们插入数据的主键id,比如 int value = userMapper.insertUser(user); int id = userVo.getId();//获取插入数据后的主键id

keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中,比如我上面的是绑定的id,那么Mybatis就将返回的id值存入到实体类的与之相同的字段中。

删除单条数据

    <delete id="deleteUser" parameterType="int">delete  from  user where id = #{id}</delete>

删除多条数据

<!--    批量删除数据--><delete id="deleteUserBatch" parameterType="java.lang.String">delete  from  user where id in (${ids})</delete>
    public void test8() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);String i = "5,6,7,8,9";int V = userMapper.deleteUserBatch(i);if(V > 0){System.out.println("success");}else {System.out.println("fail");}}

查询一个实体类对象

User getUserById(@Param("id") int id);
<select id="getUserById" resultType="com.miaow.mybatis.bean.User">select * from t_user where id = #{id}
</select>

${}和#{}

MyBatis获取参数值的两种方式: ${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

#{}#{}是预编译的占位符,它会将参数值作为参数对象的属性值进行处理,并使用预编译语句来执行数据库操作。这种方式可以提供更好的系统安全性,因为参数值会被自动转义,从而防止SQL注入攻击。使用#{}可以有效地防止恶意用户通过参数值注入恶意的SQL代码。

${}${}是字符串替换的占位符,它会将参数值直接替换到SQL语句中。这种方式更加灵活,可以在SQL语句中使用动态的表名、列名或其他字符串。然而,使用${}也带来了一些安全风险,因参数值不会被自动转义,可能会导致SQL注入攻击。因此,使用${}时需要确保参数值的安全性,例如通过输入验证或白名单过滤来防止恶意输入。

${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

MyBatis中建议使用#{},原因在于其可以预防SQL注入,而${}无法预防SQL注入

特殊SQL的执行:模糊查询,批量删除,动态设置表名,添加功能获取自增的主键

自定义映射

驼峰配置

主要为了解决java字段和数据库字段不一致问题。我们有两种方式,一种是自定义映射,一种是我们在MyBatis中配置驼峰命名的规则的自动映射。

<settings><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

MyBatis的全局配置文件中开启驼峰命名规则的自动映射。通过设置mapUnderscoreToCamelCase属性为true,MyBatis会自动将数据库表的下划线命名转换为Java对象的驼峰命名。

自定义映射resultMap,多对一和一对多映射关系处理

resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名

    <resultMap id="userMap" type="User">
<!--        实际山和我们数据库字段别名差不多--><id property="id" column="id"></id><result property="name" column="name"></result><result property="username" column="username"></result><result property="sex" column="sex"></result><association property="book" javaType="Book"><id property="uid" column="uid"></id><result property="book" column="bookName"></result><result property="cool" column="cool"></result></association></resultMap>

自定义设置表名

<!--    动态设置表名查询数据 --><select id="selectUserByTableName" resultType="com.miaow.mybatis.bean.User"parameterType="java.lang.String">select * from ${tableName} limit 100</select>
/**动态设置表名查询数据  可以通过@Param注解标识mapper接口中的方法参数此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;*/
List<User> selectUserByTableName(@Param("tableName") String tableName);
    // 动态设置表名查询数据@Testpublic void test9() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);//根据我们传入的表名查询对应的表信息List<User> users = userMapper.selectUserByTableName("user");for (User user : users) {System.out.println(user);}}

测试类

public class UserTest {@Resourceprivate UserService userService;//插入单条数据@Testpublic void test() throws IOException {//仅仅属于Mybatis框架的相关知识解决相关问题//首先读取Mybatis配置文件InputStream is = Resources.getResourceAsStream("mybatis.xml");//创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//创建SqlSession//第一个参数为是否自动提交,true为自动提交,false为手动提交,默认为false//SqlSession对象,此时通过sqlSession对象所操作的sql都会提交SqlSession session = sqlSessionFactory.openSession(true);//通过sqlSession对象获取mapper接口对象UserMapper userMapper = session.getMapper(UserMapper.class);//执行sql,插入数据的时候,我做了一个操作就获取主键的操作,调用的事Mybatis的主键回调功能int i = userMapper.insertUser(new User(1,"miaow","罗小黑","1"));if(i > 0){System.out.println("success");}else {System.out.println("fail");}//提交事务//session.commit();//关闭sessionsession.close();}//查询表中所有数据@Testpublic void test2() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);List<User> users = userMapper.selectAll();if(users == null && users.size() == 0){System.out.println("你查询的表无数据");return;}for (User user : users) {System.out.println(user);}session.close();}//根据ID查询相关数据@Testpublic void test3() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User();user.setId(82);User findById = userMapper.selectUser(user);System.out.println(findById);}//查询单条数据@Testpublic void findByIdData() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);User user = userMapper.getUserById(86);System.out.println(user);}//查询单条数据为map集合@Testpublic void test4() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);Map<String, Object> userToMap  = userMapper.getUserToMap(520);System.out.println(userToMap);}//查询前100条数据并将数据转换为Map集合@Testpublic void test5() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);List<Map<String,Object>> userToMapList = userMapper.get100UserToMap();for (Map<String, Object> map : userToMapList) {System.out.println(map);}}//查询前100条数据并将数据转换为Map集合方式2@Testpublic void findData() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);Map<Integer, User> map = userMapper.get100UserToMap2();Set<Integer> integers = map.keySet();for (Integer integer : integers) {System.out.println(map.get(integer));}}//删除单条数据@Testpublic void test6() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);int i = userMapper.deleteUser(82);if(i > 0){System.out.println("success");}else {System.out.println("fail");}}//批量删除数据@Testpublic void test8() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);String i = "5,6,7,8,9";int V = userMapper.deleteUserBatch(i);if(V > 0){System.out.println("success");}else {System.out.println("fail");}}//模糊查询@Testpublic void test7() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User();user.setUsername("K");List<User> users = userMapper.selectUserLike(user);for (User user1 : users) {System.out.println(user1);}}// 动态设置表名查询数据@Testpublic void test9() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);List<User> users = userMapper.selectUserByTableName("user");for (User user : users) {System.out.println(user);}}//更新表中数据@Testpublic void test10() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User();user.setId(58);user.setName("罗小黑");int i = userMapper.updateUser(user);if(i > 0){System.out.println("success");}else {System.out.println("fail");}}//  association一对一联查@Testpublic void test11() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession(true);UserMapper userMapper = session.getMapper(UserMapper.class);User user = userMapper.getUserBookById(520);System.out.println(user);}
}

相关文章:

MyBatis系统学习 - 使用Mybatis完成查询单条,多条数据,模糊查询,动态设置表名,获取自增主键

上篇博客我们围绕Mybatis链接数据库进行了相关概述&#xff0c;并对Mybatis的配置文件进行详细的描述&#xff0c;本篇博客也是建立在上篇博客之上进行的&#xff0c;在上面博客搭建的框架基础上&#xff0c;我们对MyBatis实现简单的增删改查操作进行重点概述&#xff0c;在MyB…...

Generative Action Description Prompts for Skeleton-based Action Recognition

标题&#xff1a;基于骨架的动作识别的生成动作描述提示 源文链接&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…...

动手学深度学习(Pytorch版)代码实践 -深度学习基础-02线性回归基础版

02线性回归基础版 主要内容 数据生成&#xff1a;使用线性模型 ( y X*w b ) 加上噪声生成人造数据集。数据读取&#xff1a;通过小批量读取数据集来实现批量梯度下降&#xff0c;打乱数据顺序并逐批返回特征和标签。模型参数初始化&#xff1a;随机初始化权重和偏置&#x…...

信息学奥赛初赛天天练-15-阅读程序-深入解析二进制原码、反码、补码,位运算技巧,以及lowbit的神奇应用

更多资源请关注纽扣编程微信公众号 1 2021 CSP-J 阅读程序1 阅读程序&#xff08;程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填 √&#xff0c;错误填&#xff1b;除特 殊说明外&#xff0c;判断题 1.5 分&#xff0c;选择题 3 分&#xff09; 源码 #in…...

期权具体怎么交易详细的操作流程?

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易&#xff0c;期权具体交易流程可以理解选择方向多和空&#xff0c;选开仓的合约&#xff0c;买入开仓和平仓没了&#xff0…...

系统架构设计师【第3章】: 信息系统基础知识 (核心总结)

文章目录 3.1 信息系统概述3.1.1 信息系统的定义3.1.2 信息系统的发展3.1.3 信息系统的分类3.1.4 信息系统的生命周期3.1.5 信息系统建设原则3.1.6 信息系统开发方法 3.2 业务处理系统&#xff08;TPS&#xff09;3.2.1 业务处理系统的概念3.2.2 业务处理系统的功能 …...

Linux 驱动设备匹配过程

一、Linux 驱动-总线-设备模型 1、驱动分层 Linux内核需要兼容多个平台&#xff0c;不同平台的寄存器设计不同导致操作方法不同&#xff0c;故内核提出分层思想&#xff0c;抽象出与硬件无关的软件层作为核心层来管理下层驱动&#xff0c;各厂商根据自己的硬件编写驱动…...

游戏子弹类python设计与实现详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、子弹类设计思路 1. 属性定义 2. 方法设计 三、子弹类实现详解 1. 定义子弹…...

Python基础学习笔记(六)——列表

目录 一、一维列表的介绍和创建二、序列的基本操作1. 索引的查询与返回2. 切片3. 序列加 三、元素的增删改1. 添加元素2. 删除元素3. 更改元素 四、排序五、列表生成式 一、一维列表的介绍和创建 列表&#xff08;list&#xff09;&#xff0c;也称数组&#xff0c;是一种有序、…...

帝国CMS跳过选择会员类型直接注册方法

国CMS因允许多用户组注册&#xff0c;所以在注册页面会有一个选择注册用户组的界面&#xff0c;即使网站只用了一个用户组也会出现。 如果想去掉这个页面&#xff0c;直接进入注册页面&#xff0c;那么可按以下办法修改 打开 e/class/user.php 文件 查找&#xff1a; $chan…...

【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…...

黑马es数据同步mq解决方案

方式一:同步调用 优点:实现简单&#xff0c;粗暴 缺点:业务耦合度高 方式二:异步通知 优点:低耦含&#xff0c;实现难度一般 缺点:依赖mq的可靠性 方式三:监听binlog 优点:完全解除服务间耦合 缺点:开启binlog增加数据库负担、实现复杂度高 利用MQ实现mysql与elastics…...

通过LLM多轮对话生成单元测试用例

通过LLM多轮对话生成单元测试用例 代码 在采用 随机生成pytorch算子测试序列且保证算子参数合法 这种方法之前,曾通过本文的方法生成算子组合测试用例。目前所测LLM生成的代码均会出现BUG,且多次交互后仍不能解决.也许随着LLM的更新,这个问题会得到解决.记录备用。 代码 impo…...

[Redis]String类型

基本命令 set命令 将 string 类型的 value 设置到 key 中。如果 key 之前存在&#xff0c;则覆盖&#xff0c;无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。 set key value [expiration EX seconds|PX milliseconds] [NX|XX] 选项[EX|PX] EX seconds⸺使用…...

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…...

Android9.0 MTK平台如何增加一个系统应用

在安卓定制化开发过程中&#xff0c;难免遇到要把自己的app预置到系统中&#xff0c;作为系统应用使用&#xff0c;其实方法有很多&#xff0c;过程很简单&#xff0c;今天分享一下我是怎么做的&#xff0c;共总分两步&#xff1a; 第一步&#xff1a;要找到当前系统应用apk存…...

LabVIEW中实现Trio控制器的以太网通讯

在LabVIEW中实现与Trio控制器的以太网通讯&#xff0c;可以通过使用TCP/IP协议来完成。这种方法包括配置Trio控制器的网络设置、使用LabVIEW中的TCP/IP函数库进行数据传输和接收&#xff0c;以及处理通讯中的错误和数据解析。本文将详细说明实现步骤&#xff0c;包括配置、编程…...

C/C++运行时库与 UCRT 通用运行时库:全面总结与问题实例剖析

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI 1. 概述 在开发C/C应用程序时&#xff0c;运行时库&#xff08;Runtime Library&#xff09;是不可或缺的一部分。它们提供了一系列函数和功能&#xff0c;使得开发者能够更方便地进行编…...

【Python001】python批量下载、插入与读取Oracle中图片数据(已更新)

1.熟悉、梳理、总结数据分析实战中的python、oracle研发知识体系 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景说明2.环境搭建2.1 参考链接2.2 `oracle`查询测试代码3.数据请求与插入3.1 `Oracle`建表语句3.2 `Python`代码实现3.3 效果示例4.问题链…...

流形学习(Manifold Learning)

基本概念 Manifold Learning&#xff08;流形学习&#xff09;是一种机器学习和数据分析的方法&#xff0c;它专注于从高维数据中发现低维的非线性结构。流形学习的基本假设是&#xff0c;尽管数据可能在高维空间中呈现&#xff0c;但它们实际上分布在一个低维的流形上。这个流…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】

1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...