mybatis-plus中wrapper的用法(详细)

2023-11-17

用到了wrapper,ge、le、ne、eq等的用法,及多表查询自写sql整理资料记录一下,以备后续复习。

目录------------(可点击相应目录直接跳转)

一、条件构造器关系介绍

条件构造器关系介绍 :

wapper介绍 :

二、项目实例

1、根据主键或者简单的查询条件进行查询

2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:

三、具体使用操作

1、ge、gt、le、lt、isNull、isNotNull

2、eq、ne

3、between、notBetween

4、allEq

5、like、notLike、likeLeft、likeRight

6、in、notIn、inSql、notinSql、exists、notExists

7、or、and

8、嵌套or、嵌套and

9、orderBy、orderByDesc、orderByAsc

10、last

11、指定要查询的列

12、set、setSql

四、项目中实际应用代码实例

实例1--包含 eq相等的比较方法

 实例2--包含 ge le ge等比较方法,及分页查询方法

 实例3--多表查询,手写sql示例,五表联查

先了解一下内外连接:

SQL内连接(INNER JOIN)

SQL外连接(OUTER JOIN


一、条件构造器关系介绍

条件构造器关系介绍 :

上图绿色框为抽象类abstract
蓝色框为正常class类,可new对象
黄色箭头指向为父子类关系,箭头指向为父类


wapper介绍 :

Wrapper : 条件构造抽象类,最顶端父类

AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

QueryWrapper : Entity 对象封装操作类,不是用lambda语法

UpdateWrapper : Update 条件封装,用于Entity对象更新操作

AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。

LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper

 LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、项目实例


1、根据主键或者简单的查询条件进行查询

    /**
     * 通过单个ID主键进行查询
     */
    @Test
    public void selectById() {
        User user = userMapper.selectById(1094592041087729666L);
        System.out.println(user);
    }
 
    /**
     * 通过多个ID主键查询
     */
    @Test
    public void selectByList() {
        List<Long> longs = Arrays.asList(1094592041087729666L, 1094590409767661570L);
        List<User> users = userMapper.selectBatchIds(longs);
        users.forEach(System.out::println);
    }
 
    /**
     * 通过Map参数进行查询
     */
    @Test
    public void selectByMap() {
        Map<String, Object> params = new HashMap<>();
        params.put("name", "张雨琪");
        List<User> users = userMapper.selectByMap(params);
        users.forEach(System.out::println);
    }

2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:

/**
     * 名字包含雨并且年龄小于40
     * <p>
     * WHERE name LIKE '%雨%' AND age < 40
     */
    @Test
    public void selectByWrapperOne() {
        QueryWrapper<User> wrapper = new QueryWrapper();
        wrapper.like("name", "雨").lt("age", 40);
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 名字包含雨
     * 年龄大于20小于40
     * 邮箱不能为空
     * <p>
     * WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
     */
    @Test
    public void selectByWrapperTwo() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 名字为王性
     * 或者年龄大于等于25
     * 按照年龄降序排序,年龄相同按照id升序排序
     * <p>
     * WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC
     */
    @Test
    public void selectByWrapperThree() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.likeRight("name", "王").or()
                .ge("age", 25).orderByDesc("age").orderByAsc("id");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询创建时间为2019年2月14
     * 并且上级领导姓王
     * <p>
     * WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
     */
    @Test
    public void selectByWrapperFour() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
                .inSql("manager_id", "select id from user where name like '王%'");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询王姓
     * 并且年龄小于40或者邮箱不为空
     * <p>
     * WHERE name LIKE '王%' AND ( age < 40 OR email IS NOT NULL )
     */
    @Test
    public void selectByWrapperFive() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.likeRight("name", "王").and(qw -> qw.lt("age", 40).or().isNotNull("email"));
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询王姓
     * 并且年龄大于20 、年龄小于40、邮箱不能为空
     * <p>
     * WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
     */
    @Test
    public void selectByWrapperSix() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.likeRight("name", "王").or(
                qw -> qw.between("age", 20, 40).isNotNull("email")
        );
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * (年龄小于40或者邮箱不为空) 并且名字姓王
     * WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
     */
    @Test
    public void selectByWrapperSeven() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email"))
                .likeRight("name", "王");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询年龄为30、31、32
     * WHERE age IN (?,?,?)
     */
    @Test
    public void selectByWrapperEight() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.in("age", Arrays.asList(30, 31, 32));
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }
 
    /**
     * 查询一条数据
     * limit 1
     */
    @Test
    public void selectByWrapperNine() {
        QueryWrapper<User> wrapper = Wrappers.query();
        wrapper.in("age", Arrays.asList(30, 31, 32)).last("limit 1");
        List<User> users = userMapper.selectList(wrapper);
        users.forEach(System.out::println);
    }

三、具体使用操作

注意:以下条件构造器的方法入参中的 column 均表示数据库字段

1、ge、gt、le、lt、isNull、isNotNull


@Test
public void testDelete() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .isNull("name")
        .ge("age", 12)
        .isNotNull("email");
    int result = userMapper.delete(queryWrapper);
    System.out.println("delete return count = " + result);
}


SQL:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL

2、eq、ne


注意:seletOne返回的是一条实体记录,当出现多条时会报错

@Test
public void testSelectOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "Tom");
 
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user);
}


3、between、notBetween


包含大小边界

@Test
public void testSelectCount() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.between("age", 20, 30);
 
    Integer count = userMapper.selectCount(queryWrapper);
    System.out.println(count);
}

SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ? 

4、allEq

@Test
public void testSelectList() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    Map<String, Object> map = new HashMap<>();
    map.put("id", 2);
    map.put("name", "Jack");
    map.put("age", 20);9
 
    queryWrapper.allEq(map);
    List<User> users = userMapper.selectList(queryWrapper);
 
    users.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ? 

5、like、notLike、likeLeft、likeRight


selectMaps返回Map集合列表

@Test
public void testSelectMaps() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
        .notLike("name", "e")
        .likeRight("email", "t");
 
    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
    maps.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ? 

6、in、notIn、inSql、notinSql、exists、notExists


in、notIn:

notIn("age",{1,2,3})--->age not in (1,2,3)
notIn("age", 1, 2, 3)--->age not in (1,2,3)

inSql、notinSql:可以实现子查询

例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
@Test
public void testSelectObjs() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //queryWrapper.in("id", 1, 2, 3);
    queryWrapper.inSql("id", "select id from user where id < 3");
 
    List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
    objects.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND id IN (select id from user where id < 3) 

7、or、and


注意:这里使用的是 UpdateWrapper 不调用or则默认为使用 and 连

@Test
public void testUpdate1() {
 
    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");
 
    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or()
        .between("age", 20, 30);
 
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}

UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?

8、嵌套or、嵌套and


这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号

@Test
public void testUpdate2() {
 
    //修改值
    User user = new User();
    user.setAge(99);
    user.setName("Andy");
 
    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .or(i -> i.eq("name", "李白").ne("age", 20));
 
    int result = userMapper.update(user, userUpdateWrapper);
    System.out.println(result);
}


UPDATE user SET name=?, age=?, update_time=? 

WHERE deleted=0 AND name LIKE ? 

OR ( name = ? AND age <> ? ) 

9、orderBy、orderByDesc、orderByAsc
 

@Test
public void testSelectListOrderBy() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("id");
 
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,deleted,version 

FROM user WHERE deleted=0 ORDER BY id DESC

10、last


直接拼接到 sql 的最后

注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用

@Test
public void testSelectListLast() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.last("limit 1");
 
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}


SELECT id,name,age,email,create_time,update_time,deleted,version 

FROM user WHERE deleted=0 limit 1

11、指定要查询的列

@Test
public void testSelectListColumn() {
 
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "age");
 
    List<User> users = userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

SELECT id,name,age FROM user WHERE deleted=0

12、set、setSql


最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set()  和 setSql() 中 的字段

@Test
public void testUpdateSet() {
    //修改值
    User user = new User();
    user.setAge(99);
 
    //修改条件
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper
        .like("name", "h")
        .set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
        .setSql(" email = '123@qq.com'");//可以有子查询
    int result = userMapper.update(user, userUpdateWrapper);
}


UPDATE user SET age=?, update_time=?, name=?, email = '123@qq.com' WHERE deleted=0 AND name LIKE ?

四、项目中实际应用代码实例

(此部分更新于2022年7月20日)

实例1--包含 eq相等的比较方法

 实例2--包含 ge le ge等比较方法,及分页查询方法

 实例3--多表查询,手写sql示例,五表联查

先了解一下内外连接:

什么是连接表?
多表查询原理:将多个表通过笛卡尔积形成一个虚表,再根据查询条件筛选符合条件的数据。
在关系数据库中,数据分布在多个逻辑表中。 要获得完整有意义的数据集,需要使用连接来查询这些表
中的数据。 SQL Server支持多种
连接包括
INNER JOIN:内连接,关键字在表中存在至少一个匹配时返回行。
left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join : 外连接,返回两个表中的行:left join + right join。
cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
GROUP BY:全外连接, 子句必须放在 WHERE 子句中的条件之后,必须放在 ORDER BY 子句之前
每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行
 

SQL内连接(INNER JOIN)


  返回两张表中符合连接条件的数据行

   内连接是从结果表中删除与被连接表中未匹配行的所有行,所以内连接可能会丢失信息


SQL外连接(OUTER JOIN)


    外连接(OUTER JOIN)分 为左连接、右连接和全连接
    

    左连接:返回左表中的所以行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值NULL

 

     语法:SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 条件
    eg:我们左连接Student表、Score表查询学生的成绩,SQL 语句如下:
    SELECT * FROM Student LEFT OUTER JOIN Score ON Student.id = Score.studentID


    右 连 接:返回右表中的所以行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值NULL

 

     语法:SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 条件
    eg:我们右连接Student表、Score表查询学生的成绩,SQL 语句如下:
    SELECT * FROM Student RIGHT OUTER JOIN Score ON Student.id = Score.studentID
 


    全连接:返回左表和右表中的所有行,当某行在另一表中没有匹配行,则另一表中的补NULL
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这个是mybatis-plus插件中mapper的一个表查询写法,由多个表内连接或外连接组成的数据。

用到的表结构如下: 分别为问题库表、数据字典、数据字典类型、部门表、用户表

 数据示例如下:obdis_problem表里去查type字段内容并返回对应的汉字语义

 

 查询每个字段都进行一次表连接,拿到对应的值,得出一个表结果值,即A\B\C\D等等结果,最后拼起来返回前端展示即可。搞懂了这个,所有的多表查询就基本迎刃而解。

<!-- 问题库列表返回与查询-->
    <select id="searchMoreProblem" resultType="com.hollysys.obdis.vo.problem.SearchObdisProblem">
      select
        p.id ,
        p.level,
        A.dict_value as level_text,
        p.dept_id_mgr,
        B.org_name as deptIdMgr_text,
        p.dept_id_work,
        C.org_name as deptIdWork_text,
        p.station,
        D.dict_value as station_text,
        p.source,
        E.dict_value as source_text,
        p.categroy,
        F.dict_value as categroy_text,
        p.type,
        G.dict_value as type_text,
        p.dev_code,
        H.dict_value as devCode_text,
        p.check_time,
        p.check_user,
        I.username as checkUser_text,
        p.deadline,
        p.deadline_real,
        p.duty_user,
        J.username as dutyUser_text,
        p.correct_user,
        K.username as correctUser_text,
        p.state,
        p.problem,
        p.requirement,
        p.solution
        from
        obdis_problem   p
        left join t_dict A on p.level = A.id
        left join t_dept B on p.dept_id_mgr = B.org_id
        left join t_dept C on p.dept_id_work = C.org_id
        left join t_dict D on p.station = D.id
        left join t_dict E on p.source = E.id
        left join t_dict F on p.categroy = F.id
        left join t_dict G on p.type = G.id
        left join t_dict H on p.dev_code = H.id
        left join t_user I on p.check_user = I.user_id
        left join t_user J on p.duty_user = J.user_id
        left join t_user K on p.correct_user = K.user_id

    where 1=1
      <if test="searchObdisProblem.levelText != null and searchObdisProblem.levelText != ''">
       and A.dict_value like concat('%', #{searchObdisProblem.levelText}, '%')
      </if>
      <if test="searchObdisProblem.deptIdMgrText != null and searchObdisProblem.deptIdMgrText != ''">
       and B.org_name like concat('%', #{searchObdisProblem.deptIdMgrText}, '%')
      </if>
      <if test="searchObdisProblem.deptIdWorkText != null and searchObdisProblem.deptIdWorkText != '' ">
       and C.org_name like concat('%', #{searchObdisProblem.deptIdWorkText}, '%')
      </if>
      <if test="searchObdisProblem.stationText != null and searchObdisProblem.stationText != ''">
        and D.dict_value = #{searchObdisProblem.stationText}
      </if>
      <if test="searchObdisProblem.sourceText != null and searchObdisProblem.sourceText != ''">
       and E.dict_value = #{searchObdisProblem.sourceText}
      </if>
      <if test="searchObdisProblem.categroyText != null  and searchObdisProblem.categroyText != ''">
        and F.dict_value = #{searchObdisProblem.categroyText}
      </if>
      <if test="searchObdisProblem.typeText != null  and searchObdisProblem.typeText != ''">
        and G.dict_value = #{searchObdisProblem.typeText}
      </if>
      <if test="searchObdisProblem.devCodeText != null and searchObdisProblem.devCodeText != ''">
        and H.dict_value = #{searchObdisProblem.devCodeText}
      </if>
      <if test="searchObdisProblem.checkTimeStart != null ">
        and p.check_time &gt;= #{searchObdisProblem.checkTimeStart}
      </if>
        <if test="searchObdisProblem.checkTimeEnd != null ">
            and p.check_time &lt;= #{searchObdisProblem.checkTimeEnd}
            order by p.check_time
        </if>
      <if test="searchObdisProblem.checkUserText != null and searchObdisProblem.checkUserText != ''">
        and I.username = #{searchObdisProblem.checkUserText}
      </if>
      <if test="searchObdisProblem.deadline != null ">
        and p.deadline = #{searchObdisProblem.deadline}
      </if>
      <if test="searchObdisProblem.deadlineReal != null ">
        and p.deadline_real = #{searchObdisProblem.deadlineReal}
      </if>
      <if test="searchObdisProblem.dutyUserText != null and searchObdisProblem.dutyUserText != ''">
        and J.username = #{searchObdisProblem.dutyUserText}
      </if>
      <if test="searchObdisProblem.correctUserText != null and searchObdisProblem.correctUserText != ''">
        and K.username = #{searchObdisProblem.correctUserText}
      </if>
      <if test="searchObdisProblem.state != null and searchObdisProblem.state != ''">
        and state = #{searchObdisProblem.state}
      </if>
      <if test="searchObdisProblem.problem != null and searchObdisProblem.problem != ''">
          and p.problem like concat('%', #{searchObdisProblem.problem}, '%')
      </if>
      <if test="searchObdisProblem.requirement != null and searchObdisProblem.requirement != ''">
          and p.requirement like concat('%', #{searchObdisProblem.requirement}, '%')
      </if>
      <if test="searchObdisProblem.solution != null and searchObdisProblem.solution != ''">
          and p.solution like concat('%', #{searchObdisProblem.solution}, '%')
      </if>
  </select>

-------------------------------------------------------------------------------------以下无正文-------------------

参考文档

1、(五)springboot + mybatis plus强大的条件构造器queryWrapper、updateWrapper_青蛙与大鹅的博客-CSDN博客_querywrapper.eq

2、https://blog.csdn.net/kepengs/article/details/112345870

3、Wrapper使用_weixin_39615889的博客-CSDN博客_wrapper使用

4、MyBatis-Plus Wrapper条件构造器查询大全_IT贱男的博客-CSDN博客_wrapper.like

 5、https://blog.csdn.net/qq_48209375/article/details/114446611

6、https://blog.csdn.net/TBDBTUO/article/details/123550498

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis-plus中wrapper的用法(详细) 的相关文章

  • 我们如何测试我们的 Java UI?

    我们正在寻找记录和回放类型的测试工具来自动化我们的一些 UI 功能测试 我们已经研究了从 Silke 到 QTP 的大多数常见嫌疑 但没有一个起作用 当需要右键单击才能从右键单击菜单中选择某些内容时 或者当您必须在网格的下拉列表中选择一个值
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • 确定代码是否在 App Engine 运行时 (Java) 上运行

    如何确定某些代码 Serv let 或简单的类 是否正在 Google App Engine 运行时 Java 上运行 以便决定是否使用 App Engine 的特定库 是否有一些可靠的运行时环境 ID 您可以检查com google ap
  • 将多个视频文件合并到一个文件中

    我有多个以相同帧速率和分辨率录制的视频 我想将两个视频合并为一个视频 因此结果文件将是大视频 我正在使用 MP4 解析器 api 并使用下面的代码 Movie countVideo new MovieCreator build Channe
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • 当有“拥有”时,为什么你有“哪里”[重复]

    这个问题在这里已经有答案了 我知道这个问题已经被讨论了很多 但我的研究都无法让我相信 where and havingMySQL 中的 子句 据我了解 我们可以使用 where 子句实现所有可以完成的操作having 例如 select f
  • Java 套接字:可以从一个线程发送并在另一个线程上接收吗?

    这可能是一个非常基本的问题 但我很难找到答案 让一个线程写入 Socket 的输出流 而另一个线程从 Socket 的输入流读取数据 这样可以吗 编辑 这是一个与外部服务器通信的客户端应用程序 我并不是想让两个线程互相交谈 很抱歉含糊不清
  • 当我在 MySQL 中使用 UUID 作为主键时,会如何影响性能

    我想知道当我在 MySQL 中使用 UUID 作为主键时 会对服务器的性能产生怎样或多大的影响 我想你正在使用InnoDB 无论如何你应该 因此 请阅读 高性能 MySQL 2ed 第 117 页中的以下章节 一般来说 从性能的角度来看 U
  • Mac 上的 Emacs 和 MySQL

    我尝试使用 sql mysql 模式 但 emacs 无法找到文件 目录 mysql 但是 我可以从终端访问它 如何将 emacs 中的 mysql 指向 usr local mysql bin mysql setq sql mysql p
  • 使用 include 进行 JAXB 剧集编译不起作用

    我有 2 个模式 A B 我在 B 中重用了一些 A 元素 我不使用命名空间 我在用着
  • 如何告诉 cxf 将包装类型保留在方法中?

    在我的 WSDL 中我有一个操作
  • 对不同的数据库和表进行一次性查询

    我有一个 Rails 应用程序 侧面有一个 WordPress 博客 完全单独位于 blog 客户想要 Rails 应用程序主页上的最新博客文章 因此我需要对 word press 数据库进行一次性 mysql 查询 我将如何在 Rails
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod
  • 我可以关闭并重新打开套接字吗?

    我学习了一个使用套接字的例子 在此示例中 客户端向服务器发送请求以打开套接字 然后服务器 侦听特定端口 打开套接字 一切都很好 套接字从双方 客户端和服务器 打开 但我仍然不清楚这个东西有多灵活 例如 客户端是否可以关闭一个打开的 从两端
  • 使用 PHP MySql 进行关键字搜索?

    我的 mysql 表中有标题 varchar 描述 text 关键字 varchar 字段 我保留了关键字字段 因为我认为我只会在这个字段中搜索 但我现在需要在所有三个字段中进行搜索 所以对于关键字 word1 word2 word3 我的
  • 计算移动的球与移动的线/多边形碰撞的时间(2D)

    我有一个多边形 里面有一个移动的球 如果球撞到边界 它应该反弹回来 My current solution I split the polygon in lines and calculate when the ball hits the
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢

随机推荐

  • 序列化2之[网鼎杯 2020 青龙组]AreUSerialz1

    class FileHandler protected op protected filename protected content function construct op 1 filename tmp tmpfile content
  • 『 云原生·Docker』初识Docker镜像与Docker镜像操作(一)

    系列文章目录 本系列主要分为以下六大部分 正在更新中 尽请期待 云原生 生之门 云原生 前置知识 云原生 Docker 云原生 Kubernetes 云原生 KubeSphere 云原生 DevOps 点击关注本专栏 提示 已经更新的或正在
  • moviepy第2天

    MoviePy 完整文档 是一个用于视频编辑的Python库 剪切 串联 标题插入 视频合成 又名非线性编辑 视频处理和创建自定义效果 有关一些使用示例 请参阅库 MoviePy可以读取和写入所有最常见的音频和视频格式 包括GIF 并在Wi
  • C语言实现判断一个整数能否被3 5 7中哪些数字整除

    include
  • Excel中的散点图这么强大,学习了!

    全世界只有3 14 的人关注了 数据与算法之美 平时见得最多的也许是柱形图了 但我个人最喜欢的却是散点图 在讲散点图之前 我先阐述一个不太严谨的个人观点 我认为 所有的数据图表都可以分为两类 一类是偏重于展示 一类是偏重于研究 如何理解 偏
  • !!!RFID原理及应用期末复习总结!!!少走弯路,直接满绩!

    选用教材 RFID原理及应用 清华大学出版社 第一章 概述 学习目标 什么是RFID RFID的发展史 RFID的构成及各模块功能 RFID的几种分类 RFID的应用领域 射频识别 RFID RFID技术 又称射频识别 是一种通信技术 可通
  • 《深入理解Java虚拟机》学习笔记

    JDK 用于支持Java程序开发的最小环境 包括Java程序设计语言 Java虚拟机 JavaAPI三部分 JRE 支持Java程序运行的标准环境 包括Java SE API子集和Java虚拟机 第一章 Java虚拟机发展史 1 Sun C
  • 3.取石头 (15分)

    题目内容 有一堆石子 A B两人轮流从中取出石子 每次取出的石子数目只能为1 3 7或8 最后一枚石子谁取到就是输方 A B两人都足够聪明 不会做出错误的判断 现给出一定数目的石子 A先取石子 计算A最终是输是赢 赢用1表示 输用0表示 输
  • 灰狼(GWO)算法(附完整Matlab代码,可直接复制)

    尊重他人劳动成果 请勿转载 有问题可留言或私信 看到了都会回复解答 其他算法请参考 1 粒子群 PSO 优化算法 附完整Matlab代码 可直接复制 https blog csdn net xinzhi1992 article detail
  • Redisson分布式锁

    SpringBoot集成Redisson步骤
  • GeoServer基础教程(五):使用GeoServer和OpenLayers发布地图服务

    转载 https ethanblog com tech publish wms with geoserver and openlayers html 在前面几节的关于GeoServer的基础教程中 我们介绍了如何使用GeoServer发布地
  • Oracle中case when详解

    格式 格式一 case when conditionalExpression 01 then result 01 when conditionalExpression 02 then result 02 when conditionalEx
  • linux下opencv2.4 静态库编译与使用(针对内网主机无法安装opencv情况下使用)

    linux下opencv2 4 静态库编译与使用 针对内网主机无法安装opencv情况下使用 1 如果内网主机无法通过网络安装opencv环境 此时需要使用静态库编译方法生成opencv应用程序 此时需要opencv相关的libxx a 2
  • ElasticSearch IK分词器配置远程词典

    ElasticSearch IK分词器配置远程词典 1 在线安装IK分词器 2 IK分词器的弊端 3 解决措施 配置远程词典实时更新 补充 1 在线安装IK分词器 ElasticSearch中默认的分词器是standard 该分词器对中文按
  • 每日一题:序列操作

    序列操作 题目 Daimayuan Online Judge 没啥思路 如果暴力的话肯定会超时 太难了太难了 参考了题解想了好久才弄懂 该题是思维题 操作1是将第x个数变为y 输入的时候就可以修改值了 毕竟只要一个语句就行 每次操作都是将x
  • seata 1.4.2 执行seata-server.bat报错:Could not create connection to database server.

    seata 1 4 2 执行seata server bat报错 18 40 17 778 ERROR tionPool Create 343563528 com alibaba druid pool DruidDataSource cre
  • 网络整理续

    计算机网络简答题 1 TCP 协议和 UDP 协议的区别有哪些 1 TCP 属于面向连接的协议 UDP 属于面向无连接的协议 2 TCP 可以保证数据可靠 有序的传输 可以进行流量控制 UDP 无法实现 3 TCP 协议有效载荷小于 UDP
  • Linux下20个常用Linux性能监控工具/命令

    此文章不作为商业用途 纯粹的用来学习 20个常用Linux性能监控工具 命令 对于 Linux Unix 系统管理员非常有用的并且最常用的20个命令行系统监视工具 这些命令可以在所有版本的 Linux 下使用去监控和查找系统性能的实际原因
  • vscode实用快捷键查找和替换

    vscode是一款功能十分强大的编辑器 且带有许多插件 利用插件可以让开发速度提升几倍甚至几十倍 vscode快捷键 查找 单文件查找 ctrl F 替换 单文件内替换一处 crtl shift 1 单文件内替换全部 ctrl alt en
  • mybatis-plus中wrapper的用法(详细)

    用到了wrapper ge le ne eq等的用法 及多表查询自写sql整理资料记录一下 以备后续复习 目录 可点击相应目录直接跳转 一 条件构造器关系介绍 条件构造器关系介绍 wapper介绍 二 项目实例 1 根据主键或者简单的查询条