MyBatis系统学习篇 - 分页插件

MyBatis是一个非常流行的Java持久层框架,它简化了数据库操作的代码。分页是数据库查询中常见的需求,MyBatis本身并不直接支持分页功能,但可以通过插件来实现,从而帮助我们在查询数据库的时候更加方便快捷

引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>

在MyBatis-config.xml文件中配置分页插件

MyBatis核心配置文件中,标签的顺序: 重点强调顺序,我被坑过

  1. properties
  2. settings
  3. typeAliases
  4. typeHandlers
  5. objectFactory
  6. objectWrapperFactory
  7. reflectorFactory
  8. plugins
  9. environments
  10. databaseIdProvider
  11. mappers
<plugins>
 <!--设置分页插件-->
 <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>	

仅MyBatis的测试

引入相关依赖

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--  Mybatis 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>

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>
    <!--
         MyBatis核心配置文件中,标签的顺序:
         properties?,settings?,typeAliases?,typeHandlers?,
         objectFactory?,objectWrapperFactory?,reflectorFactory?,
         plugins?,environments?,databaseIdProvider?,mappers?
    -->
    <!--引入properties文件-->
    <properties resource="jdbc.properties" />
    <!--设置类型别名-->
    <typeAliases>
        <!--
            typeAlias:设置某个类型的别名
            属性:
                type:设置需要设置别名的类型
                alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名且不区分大小写
        -->
        <!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>-->
        <!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
        <package name="com.miaow.mybatis.bean"/>
    </typeAliases>

<!--    该死的Mybatis 分页插件还有顺序  导入配置还要按照顺序进行-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        </plugin>
    </plugins>

    <!--
        environments:配置多个连接数据库的环境
        属性:
            default:设置默认使用的环境的id
    -->
    <environments default="development">
        <!--
               environment:配置某个具体的环境
               属性:
                   id:表示连接数据库的环境的唯一标识,不能重复
           -->
        <environment id="development">
            <!--
                transactionManager:设置事务管理方式
                属性:
                    type="JDBC|MANAGED"
                    JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理
                    MANAGED:被管理,例如Spring
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:配置数据源
                属性:
              type:设置数据源的类型
              type="POOLED|UNPOOLED|JNDI"
                 POOLED:表示使用数据库连接池缓存数据库连接
                 UNPOOLED:表示不使用数据库连接池
                 JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <!--设置连接数据库的驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--设置连接数据库的连接地址-->
                <property name="url" value="${jdbc.url}"/>
                <!--设置连接数据库的用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--设置连接数据库的密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <!-- 配置多个数据源 -->
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <!--xml引入配置文件  -->
        <!--<mapper resource="mappers/UserMapper.xml"/>-->
        <!--
          以包为单位引入映射文件
             要求:
             1、mapper接口所在的包要和映射文件所在的包一致
             2、mapper接口要和映射文件的名字一致
        -->
        <package name="com.miaow.mybatis.mapper"/>
    </mappers>
</configuration>

实体类User

package com.miaow.mybatis.bean;

import java.util.List;

/**
 * @author HWZ
 * @date 2024年05月07日 22:58
 * @description
 **/
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;

    private List<Book> books;

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }

//    @Override
//    public String toString() {
//        return "User{" +
//                "id=" + id +
//                ", name='" + name + '\'' +
//                ", username='" + username + '\'' +
//                ", sex='" + sex + '\'' +
//                ", book=" + book +
//                '}';
//    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", book=" + book +
                ", uid=" + uid +
                ", bookName='" + bookName + '\'' +
                ", cool='" + cool + '\'' +
                ", books=" + books +
                '}';
    }
    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);



    User getUserById(int id);

    /**
     * 分步查询,先不考虑
     */

    // User getUserById1(int id);

    /**
     *  多对一 association
     */
    User getUserBookById(int id);


    /**
     * 一对多 collection
     */

    List<User> getDeptByUid(int id);

    /**
     * 动态插入
     */
    int insertUserDynamic(@Param("users") List<User> users);

    /**
     * 根据传入的条件动态查询
     */

    List<User> selectUserByCondition(@Param("user") User user);

    /**
     * trim用于去掉或添加标签中的内容
     */
    List<User> selectUserByConditionTrim(@Param("user") User user);

    /**
     * choose、when、 otherwise相当于if...else if..else
     */
    List<User> selectUserByConditionChoose(@Param("user") User user);


    /**
     *  Mybatis的foreach标签用于循环集合,并生成SQL语句的in子句。
     *  实现批量删除
     */
    int deleteMoreByArray(@Param("ids") int [] ids);
}

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.miaow.mybatis.mapper.UserMapper">

<!--    启用二级缓存 -->
    <cache/>

    <!--
    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>

    <sql id="baseColum">
        id,name,username,sex
    </sql>


    <resultMap id="deptMap" 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>
        <collection property="books" ofType="Book">
            <result property="uid" column="uid"></result>
            <result property="book" column="bookName"></result>
            <result property="cool" column="cool"></result>
        </collection>
    </resultMap>


    <select id="getDeptByUid" resultMap="deptMap">
        select a.*, b.uid as uid, b.book as bookName, b.cool as cool
        from user a
                 left join book b on a.id = b.uid
        where a.id = #{id}
    </select>


    <!--    <resultMap id="userBookMap" type="User">-->
    <!--        &lt;!&ndash;        实际山和我们数据库字段别名差不多&ndash;&gt;-->
    <!--        <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" select="com.miaow.mybatis.mapper.BookMapper.getBooksByUserUId" column="uid"/>-->

    <!--&lt;!&ndash;        分步查询 ,再三考虑觉得还是跳过这种方式, &ndash;&gt;-->
    <!--    </resultMap>-->


    <!--    根据resultMap获取相关数据-->
    <select id="getUserById" resultMap="userMap" parameterType="int" useCache="true">
        select <include refid="baseColum"></include>
        from user
        where id = #{id};
    </select>

    <!--    <select id="getUserById1" resultMap="userBookMap" 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 a
                 left join book b on a.id = b.uid
        where 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>

<!--    foreach 批量删除数据-->
<!--    <delete id="deleteMoreByArray">-->
<!--        delete  from user where-->
<!--            <foreach collection="ids" item="id" separator="or">-->
<!--                id = #{id}-->
<!--            </foreach>-->
<!--    </delete>-->


<!--    批量删除方式2 -->
    <delete id="deleteMoreByArray">
        delete  from user where id in
                          <foreach collection="ids" item="id" separator="," open="(" close=")">
                              #{id}
                          </foreach>
    </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>

    <!--    实现动态插入-->
    <insert id="insertUserDynamic">
        insert into user values
        <foreach collection="users" item="user" separator=",">
            (#{user.id},#{user.username}, #{user.name},#{user.sex})
        </foreach>

    </insert>






    <!--根据条件动态查询-->
    <select id="selectUserByCondition" resultType="com.miaow.mybatis.bean.User">
        select * from user
        <where>
            <if test="user.id != null">
                id = #{user.id}
            </if>
            <if test="user.userName != '' and user.userName != null">
                and username = #{user.username}
            </if>
            <if test="user.name != '' and user.name != null">
                and name = #{user.name}
            </if>
            <if test="user.sex != '' and user.sex != null">
                and sex = #{user.sex}
            </if>
        </where>
    </select>


    <!--    trim
    prefix:在trim标签中的内容的前面添加某些内容
    prefixOverrides:在trim标签中的内容的前面去掉某些内容
    suffix:在trim标签中的内容的后面添加某些内容
    suffixOverrides:在trim标签中的内容的后面去掉某些内容
    -->
    <select id="selectUserByConditionTrim" resultType="com.miaow.mybatis.bean.User">
        select * from user
        <trim prefix="where" suffixOverrides="and">
            <if test="user.id != null">
                id = #{user.id}
            </if>
            <if test="user.userName != '' and user.userName != null">
                and username = #{user.username}
            </if>
            <if test="user.name != '' and user.name != null">
                and name = #{user.name}
            </if>
            <if test="user.sex != '' and user.sex != null">
                and sex = #{user.sex}
            </if>
        </trim>
    </select>


<!--    choose、when、 otherwise相当于if...else if..else-->
    <select id="selectUserByConditionChoose" resultType="com.miaow.mybatis.bean.User">
        select * from user
        <where>
            <choose>
                <when test="user.id != null">
                    id = #{user.id}
                </when>
                <when test="user.userName != '' and user.userName != null">
                    and username = #{user.username}
                </when>
                <when test="user.name != '' and user.name != null">
                    and name = #{user.name}
                </when>
                <when test="user.sex != '' and user.sex != null">
                    and sex = #{user.sex}
                </when>
            </choose>
        </where>
    </select>
</mapper>

测试方法

 @Test
    public void test17() throws IOException {
        InputStream is = Resources.getResourceAsStream("D:\\myProgram\\IDEAProgram\\java-again\\SSM\\src\\main\\resources\\mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        //查询之前,设置分页条件
        //显示第1页10条数据
        Page<Object> page = PageHelper.startPage(1, 10);

        User user = new User();

        List<User> users = userMapper.selectAll();
        if (users == null || users.size() == 0) {
            System.out.println("你查询的表无数据");
            return;
        }
        for (User user1 : users) {
            System.out.println(user1);
        }

        //获取分页
        System.out.println("总条数:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());
        System.out.println("当前页:" + page.getPageNum());
        System.out.println("每页显示条数:" + page.getPageSize());

        session.close();

    }

在这里插入图片描述

  • pageNum:当前页的页码
  • pageSize:每页显示的条数
  • size:当前页显示的真实条数
  • total:总记录数
  • pages:总页数
  • prePage:上一页的页码
  • nextPage:下一页的页码
  • isFirstPage/isLastPage:是否为第一页/最后一页
  • hasPreviousPage/hasNextPage:是否存在上一页/下一页
  • navigatePages:导航分页的页码数
  • navigatepageNums:导航分页的页码,[1,2,3,4,5]

Spring + MyBatis 相对完整的案例

引入依赖

首先,在pom.xml文件中引入MyBatis和分页插件的依赖。

<dependency>
    <groupId>org.mybatis.spring</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>

配置MyBatis分页插件

在在Spring的配置文件中(如applicationContext.xml),配置分页插件。

<bean id="pageHelper" class="com.github.pagehelper.PageInterceptor">
    <property name="properties">
        <props>
            <prop key="helperDialect">mysql</prop>
            <prop key="reasonable">true</prop>
            <prop key="supportMethodsArguments">true</prop>
            <prop key="params">count=countSql</prop>
        </props>
    </property>
</bean>

配置MyBatis SqlSessionFactory

在Spring的配置文件中,配置MyBatis的SqlSessionFactory,并将分页插件添加到SqlSessionFactory中。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="plugins">
        <array>
            <ref bean="pageHelper" />
        </array>
    </property>
    <property name="mapperLocations" value="classpath*:mappers/*.xml" />
</bean>

配置数据源和事务管理

配置数据源和事务管理器。

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/your_database" />
    <property name="username" value="your_username" />
    <property name="password" value="your_password" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

创建Mapper接口

定义Mapper接口,并编写查询方法。例如:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users")
    List<User> selectAllUsers();
}

使用分页插件

在Service层或Controller层中使用PageHelper进行分页操作。

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public PageInfo<User> getUsers(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<User> users = userMapper.selectAllUsers();
        return new PageInfo<>(users);
    }
}

调用分页方法

在Controller中调用分页方法,并返回分页结果。

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public PageInfo<User> getUsers(@RequestParam(defaultValue = "1") int pageNum,
                                   @RequestParam(defaultValue = "10") int pageSize) {
        return userService.getUsers(pageNum, pageSize);
    }
}

注意博客主要围绕在实例上进行,很多东西都是建立在相关之前的mybatis系列文章的基础上,但为了给新手玩家看到明白,我将上述实例给出了,当然你直接复制粘贴肯定是会报错的,尤其是第一个Mybatis的实例,因为Book类需要你自己创建一个,里边属性值,你看心情给予吧,反正也无伤大雅。

最后补充一下Mybatis分页插件提供的配置属性:

  • helperDialect: 指定数据库的方言,如mysql、oracle、postgresql等。插件会根据方言生成相应的分页SQL。
  • reasonable: 当该参数设置为true时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页。默认值为false。
  • supportMethodsArguments: 支持从方法参数读取分页参数。默认值为false。
  • params: 用于配置一些特殊的参数,如count=countSql表示使用count查询时的SQL。
  • pageSizeZero: 当该参数设置为true时,如果pageSize=0则查询全部结果。默认值为false
  • rowBoundsWithCount: 使用RowBounds分页时是否进行count查询。默认值为false。
  • offsetAsPageNum: 使用RowBounds分页时,是否将offset作为pageNum使用。默认值为false。
  • pageSizeZero: 当pageSize为0时,返回所有结果。默认值为false。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…

LeetCode84:柱形图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 代码 单调栈 class Solution { public:int largestRectangleArea(vector<int>& h…

【数据结构】链表与顺序表的比较

不同点&#xff1a; 顺序表和链表是两种常见的数据结构&#xff0c;他们的不同点在于存储方式和插入、删除操作、随机访问、cpu缓存利用率等方面。 一、存储方式不同: 顺序表&#xff1a; 顺序表的存储方式是顺序存储&#xff0c;在内存中申请一块连续的空间&#xff0c;通…

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…

字符串-最长回文子串

一、题目描述 二、解题思路 设置双指针&#xff0c;定位连续子串&#xff0c;这里提供暴力解法&#xff0c;枚举各种子串并判断子串是否符合回文特征&#xff0c;符合则更新最长子串长度。 主要是注意一下java相关的语法API&#xff1a; 1.使用 (new StringBuilder(substr))…

MongoDB~存储引擎了解

存储引擎 存储引擎是一个数据库的核心&#xff0c;主要负责内存、磁盘里数据的管理和维护。 MongoBD的优势&#xff0c;在于其数据模型定义的灵活性、以及可拓展性。但不要忽略&#xff0c;其存储引擎也是插件式的存在&#xff0c;支持不同类型的存储引擎&#xff0c;使用不同…

B-TREE教程(个人总结版)

背景 在计算机科学中&#xff0c;数据存储和检索的效率是一个重要的研究课题。B-树&#xff08;B-Tree&#xff09;作为一种自平衡树结构&#xff0c;特别适合于在磁盘存储中处理大规模数据。它通过保持树的高度平衡&#xff0c;使得搜索、插入和删除操作的时间复杂度保持在对…

docker查看容器目录挂载

查看命令 docker inspect --format{{ json .Mounts }} <container_id_or_name> | jq 示例 docker inspect --format{{ json .Mounts }} af656ae540af | jq输出

Linux远程连接失败(Linux与Windows相互可以ping)

Linux远程连接解决办法记录 目录 文章目录 Linux远程连接解决办法记录1.SSH没有开启1.1查询ssh进程 1.SSH没有开启 sudo apt install openssh-serversudo /etc/init.d/ssh resart1.1查询ssh进程 ps -e | grep ssh 重新尝试连接

USB - D+/D-信号介绍

USB &#xff08;通用串行总线&#xff09;信令包括两条数据线 D 和 D-&#xff0c;用于差分信令&#xff0c;以提高抗噪能力和数据完整性。这些线路的控制决定了 USB 通信中的数据传输、各种状态和信号协议。 USB 差分信号 差分信号是指数据由 D 和 D- 线路之间的电压差来表…

【C++进阶】深入STL之string:掌握高效字符串处理的关键

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. STL基本…

Java版本家政上门系统源码,自主研发、安全可控,支持任意二次开发

家政上门系统源码&#xff0c;Java版本&#xff0c;自主研发、安全可控。支持任意二次开发、有丰富合作案例。多端管理&#xff1a;管理端、用户端、服务端。 技术参数&#xff1a; 技术架构&#xff1a;springboot、mysql 、Thymeleaf 开发语言&#xff1a;java1.8、vue 开…

【智能AI相机】基于AI的新型成像和照明技术

缩短检测时间 降低废品率和成本 更快捕捉更多缺陷 ” Trevista CI Dome将康耐视专利的计算成像算法与结构化漫射圆顶照明相结合&#xff0c;提供无与伦比的地形图像质量&#xff0c;为光泽和哑光表面检测提供创新解决方案。有助于&#xff1a;缩短检测时间、降低废品率和成本…

通俗易懂->哈希表详解

目录 一、什么是哈希表&#xff1f; 1.1哈希表长什么样&#xff1f; 1.2为什么会有哈希表&#xff1f; 1.3哈希表的特点 1.3.1 取余法、线性探测 1.3.2 映射 1.3.3负载因子 1.4哈希桶 1.5闲散列与开散列 1.6总结 二、设计hash表 1、哈希表的设计 1&#xff09;插入…

ChatGPT在工作中的使用案例

知识点提示 开发过程中&#xff0c;遇到某个知识点&#xff0c;忘记或者不清楚怎么使用了&#xff0c;通过ChatGPT快速生成使用提示和案例。代码库“字典” 比如C 11 判断数组所有元素为false 在 C11 中&#xff0c;可以使用标准库中的 all_of 算法来判断数组中的所有元素是…

RAG 之 Embedding 模型 (一)

本文主要对 RAG 常见的 Embedding 模型 M3E 进行介绍。 一、M3E 1.1 简介 M3E 是 Moka Massive Mixed Embedding 的缩写。 Moka&#xff0c;此模型由 MokaAI 训练&#xff0c;开源和评测&#xff0c;训练脚本使用 uniem &#xff0c;评测 BenchMark 使用 MTEB-zh Massive&…

【计算机视觉】数字图像处理基础知识(模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类)

一、图像的基本概念 图像(image)&#xff1a;图像这个简单单词其实包含两方面含义&#xff1a; “图”&#xff1a;是指物体反射光or透射光的分布“像”&#xff1a;接收和记录其分布所得到的结果&#xff08;如&#xff1a;人的视觉系统所接收“图”在人脑中形成的映像或认识&…

从CSV到数据库(简易)

需求&#xff1a;客户上传CSV文档&#xff0c;要求CSV文档内容查重/插入/更新相关数据。 框架&#xff1a;jdbcTemplate、commons-io、 DB&#xff1a;oracle 相关依赖&#xff1a; 这里本来打算用的2.11.0&#xff0c;无奈正式项目那边用老版本1.3.1&#xff0c;新版本对类型…

整数之间的赋值问题

前言&#xff1a;我们在初学C语言的时候&#xff0c;总是避免不了一些数据类型的转换&#xff0c;例如int-->char&#xff0c;char-->int&#xff0c;如果我们仅仅只学习这些语法&#xff0c;而不去了解底层原理&#xff0c;对于这些输出的内容&#xff0c;我们可能会感觉…

集成建筑5G商城为建筑行业开拓新方向

集成建筑5G商城为建筑行业开拓新方向 建筑业在我国有着悠久的发展历史&#xff0c;近年来&#xff0c;伴随着我国经济的快速增长、城镇化步伐加快&#xff0c;我国房地产、建筑业持续增长&#xff0c;建筑业显现出巨大的发展潜力。建筑行业近年来始终保持较高的增长速度。根据…