Mybatis进阶——动态SQL(1)

news2024/11/16 0:01:21

目录

一、 <if> 标签

二、<trim> 标签

三、<where> 标签

四、<set> 标签

五、<foreach> 标签

六、<include> 标签


        动态SQL 是Mybatis的强大特性之一,能够完成不同条件下的不同SQL拼接,可以参考官方文档:动态 SQL_MyBatis中文网

准备工作:

        SQL语句:

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
 
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
 
-- 使用数据数据
USE mybatis_test;
 
-- 创建表[用户表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
        `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
        `username` VARCHAR ( 127 ) NOT NULL,
        `password` VARCHAR ( 127 ) NOT NULL,
        `age` TINYINT ( 4 ) NOT NULL,
        `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-女 0-默认',
        `phone` VARCHAR ( 15 ) DEFAULT NULL,
        `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
        `create_time` DATETIME DEFAULT now(),
        `update_time` DATETIME DEFAULT now(),
        PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; 
 
-- 添加用户信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

        yml配置内容:

# 数据库配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: 1234
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  # 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mybatis/**Mapper.xml
  configuration: # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰自动转换

        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">
<mapper namespace="com.example.mybatisdemo4.model.UserInfo">

</mapper>

        model代码如下:

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

一、<if> 标签

        在注册用户的时候,可能会有这样一个问题,如下图所示:

        注册分为两种字段:必填字段和非必填字段,那如果在添加用户的时候有不确定的字段传入,程序应该如何实现呢?

        这个时候就需要使用 动态标签 来判断了,比如添加的时候性别 gender 为非必填字段,具体实现如下:

        userInfoMapper接口代码:

@Mapper
public interface UserInfoMapper {
    Integer insertByCondtion(UserInfo userInfo);
}

        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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <insert id="insertByCondtion">
        insert into userinfo (username, password, age
        <if test="gender != null">
            , gender
        </if>) 
        values (#{username},#{password}, #{age}
        <if test="gender != null">
            , #{gender}
        </if>)
    </insert>

</mapper>

        测试类代码:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void insertByCondtion() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setAge(15);
//        userInfo.setGender(1);
        userInfoMapper.insertByCondtion(userInfo);
    }
}

        表中gender属性默认是0,如图:

        当我们不指定gender值时,直接执行上面代码,结果如下:

        当指定gender的值时,代码如下:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void insertByCondtion() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setAge(15);
        userInfo.setGender(1);
        userInfoMapper.insertByCondtion(userInfo);
    }
}

        执行测试类代码,结果如下:

        此时就是动态SQL语句了,想给他传值就变成所传的值,不想给他传值会有默认值0。也就变成复杂SQL了,之前博客写的那些都是简单标签,如果没有<if> 标签,单凭借之前的那些简单SQL,是不能做到上面这样的功能的。

        上面的SQL语句也可以写成注解的形式,但是不推荐,其代码如下:

@Mapper
public interface UserInfoMapper {
    @Insert("<script>" +
            "insert into userinfo (username, password, age" +
            "<if test='gender != null'>, gender</if>)" +
            "values (#{username},#{password}, #{age}" +
            "<if test='gender != null'>, #{gender}</if>)"+
            "</script>")
    Integer insertByCondtion2(UserInfo userInfo);
}

(可以看出,使用注解的方式,不好写,也不好观察,可读性非常差)

        测试代码如下:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void insertByCondtion2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu222");
        userInfo.setPassword("zhaoliu222");
        userInfo.setAge(25);
        userInfo.setGender(2);
        userInfoMapper.insertByCondtion(userInfo);
    }
}

        运行测试代码,结果如下:


二、<trim> 标签

        之前的插入用户功能,只是一个gender字段可能是选填项,如果有多个字段,一般考虑使用结合标签,对多个字段都采取动态生成的方式。

        标签中有如下属性:

prefix表示整个语句块,以 prefix 的值作为前缀

suffix表示整个语句块,以 suffix 的值作为后缀

prefixOverrides表示整个语句块要去除掉的前缀

suffixOverrides表示整个语句块要去除掉的后缀

         把username设置默认为admin,代码如下:

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
 
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
 
-- 使用数据数据
USE mybatis_test;
 
-- 创建表[用户表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
        `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
        `username` VARCHAR ( 127 ) NOT NULL DEFAULT 'admin' COMMENT '默认admin',
        `password` VARCHAR ( 127 ) NOT NULL,
        `age` TINYINT ( 4 ) NOT NULL,
        `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-女 0-默认',
        `phone` VARCHAR ( 15 ) DEFAULT NULL,
        `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
        `create_time` DATETIME DEFAULT now(),
        `update_time` DATETIME DEFAULT now(),
        PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; 
 
-- 添加用户信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

        现在Mapper.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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <insert id="insertByCondtion">
        insert into userinfo (
            <if test="username != null">username</if>
            <if test="password != null">, password</if>
            <if test="age != null">, age</if>
            <if test="gender != null">, gender</if>)
        values (
            <if test="username != null">#{username}</if>
            <if test="password != null">,#{password}</if>
            <if test="age != null">, #{age}</if>
            <if test="gender != null">, #{gender}</if>)
    </insert>

</mapper>

        把setUsername的方法注释掉,测试类代码如下:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void insertByCondtion() {
        UserInfo userInfo = new UserInfo();
//        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setAge(15);
        userInfo.setGender(1);
        userInfoMapper.insertByCondtion(userInfo);
    }
}

        运行测试类代码,结果如下:

        这时候使用 <trim>标签,代码如下:

<?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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <insert id="insertByCondtion">
        insert into userinfo
            <trim prefix="(" suffix=")" prefixOverrides=",">
                <if test="username != null">username</if>
                <if test="password != null">, password</if>
                <if test="age != null">, age</if>
                <if test="gender != null">, gender</if>
            </trim>
            values
            <trim prefix="(" suffix=")" prefixOverrides=",">
                <if test="username != null">#{username}</if>
                <if test="password != null">,#{password}</if>
                <if test="age != null">, #{age}</if>
                <if test="gender != null">, #{gender}</if>
            </trim>
    </insert>

</mapper>

      这时候再执行测试类代码:

class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void insertByCondtion() {
        UserInfo userInfo = new UserInfo();
//        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setAge(15);
        userInfo.setGender(1);
        userInfoMapper.insertByCondtion(userInfo);
    }
}

        结果如下:

        成功插入数据了。

        还有一种使用注解的方式,代码会很乱,很复杂,不建议使用,其代码如下:

@Insert("<script>" +
"INSERT INTO userinfo " +
"<trim prefix='(' suffix=')' prefixOverrides=','>" +
"<if test='username!=null'>,username</if>" +
"<if test='password!=null'>,password</if>" +
"<if test='age!=null'>,age</if>" +
"<if test='gender!=null'>,gender</if>" +
"</trim>" +
"VALUES " +
"<trim prefix='(' suffix=')' prefixOverrides=','>" +
"<if test='username!=null'>,#{username}</if>" +
"<if test='password!=null'>,#{password}</if>" +
"<if test='age!=null'>,#{age}</if>" +
"<if test='gender!=null'>,#{gender}</if>" +
"</trim>"+
"</script>")
Integer insertByCondtion(UserInfo userInfo);

        上面SQL解析:

1基于 prefix 配置,开始部分加上 ( 

2基于 suffix 配置,结束部分加上 )

3多个组织的语句都以 " , " 开头,拼接好的字符串还会以 " , " 开头,会基于 suffixOverrides 配置去掉开头的一个 " , " (prefixOverrides则相反,是结尾)

4注意 < if test="username != null"> 中的 username 是传入对象的属性


三、<where> 标签

        如图:通过下面的筛选条件,系统会根据我们的筛选条件,动态组装 where 条件。

        数据库表的信息如下:

        UserInfoMapper接口代码:

@Mapper
public interface UserInfoMapper {
    List<UserInfo> queryUserByCondition(UserInfo userInfo);
}

        下面不使用<where>和<trim>标签,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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <select id="queryUserByCondition" resultType="com.example.mybatisdemo4.model.UserInfo">
        select * from userinfo where
        <if test="age != null">age = #{age}</if>
        <if test="gender != null">and gender = #{gender}</if>
        <if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if>
    </select>

</mapper>

        测试类代码:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void queryUserByCondition() {
        UserInfo userInfo = new UserInfo();
//        userInfo.setAge(15);
        userInfo.setGender(1);
        userInfo.setDeleteFlag(0);
        System.out.println(userInfoMapper.queryUserByCondition(userInfo));
    }
}

        如果把设置age给注释掉,是可以成功运行的,但注释掉后,就会报错,报错信息如下:

        SQL错误。

        现在给XML内容加上<trim>标签,内容如下:

<?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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">
    <select id="queryUserByCondition" resultType="com.example.mybatisdemo4.model.UserInfo">

        select * from userinfo
        <trim prefix="where" prefixOverrides="and">
            <if test="age != null">age = #{age}</if>
            <if test="gender != null">and gender = #{gender}</if>
            <if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if>
        </trim>
    </select>

</mapper>

        再次运行测试代码,不会报错了,运行结果如下:

        上面这样写有点不专业,Mybatis提供了<where>标签,所以可以不使用<trim>标签,使用<where>标签的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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <select id="queryUserByCondition" resultType="com.example.mybatisdemo4.model.UserInfo">
        select * from userinfo
        <where>
            <if test="age != null">and age = #{age}</if>
            <if test="gender != null">and gender = #{gender}</if>
            <if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if>
        </where>
    </select>

</mapper>

        可以看到,<where>标签代替了<trim>标签的prefix和prefixOverrides,运行刚才的测试类代码,运行结果如下:

注意<where> 只会在子元素有内容的情况下才插入where子句,而且会自动去除子句开头(或结尾)的and或or上面标签虽然可以使用<trim prefix="where" prefixOverrides="and">替换,但是此种情况下,当子元素都没有内容时,where 关键字也会保留


四、<set> 标签

        SQL语句:

update userinfo set username = ?, age = ?, delete_flag = ? where id = ?

        UserInfoMapper接口代码:

@Mapper
public interface UserInfoMapper {
    Integer updateUserByCondition(UserInfo userInfo);
}

        xml内容如下:(使用<trim>标签)

<?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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <update id="updateUserByCondition">
        update userinfo
        <trim prefix="set" prefixOverrides=",">
            <if test="username != null">username = #{username}</if>
            <if test="age != null">,age = #{age}</if>
            <if test="deleteFlag != null">,delete_flag = #{deleteFlag}</if>
        </trim>
        where id = #{id}
    </update>

</mapper>

        测试类代码:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void updateUserByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(6);
        userInfo.setUsername("wangba");
        userInfo.setAge(8);
        userInfo.setDeleteFlag(0);
        userInfoMapper.updateUserByCondition(userInfo)
    }
}

        SQL表如下:

        运行测试类,结果如下:

        上面使用<trim>标签不太专业,针对update(改)可以使用<set>标签

        改变xml内容:(使用<set>标签)

<?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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <update id="updateUserByCondition">
        update userinfo
        <set>
            <if test="username != null">username = #{username}</if>
            <if test="age != null">,age = #{age}</if>
            <if test="deleteFlag != null">,delete_flag = #{deleteFlag}</if>
        </set>
        where id = #{id}
    </update>

</mapper>

 (其中where关键字可以使用<where>标签,但是因为where后的id是肯定必须要有的,可以直接写上)

      测试类代码如下:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void updateUserByCondition() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(5);
//        userInfo.setUsername("wangba");
        userInfo.setAge(8);
        userInfo.setDeleteFlag(1);
        userInfoMapper.updateUserByCondition(userInfo);
    }
}

        运行测试类代码,结果如下:

        可以看到,<set>标签代替了<trim prefix="set" prefixOverrides=",">说明动态SQL语句中插入set关键字,并且会删掉额外的逗号。(用于update语句中


五、<foreach> 标签

        对集合进行遍历时可以使用该标签。标签有如下属性:

1collection绑定方法参数中的集合,如 List、Set、Map或数组对象

2item遍历时的每一个对象

3open语句块开头的字符串

4close语句块结束的字符串

5separator每次遍历之间间隔的字符串

        原本SQL语句:

delete from userinfo where id in (1, 2, 3, 4)

        数据库表信息如下:

        UserInfoMapper接口代码如下:

@Mapper
public interface UserInfoMapper {
    Integer batchDelete(List<Integer> ids);
}

        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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <delete id="batchDelete">
        delete from userinfo 
        where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>

</mapper>

        测试代码如下:

@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void batchDelete() {
        List<Integer> ids = Arrays.asList(new Integer[]{1, 2, 3, 4});
        userInfoMapper.batchDelete(ids);
    }
}

        运行测试类代码,结果如下:数据只剩下两个了

        不仅可以批量删除,也可以批量插入。写法相似,类比上面代码。


六、<include> 标签

        在xml映射文件中配置的SQL,有时候可能会存在很多重复的片段,此时就会存在很多冗余的代码。现在的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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <select id="queryAllUser" resultType="com.example.mybatisdemo4.model.UserInfo">
        select id, username, age, gender, phone, delete_falg, create_time, update_time  from userinfo
    </select>

    <select id="queryById" resultType="com.example.mybatisdemo4.model.UserInfo">
        select id, username, age, gender, phone, delete_falg, create_time, update_time from userinfo where id=#{id}
    </select>
    
</mapper>

        有很多冗余的代码,如图:

        我们可以对重复的片段进行抽取,将其通过<sql>标签封装到一个SQL片段,然后再通过<include>标签进行引用

<sql>定义可重用的SQL片段

<include>通过属性refid,指定包含的SQL片段

        现在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">
<mapper namespace="com.example.mybatisdemo4.mapper.UserInfoMapper">

    <sql id="allColumn">
        id, username, age, gender, phone, delete_falg, create_time, update_time
    </sql>

    <select id="queryAllUser" resultType="com.example.mybatisdemo4.model.UserInfo">
        select <include refid="allColumn"></include>  from userinfo
    </select>

    <select id="queryById" resultType="com.example.mybatisdemo4.model.UserInfo">
        select <include refid="allColumn"></include> from userinfo where id=#{id}
    </select>
    
</mapper>

        通过<include>标签,去除掉了重复出现的代码。

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

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

相关文章

端到端目标检测 |从DETR 到 GroundingDINO

文章目录 一&#xff0c;DETR1. 简介2. 亮点3. 细节4. 总结一下 二&#xff0c;GroundingDINOGrounding DINO的整体流程Grounding DINO的目标函数 一&#xff0c;DETR 之前的目标检测框架&#xff0c;需要很多的人工干预&#xff0c;很多的先验知识&#xff0c;而且可能还需要…

AppInventor2 表格布局的外面的黑框怎么去掉?

问&#xff1a;表格布局的外面的黑框怎么去掉啊&#xff1f; 答&#xff1a;这个黑框是界面设计的布局位置示意&#xff0c;实际 App 测试时并没有框。 来源&#xff1a;AppInventor2 表格布局的外面的黑框怎么去掉&#xff1f; - App应用开发 - 清泛IT社区&#xff0c;为创新…

SQL查询电商数据案例

包括&#xff0c;Python连接数据库到模拟电商数据库&#xff0c;到sql场景查询 1,Python连接SQL数据库 以下是使用Python连接MySQL数据库并进行操作的示例代码&#xff1a; import random import time import pymysql# 定义名字数据 xing ["王", "李",…

uni-app学习完结

昨天空余一天&#xff0c;并未写记录&#xff0c;是昨天属于项目完结&#xff0c;这里把最后的打包上线等这里说下。 打包成微信小程序 打包成微信小程序&#xff0c;这需要再微信公众平台里面&#xff0c;进行登陆和设置。这里说下&#xff0c;注册的后&#xff0c;选择需要…

文心智能体平台丨创建你的四六级学习小助手

引言 在人工智能飞速发展的今天&#xff0c;我们迎来了文心智能体平台。该平台集成了最先进的人工智能技术&#xff0c;旨在为用户提供个性化、高效的学习辅助服务。今天&#xff0c;我们将向大家介绍如何利用文心智能体平台&#xff0c;创建一个专属于你的四六级学习小助手。…

zabbix客户端启用ping脚本 , 采集结果返回服务端

1.Zabbix-agent配置 (1) 查看自定义配置的目录位置 # more /etc/zabbix/zabbix_agentd.conf (2) 将配置的脚本放在指定的目录下 # cd /etc/zabbix/zabbix_agentd.d # vi get_ping.conf UserParameter=get_ping[*], /bin/ping -c 1 -W 1 $1 &> /dev/null &a…

未在计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序和未在本地计算机上注册“microsoft.ACE.OLEDB.12.0”提供程序

程序运行出现下图的错误&#xff0c; 或者下图的错误&#xff0c; 首先看一下是不是运行的程序的位数&#xff08;32/64&#xff09;不对&#xff1b; 查看系统位数的方法如下图&#xff1b;下图显示是64位操作系统&#xff1b; 如果运行的程序的位数没有问题&#xff1b; 则需…

MySQL-innodb后台线程

文章目录 一、结构图二、后台线程①Master Thread②IO Thread③Purge Thread④Page Cleaner Thread 拓展知识 一、结构图 二、后台线程 InnoDB是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务 后台线程有&#xff1a; ①Master Thr…

BevDet(1): 算法原理介绍介绍

BevDet是一个LSS-Based的实时高性能的多相机3D检测模型,它用4阶段的范式去做3D目标检测,设计上同时支持Segmentation。何谓4阶段范式: 1.图像域的特征提取(Image -view Encoder)2.视角转换 (View Transformer)3.Bev空间特征提取(BEV Encoder)4.任务头Head它涉及 Image View …

【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装

livekit-agent 依赖于livekit、livekit-api、livekit-protocol 其中livekit就是livekkit-rtc: 包含俩sdk 实时互动sdkReal-time SDK for connecting to LiveKit as a participant livekit-api : 服务端sdk https://pypi.org/project/livekit-api/ livekit的python sdk

Plesk面板上网站无法访问如何查看日志

近期我的网站出现无法访问的问题&#xff0c;这边想要查询为什么出现无法访问的原因&#xff0c;但不知道如何在主机上面进行检查&#xff0c;由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板&#xff0c;因此联系Hostease的咨询了Hostease技术支持&a…

嵌入式不一定只能用C!

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章&#xff1a; 这里是引用 ------------…

算法与数据结构高手养成:朴素的贪心法(上)最优化策略

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Linux离线一键安装Docker及docker-compose环境

背景&#xff1a; 在当前软件部署运维环境中由于Docker容器化优势越来越明显&#xff0c;因些被许多公司运维所采用&#xff0c;那首先如何快速安装Docker及docker-compose基础环境就第一时间被人们关注&#xff0c;本人同样在经过多次手工逐条用命令安装的过程&#xff0c;整理…

继承--5.29

继承格式&#xff1a; package javatest2;public class people {int age;double workday;public people(int age, double workday) {this.age age;this.workday workday;} }package javatest2;public class student extends people {int studyday;public student(int age, d…

使用目标检测模型YOLO V9 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

我看到YOLO V8中&#xff08;ultralytics版本8.2.18&#xff09;集成了YOLO V9&#xff0c;所以直接在YOLO V8 OBB的基础上实现YOLO V9 OBB&#xff0c;训练结果也出来了&#xff0c;但是评估指标比YOLO V8 OBB低一点点&#xff0c;不知道是不是哪里遗漏修改了......如有大神赐…

开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述

1. 文档管理系统是什么 文档管理系统&#xff08;DMS&#xff1a;Document Management System&#xff09;是一种软件系统&#xff0c;用于组织、存储、检索和管理电子文档和文件。这些文件可以是各种格式的电子文档&#xff0c;如文本文档、电子表格、图像、音频或视频文件等…

easy-rule规则引擎使用

简介 轻量级的规则引擎&#xff0c;易于学习的api 简单来说&#xff0c;规则引擎就是一个函数&#xff1a;yf(x1,x2,…,xn) 将业务代码和业务规则分离&#xff0c;解耦业务决策和业务代码的绑定关系 入门示例 依赖引入 <dependency><groupId>org.jeasy</grou…

3dmax渲染经常卡主?关掉光追即可流畅渲染

3ds Max是一款广泛应用于三维建模、动画和渲染的软件&#xff0c;它在影视、游戏、建筑可视化等领域具有重要地位。在3ds Max中&#xff0c;渲染技术的选择和应用直接影响到最终图像的质量和渲染效率。 但在实际使用过程中&#xff0c;由于3dsMax中有太多选项&#xff0c;很多…

一文看懂!电磁仿真软件CST Studio Suite的技术发展历程

CST工作套件室是一款功能强大、专业级别的软件包&#xff0c;用于进行微波无源器件和天线的仿真分析和设计。它支持的应用领域包括耦合器、滤波器、环流器、隔离器、谐振腔、平面结构、连接器、电磁兼容、集成电路封装以及各种类型的天线和天线阵列。该软件可以提供必要的S参数…