Mybatis配置文件的增删改查功能

news2024/11/15 15:15:27

Mybatis配置文件的增删改查功能

查询—条件查询

在这里插入图片描述

//resources里面的org.example.mapper中的BrandMapper.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:命名空间,对sql语句进行隔离,方便管理
-->
<mapper namespace="org.example.mapper.BrandMapper">
<!--    数据库表的字段名称 和实体类得到属性名称 不一样,则不能自动封装数据
* 起别名:对不一样的;列名起别名,让别名和实体类的属性名一样
缺点:每次查询都要定义一次别名
*:sql片段 缺点:不灵活
*resultMapper:
-->



    <resultMap id="brandResult" type="org.example.pojo.Brand">
        <id column="id" property="id"/>
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
        <result column="ordered" property="ordered"/>
        <result column="description" property="description"/>
        <result column="status" property="status"/>
    </resultMap>

    <select id="selectAll" resultMap="brandResult">
        select * from tb_brand
    </select>

<!--*参数占位符:
1.#{}:会将其替换为?,为了防止SQL注入
2.${}:拼sql。会存在SQL注入问题
3.使用时机:*参数传递的时候:#{}
*表名或者列名不固定的情况下:${}会存在Sql注入问题
*参数类型:paramType:指定参数类型,可以不写,默认为null,会自动识别类型      *-->
    <select id="selectById" resultMap="brandResult">
        select * from tb_brand where id = #{id}
    </select>
    
<!--条件查询-->
<!--    <select id="selectByCondition" parameterType="org.example.pojo.Brand" resultMap="brandResult">-->
<!--        select * from tb_brand-->
<!--        where status = #{status}-->
<!--        and company_name like #{companyName}-->
<!--        and brand_name like #{brandName}-->
<!--    </select>-->


<!--    动态条件查询
*if:条件判断
*test:逻辑表达式
问题:
*恒等式
*<where>替换where关键字-->
    <select id="selectByCondition" parameterType="map" resultMap="brandResult">
select * from tb_brand
where 1=1
    <if test="status!=null">
      and  status = #{status}
    </if>
<if test="companyName!=null and companyName!=''">
    and company_name like #{companyName}
</if>
<if test="brandName!=null and brandName!=''">
    and brand_name like #{brandName}
</if>
    </select>

<!--   choose相当于switch when相当于case  -->
<!--    <select id="selectByConditionSingle" resultMap="brandResult" >-->
<!--        select * from tb_brand-->
<!--   where-->
<!--       <choose>-->
<!--       <when test="status!=null">-->
<!--           status = #{status}-->
<!--       </when>-->
<!--       <when test="companyName!=null and companyName!=''">-->
<!--           company_name like #{companyName}-->
<!--       </when>-->
<!--       <when test="brandName!=null and brandName!=''">-->
<!--           brand_name like #{brandName}-->
<!--       </when>-->
<!--        <otherwise>-->
<!--            1=1-->
<!--        </otherwise>-->
<!--   </choose>-->
<!--    </select>-->

    <select id="selectByConditionSingle" resultMap="brandResult" >
        select * from tb_brand
        <where>
            <choose>
                <when test="status!=null">
                    status = #{status}
                </when>
                <when test="companyName!=null and companyName!=''">
                    company_name like #{companyName}
                </when>
                <when test="brandName!=null and brandName!=''">
                    brand_name like #{brandName}
                </when>

            </choose>

        </where>
    </select>

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand(brand_name,company_name,ordered,description,status)
        values(#{brandName},#{companyName},#{ordered},#{description},#{status})
    </insert>

    <update id="update">
        update tb_brand
      <set>
           <if test="status!=null">
               status = #{status},
           </if>
               <if test="ordered!=null">
               ordered = #{ordered},
           </if>

               <if test="description!=null">
               description = #{description},
           </if>
               <if test="brandName!=null">
                   brand_name = #{brandName},
               </if>
                   <if test="companyName!=null">
                   company_name = #{companyName},
               </if>
             </set>
       where id = #{id}
    </update>

    <delete id="deleteById">
        delete from tb_brand where id = #{id}
    </delete>
<!--  mybatis会将数组参数,封装为一个Map集合,以键值对形式存在,键为:array-->
    <delete id="deleteByIds">
        delete from tb_brand where id
        in(<foreach collection="ids" item="id" >
        #{id}
    </foreach>)

    </delete>

</mapper>
        
//resoures中的文件的mybatis-config.xml文件
 <?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                数据库的连接信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?serverTimezone=UTC"/>

                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载sql映射文件-->
        <mapper resource="org/example/mapper/BrandMapper.xml"/>
<!--        <package name="org.example.mapper"/>-->
    </mappers>
</configuration>
        
        
//src/main/java/org/example/mapper中的BrandMapper接口

public interface BrandMapper {

/**
 * 查询所有品牌
 */
public List<Brand> selectAll();
/**
 * 查看详情:根据id查询
 */
public Brand selectById(int id);

/**
 * 条件查询
 * *参数接受:
 *          1.散装参数: 如果方法中有多个参数,需要使用@Param
 *          2.对象参数:对象的属性名称要和参数名称一致
 *          3.map参数:参数使用map.get(key)获取值
 * @param status
 * @param companyName
 * @param brandName
 * @return
 */
//List<Brand> selectByCondition(
//        @Param("status")int status,
//                              @Param("companyName")String companyName,
//                                            @Param("brandName")String brandName);

//public List<Brand> selectByCondition(Brand brand);


List<Brand> selectByCondition(Map map);

    /**
     *单条件查询
     * @param brand
     * @return
     */
    List<Brand> selectByConditionSingle(Brand brand);

    /**
     * 添加
     */
    void add(Brand brand);

    /**
     * 修改
     */
    int update(Brand brand);
    /**
     * 删除
     */
    void deleteById(int id);

    /**
     * 批量删除
     * @param ids
     */
    void deleteByIds(@Param("ids") int[] ids);
}



//测试文件代码块
public class MyBatisTest {

    @Test
    public void testSelectAll() throws IOException {
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        System.out.println(mapper.selectAll());
        //5.释放资源
        sqlSession.close();
    }
    
    @Test
    public void testSelectById() throws IOException {
        int id = 1;
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        System.out.println(mapper.selectById(id));
        //5.释放资源
        sqlSession.close();
    }

    @Test
    public void testSelectByCondition() throws IOException {
        int status = 1;
        String companyName = "小米科技有限公司";
        String brandName = "小米";
        // 处理数据
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";
        // 封装对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);

        // map封装
        Map map = new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
       // List<Brand> brands = mapper.selectByCondition(status, companyName, brandName);
//        List<Brand> brands = mapper.selectByCondition(brand);
         List<Brand> brands = mapper.selectByCondition(map);
        System.out.println(brands);

        //5.释放资源
        sqlSession.close();
    }


    @Test
    public void testSelectByConditionSingle() throws IOException {
        int status =0 ;
        String companyName = "小米科技有限公司";
        String brandName = "小米";
        // 处理数据
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";
//         封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        // List<Brand> brands = mapper.selectByCondition(status, companyName, brandName);
//        List<Brand> brands = mapper.selectByCondition(brand);
    List<Brand> brands = mapper.selectByConditionSingle(brand);
    System.out.println(brands);

        //5.释放资源
        sqlSession.close();
    }

    @Test
    public void testAdd() throws IOException {
        int status =1 ;
        String companyName = "波导手机";
        String brandName = "波导";
        String description = "手机中的战斗机";
        int ordered = 100;
//         封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setBrandName(brandName);
        brand.setDescription(description);
        brand.setOrdered(ordered);
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        mapper.add(brand);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

    @Test
    public void testUpdate() throws IOException {
        int status =1 ;
        String companyName = "波导手机";
        String brandName = "波导";
        String description = "波导手机,手机中的战斗机";
        int ordered = 200;
        int id = 5;
//         封装对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setCompanyName(companyName);
        brand.setBrandName(brandName);
        brand.setDescription(description);
        brand.setOrdered(ordered);
        brand.setId(id);
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
     int count = mapper.update(brand);
     System.out.println(count);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }
    
    @Test
    public void testDeleteById() throws IOException {
        int id = 5;
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        mapper.deleteById(id);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();
    }

    @Test
    public void testDeleteByIds() throws IOException {
        int [] ids = {5,6};
        // 1.创建SqlSessionFactoryBuilder对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取Mapper接口对象
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //4.执行方法
        mapper.deleteByIds(ids);
        //提交事务
        sqlSession.commit();
        //5.释放资源
        sqlSession.close();

    }

就比如说我们查询当前表格 tb_brand表格中

select * from tb_name 进行条件查询

where

当前状态:启用 status =?

and

企业名称 company_name like ?

and

品牌名称

brand_name like?

1.编写接口方法:Mapper接口
参数:所有查询条件
结果:List<Brand>
2.编写SQL语句:SQL映射文件
3.执行方法,测试

三个不同的接受方式

List<Brand> selectByCondition(@Param("status")int status,@Param("companyName")String companyName,@Param("brandName")String brandName);
List<Brand> selectByCondition(Brand brand)
List<Brand> selectByCondition(Map map);

<select id ="selectByCondition" resultMap="brandResultMap">
select*
from tb_brand
where
status=#{status}
and company_name like #{companyName}
and brand_name like #{brnadName}
</select>

SQL语句设置多个参数有几种方式?

1.散装参数:需要使用@Param(“SQL中的参数占位符名称”)

2.实体类封装参数

只需要保证SQL中的参数名和实体类属性名称对应上,即可设置成功

3.map集合

只需要保证SQL中的参数名和map集合的键名称对应上,即可设置成功

查询-多条件-动态条件查询

SQL语句随着用户的输入或外部条件的变化而变化,我们称为动态SQL

<!--    动态条件查询
*if:条件判断
*test:逻辑表达式
问题:
*恒等式
*<where>替换where关键字-->
    <select id="selectByCondition" parameterType="map" resultMap="brandResult">
select * from tb_brand
where 1=1
    <if test="status!=null">
      and  status = #{status}
    </if>
<if test="companyName!=null and companyName!=''">
    and company_name like #{companyName}
</if>
<if test="brandName!=null and brandName!=''">
    and brand_name like #{brandName}
</if>
    </select>
    
//测试文件
    
查询-单条件-动态条件查询

从多个条件中选择一个

choose(when,otherwise):选择,类似于java中的switch语句

<!--   choose相当于switch when相当于case  -->
<!--    <select id="selectByConditionSingle" resultMap="brandResult" >-->
<!--        select * from tb_brand-->
<!--   where-->
<!--       <choose>-->
<!--       <when test="status!=null">-->
<!--           status = #{status}-->
<!--       </when>-->
<!--       <when test="companyName!=null and companyName!=''">-->
<!--           company_name like #{companyName}-->
<!--       </when>-->
<!--       <when test="brandName!=null and brandName!=''">-->
<!--           brand_name like #{brandName}-->
<!--       </when>-->
<!--        <otherwise>-->
<!--            1=1-->
<!--        </otherwise>-->
<!--   </choose>-->
<!--    </select>-->

    <select id="selectByConditionSingle" resultMap="brandResult" >
        select * from tb_brand
        <where>
            <choose>
                <when test="status!=null">
                    status = #{status}
                </when>
                <when test="companyName!=null and companyName!=''">
                    company_name like #{companyName}
                </when>
                <when test="brandName!=null and brandName!=''">
                    brand_name like #{brandName}
                </when>

            </choose>

        </where>
    </select>

添加

1.编写接口方法:Mapper接口 void add(Brand brand)

参数:除了id之外的所有数据

结果:void

编写SQL语句:SQL映射文件

<insert id ="add">
insert into tb_brand(brand_name,company_name,ordered,description,status)
values(#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
3.执行方法,测试
MyBatis事务:
openSession():默认开启事务,进行增删改查操作后需要使用sqlSession.commit();手动提交事务
openSession(true):可以设置为自动提交事务(关闭事务)
添加-主键返回

在数据添加成功后,需要获取插入数据库数据的主键的值

比如:添加订单和订单项

1.添加订单

2.添加订单项,订单项中需要设置所属订单的id

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand(brand_name,company_name,ordered,description,status)
        values(#{brandName},#{companyName},#{ordered},#{description},#{status})
    </insert>

返回添加数据的主键

<insert useGenneratedKeys="true" KeyProperty="id">

修改

修改-修改全部字段

方法顺序还是一样的:

1.编写接口方法:Mapper接口

参数:所有数据

结果:void

编写SQL语句:SQL映射文件

执行方法,测试

void update(Brand brand)

<update id = "update">
update tb_brand
set brand_name = #{brandName}.
company_name = #{companyName}.
ordered=#{ordered},
description=#{description},
status=#{status}
where id = #{id};
</update>
修改-修改动态字段

有些数据我们不需要全部的修改,所以就存在单个修改,为了防止其null值出现,有标签,标签

   <update id="update">
        update tb_brand
      <set>
           <if test="status!=null">
               status = #{status},
           </if>
               <if test="ordered!=null">
               ordered = #{ordered},
           </if>

               <if test="description!=null">
               description = #{description},
           </if>
               <if test="brandName!=null">
                   brand_name = #{brandName},
               </if>
                   <if test="companyName!=null">
                   company_name = #{companyName},
               </if>
             </set>
       where id = #{id}
    </update>

删除

删除一个
    void deleteById(int id);
    <delete id="deleteById">
        delete from tb_brand where id = #{id}
    </delete>
批量删除
void deleteByIds(@Param("ids") int[] ids);

<!--  mybatis会将数组参数,封装为一个Map集合,以键值对形式存在,键为:array-->
    <delete id="deleteByIds">
        delete from tb_brand where id
        in(<foreach collection="ids" item="id" >
        #{id}
    </foreach>)

参数封装

在这里插入图片描述

MyBatis提供了ParamNameResolver类进行参数封装

建议:将来都使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高

注解完成增删改查

使用注解开发会比配置文件开发更加方便

@Select("select*from tb_user where id =#{id}")
public User selectById(int id)

查询:@Select

添加:@Insert

修改:@Update

删除:@Delete

注解完成简单功能

配置文件完成复杂功能

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂与一点的语句,Java注解不仅力不从心,还会让你本来就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些复杂的操作,最好用XML来映射语句

id = #{id}


#### 批量删除

```java
void deleteByIds(@Param("ids") int[] ids);

<!--  mybatis会将数组参数,封装为一个Map集合,以键值对形式存在,键为:array-->
    <delete id="deleteByIds">
        delete from tb_brand where id
        in(<foreach collection="ids" item="id" >
        #{id}
    </foreach>)

参数封装

[外链图片转存中…(img-ieMEGw2e-1731576949906)]

MyBatis提供了ParamNameResolver类进行参数封装

建议:将来都使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高

注解完成增删改查

使用注解开发会比配置文件开发更加方便

@Select("select*from tb_user where id =#{id}")
public User selectById(int id)

查询:@Select

添加:@Insert

修改:@Update

删除:@Delete

注解完成简单功能

配置文件完成复杂功能

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂与一点的语句,Java注解不仅力不从心,还会让你本来就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些复杂的操作,最好用XML来映射语句

选择何种方式类配置影视,以及认为是否因该要统一映射语句定义的形式,完成取决于你和你的团队。换句话说,永远不要拘泥于一种方式。你可以很轻松的基于注解和XML的语句映射方式间自由移植和切换。

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

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

相关文章

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…

如何修改npm包

前言 开发中遇到一个问题&#xff0c;配置 Element Plus 自定义主题时&#xff0c;添加了 ElementPlusResolver({ importStyle: "sass" }) 后&#xff0c;控制台出现报错&#xff0c;这是因为 Dart Sass 2.0 不再支持使用 !global 来声明新变量&#xff0c;虽然当前…

【原创】java+ssm+mysql校园疫情防控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Python模拟键盘输入,解放双手

文章目录 Python模拟键盘输入&#xff0c;解放双手一、引言二、pyautogui库的详细介绍1、安装与配置2、键盘输入函数3、特殊按键和组合键 三、实用示例1、自动填写表单2、自动发送邮件3、自动化数据录入 四、总结 Python模拟键盘输入&#xff0c;解放双手 一、引言 在自动化办…

人工智能时代下对人的价值反思?

一、员工价值物化 在现代企业的运作中&#xff0c;资本管理层之间的权力博弈与资源争夺有时呈现出了激烈的内斗态势。这种冲突不仅仅局限于单一部门内部&#xff0c;而是波及到跨部门乃至不同业务小组间的战略部署与资源配置上。各部门经理们既要竭力确保自身团队的利益最大化…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 &#x1f31f;项目分析&#x1f31f;实现方式&#x1f31f;开发流程 &#x1f31f;项目分析 需求&#xff1a;为Linux环境下提供可便捷使用的虚拟键盘OS环境&#xff1a;Windows 7/11、CentOS 7开发语言&#xff1a;Qt/C IDE&#xff1a;QtCreator 、Qt5.14.2功…

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中

发现了一些恶意软件样本&#xff0c;这些样本据信与朝鲜民主主义人民共和国 (DPRK)&#xff08;又称北朝鲜&#xff09;有关&#xff0c;这些样本使用 Flutter 构建&#xff0c;Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理&#xff0c;以帮助保护…

双十一抢券风波:大学生300元提6000元电动车遭拒,谁该负责?

双十一购物狂欢节&#xff0c;本应是消费者享受优惠、商家提升销量的双赢时刻&#xff0c;但在河南郑州&#xff0c;发生了一起哭笑不得的抢券风波。一名大学生在双十一期间&#xff0c;通过某平台抢到了原价6099元电动车的直降优惠&#xff0c;只需支付300元就能将车骑回家。然…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask&#xff0c;Django&#xff0c;其它 您可以挂载多个 WSGI 应用&#xff0c;正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

【汇编语言】包含多个段的程序(二)—— 将数据、代码、栈放入不同的段

文章目录 前言1. 存在的两个问题2. 解决办法3. 示例代码3.1 程序说明3.1.1 定义多个段的方法3.1.2 对段地址的引用3.1.3 各种段完全是我们的安排 4. 总结结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但…

初识Linux · 共享内存

目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信&#xff0c;本文介绍的是进程通信的另外一种方式&#xff0c;即共享内存。但是这种通信方式的特点是只能本地通信&#xff0c;并且不像管道那样有保护机制&#xff0c;这里是没有的。 我们通…

【竞技宝】CS2-上海majorRMR:美洲区最后门票争夺战

北京时间2024年11月15日&#xff0c;上海major美洲区RMR正在如火如荼的进行之中。昨日一共进行了三场2-1组的比赛以及三场1-2组的比赛&#xff0c;决出三个正赛参赛名额的同时也确定了今日2-2组的参赛队伍&#xff0c;那么昨日的比赛战果如何呢&#xff1f;接下来小宝就为大家带…

实战:深入探讨 MySQL 和 SQL Server 全文索引的使用及其弊端

在数据库中处理大量文本数据时,包含搜索(例如查找包含特定单词的文本)往往是必需的。然而,直接使用 LIKE %text% 的方式在大数据量中进行模糊查询会造成性能瓶颈。为了解决这一问题,MySQL 和 SQL Server 提供了全文索引(Full-Text Indexing)功能,可以显著加速文本数据的…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

人体存在感应器设置时间开启感应人存在开灯,失效

环境&#xff1a; 领普人体存在感应器 问题描述&#xff1a; 人体存在感应器设置时间开启感应人存在开灯,失效&#xff0c;设置下午5点&#xff0c;如果有人在5点前一直在这个区域&#xff0c;这个时候到了5点&#xff0c;就触发不了感应自动打开灯光。 解决方案&#xff1a…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后&#xff0c;app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用&#xff0c;不仅能帮助相关部门快速识别车辆类型&#xff0c;还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型&#xff0c;该模型使用了…

解决因为TortoiseSVN未安装cmmand line client tools组件,导致idea无法使用svn更新、提交代码

一.错误信息 1.更新代码时&#xff1a;SVN: 更新错误 找不到要更新的版本管理目录。 2.提交代码&#xff1a;检测不到任何更新&#xff08;实际上有代码修改&#xff09;。 3.Cannot run program "svn"。 二.原因分析 在电脑上新安装的的客户端TortoiseSVN、ide…

高效稳定!新加坡服务器托管方案助力企业全球化布局

在全球化的商业环境中&#xff0c;企业对于高效、稳定的服务器托管方案的需求日益迫切。作为亚洲的服务器托管中心&#xff0c;新加坡凭借其独特的地理位置、稳定的政治环境、先进的科技设施以及开放的市场政策&#xff0c;为企业提供了理想的服务器托管解决方案&#xff0c;助…