锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Java两表查询的方法(一对一,一对多,多对多)

Java两表查询的方法(一对一,一对多,多对多)

0
  • JAVA
  • 发布于 2024-09-21
  • 16 次阅读
黄健
黄健

一、配置环境:

首先我们需要Maven环境;

源码:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>sanzhongfangfa24_7_23</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <!--MySQL框架-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>
                mysql-connector-java
            </artifactId>
            <version>
                8.0.33
            </version>
        </dependency>
        <!--日志框架-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>
                1.2.12
            </version>
        </dependency>
        <!--MyBatis的框架-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!--Java 单元测试框架用来@Test-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <!--用来指定上面的依赖进行测试两个缺一不可-->
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

</project>

其次我们要配置核心配置文件;

这个文件是我们整个功能的基础;

源码:

<?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 >
<!--    这是转Data类型的调用-->
    <typeHandlers>
        <typeHandler handler="org.handle.DateTypeHandler"></typeHandler>
    </typeHandlers>
    <environments default="develop">
        <environment id="develop">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/duobiaochaxun?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/duoduiduoMapper.xml"/>
<!--        <mapper resource="mapper/oneduiduoMapper.xml"/>-->
<!--     必须配套写完不然报错   <mapper resource="mapper/UserMapper.xml"/>-->
    </mappers>
</configuration>

第三我们要写日志的配置文件:

日志源码:

#日志
log4j.rootLogger=debug, stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
Log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
Log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.layout=org.apache.log4j.PatternLayout
Log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

第四我们写数据库和Java对象类型的转化:

package org.handle;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class DateTypeHandler extends BaseTypeHandler<Date> {
    // 将java类型转换成数据库需要的类型
    @Override
    //这段代码是 MyBatis 中的一个自定义类型处理器 (TypeHandler) 的一部分,它负责将Date对象转换为可以存储在数据库中的形式。
    //具体来说,这个方法将 Date 对象转换为长整型 (long) 值,代表从 1970 年 1 月 1 日 00:00:00 UTC 开始到给定日期的毫秒数。
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        //将日期赋值给long形的time
        long time = date.getTime();
        // PreparedStatement 的 setLong 方法将 time 设置到预编译 SQL 语句的第 i 个参数位置
        //这意味着日期将作为长整型值被存储在数据库中。
        preparedStatement.setLong(i, time);
    }

    // 将数据库中的类型 转换为java类型
  // string 要转换的字符串
// resultSet 查询出的结果
    @Override
   // 将数据库查询结果中的长整型值转换为 java.util.Date 对象。
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
       // 这一行代码调用了 ResultSet 的 getLong 方法,根据列名 s 获取长整型值。
        long along = resultSet.getLong(s);
        //这一行代码使用从 ResultSet 中获取的长整型值创建一个新的 java.util.Date 对象。
        Date date = new Date(along);
        return date;

    }

    // 将数据库中的类型 转换为java类型
    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        long along = resultSet.getLong(i);
        Date date = new Date(along);
        return date;
    }

    // 将数据库中的类型 转换为java类型
    @Override
//用于将从 CallableStatement 中获取的长整型值转换为 java.util.Date 对象


    //这是一个 CallableStatement 对象,用于执行 SQL 存储过程或函数,并获取其结果。
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        long aLong = callableStatement.getLong(i);
        Date date = new Date(aLong);
        return date;
    }
}

这样我们就能将数据库和Java类型的的数据互相转化,别忘了将 该完成的类添加到核心配置文件里;

做完上述的环境配置,我们就要开始写项目和功能 。

二、写数据:

我们要写我们需要的Javabean数据,这个按照数据库来写,这里只展示功能,下面是我的例子。

数据库的表:

orders(订单表):

user(用户表):

Javabean的数据:

订单表:

package org.Emp;


import java.util.Date;
import java.util.List;

public class order {
    private Integer id;
    private Date ordertime;
    private Double total;
    private Integer uuid;
    private user user;


    public order() {
    }

    public order(Integer id, Date ordertime, Double total, Integer uuid, user user) {
        this.id = id;
        this.ordertime = ordertime;
        this.total = total;
        this.uuid = uuid;
        this.user = user;
    }

    /**
     * 获取
     * @return id
     */
    public Integer getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取
     * @return ordertime
     */
    public Date getOrdertime() {
        return ordertime;
    }

    /**
     * 设置
     * @param ordertime
     */
    public void setOrdertime(Date ordertime) {
        this.ordertime = ordertime;
    }

    /**
     * 获取
     * @return total
     */
    public Double getTotal() {
        return total;
    }

    /**
     * 设置
     * @param total
     */
    public void setTotal(Double total) {
        this.total = total;
    }

    /**
     * 获取
     * @return uuid
     */
    public Integer getUuid() {
        return uuid;
    }

    /**
     * 设置
     * @param uuid
     */
    public void setUuid(Integer uuid) {
        this.uuid = uuid;
    }

    /**
     * 获取
     * @return user
     */
    public user getUser() {
        return user;
    }

    /**
     * 设置
     * @param user
     */
    public void setUser(user user) {
        this.user = user;
    }

    public String toString() {
        return "order{id = " + id + ", ordertime = " + ordertime + ", total = " + total + ", uuid = " + uuid + ", user = " + user + "}";
    }
}


用户表:

package org.Emp;


import java.util.Date;
import java.util.List;
public class user {
private Integer id;
private String username;
private String password;
private Date birthday;

    public user() {
    }

    public user(Integer id, String username, String password, Date birthday) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.birthday = birthday;
    }

    /**
     * 获取
     * @return id
     */
    public Integer getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取
     * @return username
     */
    public String getUsername() {
        return username;
    }

    /**
     * 设置
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 获取
     * @return password
     */
    public String getPassword() {
        return password;
    }

    /**
     * 设置
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * 获取
     * @return birthday
     */
    public Date getBirthday() {
        return birthday;
    }

    /**
     * 设置
     * @param birthday
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String toString() {
        return "user{id = " + id + ", username = " + username + ", password = " + password + ", birthday = " + birthday + "}";
    }


//    private List<role> role;

//private List<order> order;


}

底层数据建成完毕,我们就要开始着手写功能;

三、写功能:

1、一对一查询

修改底层Javabean:

因为我们有两张表要查,要输出,但是Java输出形式只能是一张表,所以我们要用注入的方式,将用户表注入到订单表里,这样只用输出订单格式就可以了。

写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">
<!--这一行定义了这个映射文件的命名空间,org.dao.oneselMapper 是一个唯一的标识符,用来区分不同的映射文件-->
<mapper namespace="org.dao.oneselMapper">
<!--这个 <resultMap> 元素定义了一个名为 orderMap 的映射规则,它会把查询结果映射到 org.Emp.order类型的对象上。-->
<!--也就是将数据库的值映射到Javabean中-->
    <resultMap id="orderMap" type="org.Emp.order">
<!--id映射-->
<!--这一行指定了数据库中的 id 列与 JavaBean 中的 id 属性相对应。-->
        <id column="id" property="id"></id>
<!--普通属性映射,这些 <result> 标签分别指定了数据库中的 ordertime, total, 和 uuid 列与 JavaBean 中对应的属性相对应。-->
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
        <result column="uuid" property="uuid"></result>
<!--关联映射 (Association):-->
<!--这部分定义了一个一对一关联映射,表示 org.Emp.order 类中的 user 属性应该如何从数据库结果中获取其属性值。
这里,<association> 标签内的 <id> 和 <result> 标签指定了 user 表中的列名与 org.Emp.user 类中的属性名之间的对应关系。-->
        <association property="user" javaType="org.Emp.user">
            <id column="uuid" property="id"></id>
            <result column="username" property="username"></result>
            <result column="password" property="password"></result>
            <result column="birthday" property="birthday"></result>
        </association>
    </resultMap>

    <!--数据库的一对一查询-->
<!--SQL 查询定义:-->
<!--这个 <select> 标签定义了一个 SQL 查询,使用前面定义的 orderMap 映射规则来映射查询结果。
这里的 SQL 语句选取了所有列 (select *) 并通过 o.uuid = u.id 条件进行表连接。-->
    <select id="findall" resultMap="orderMap">

        select * from orders o, user u where o.uuid = u.id
    </select>

</mapper>

将映射文件配置到核心文件里:

最后,我们需要一个接口将写好的映射文件调用出来:

在映射文件中:

在接口中:

这样我们的整个功能写完了,现在需要写一个测试方法来调用:

测试类:

首先要配置日志文件:

其次要加载MyBatis配置文件

代码:

public class testuser {
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession session;

    @Test
    public void star1() throws IOException {
        //配置日志信息
        Properties properties = new Properties();
        FileInputStream fileInputStream = new FileInputStream("src/main/resources/config/log4j.properties");
        properties.load(fileInputStream);
        PropertyConfigurator.configure(properties);
        // 加载 MyBatis 配置文件
        //从类路径中获取 MyBatis 配置文件 mybatis-config.xml 的输入流。
        in = Resources.getResourceAsStream("config/mybatis-config.xml");
        //创建 SqlSessionFactory 对象,它是 MyBatis 的工厂类,用于创建 SqlSession。
        factory = new SqlSessionFactoryBuilder().build(in);
        //创建一个新的 SqlSession 实例,用于执行 SQL 语句。
        session = factory.openSession();
        //通过 SqlSession 获取 oneselMapper 接口的代理实现。
        oneselMapper mapper = session.getMapper(oneselMapper.class);
        //接口中定义了一个名为 sanbiaoall 的方法,该方法返回一个 List<students> 类型的列表。
        List<order> findall = mapper.findall();
        for (order a : findall) {
            System.out.println(a);
        }
    }
}

结果:

Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 2101636817.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7d446ed1]
==>  Preparing: select * from orders o, user u where o.uuid = u.id
==> Parameters: 
<==      Total: 5
order{id = 1, ordertime = Thu Jan 01 13:36:51 CST 1970, total = 12.5, uuid = 1, user = user{id = 1, username = aa, password = 1233, birthday = Thu Jan 01 13:37:01 CST 1970}}
order{id = 2, ordertime = Thu Jan 01 13:36:51 CST 1970, total = 12.5, uuid = 3, user = user{id = 3, username = cc, password = 2133, birthday = Thu Jan 01 10:50:11 CST 1970}}
order{id = 3, ordertime = Thu Jan 01 13:38:31 CST 1970, total = 12.5, uuid = 2, user = user{id = 2, username = bb, password = 2133, birthday = Thu Jan 01 13:36:51 CST 1970}}
order{id = 4, ordertime = Thu Jan 01 13:37:01 CST 1970, total = 15.0, uuid = 2, user = user{id = 2, username = bb, password = 2133, birthday = Thu Jan 01 13:36:51 CST 1970}}
order{id = 5, ordertime = Thu Jan 01 13:37:01 CST 1970, total = 15.0, uuid = 1, user = user{id = 1, username = aa, password = 1233, birthday = Thu Jan 01 13:37:01 CST 1970}}

2、一对多查询(结构和上面一样下面只展示代码):

修改底层Javabean:

订单表:

package org.Emp;


import java.util.Date;
import java.util.List;

public class order {
    private Integer id;
    private Date ordertime;
    private Double total;
    private Integer uuid;

    public order() {
    }

    public order(Integer id, Date ordertime, Double total, Integer uuid) {
        this.id = id;
        this.ordertime = ordertime;
        this.total = total;
        this.uuid = uuid;
    }

    /**
     * 获取
     * @return id
     */
    public Integer getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取
     * @return ordertime
     */
    public Date getOrdertime() {
        return ordertime;
    }

    /**
     * 设置
     * @param ordertime
     */
    public void setOrdertime(Date ordertime) {
        this.ordertime = ordertime;
    }

    /**
     * 获取
     * @return total
     */
    public Double getTotal() {
        return total;
    }

    /**
     * 设置
     * @param total
     */
    public void setTotal(Double total) {
        this.total = total;
    }

    /**
     * 获取
     * @return uuid
     */
    public Integer getUuid() {
        return uuid;
    }

    /**
     * 设置
     * @param uuid
     */
    public void setUuid(Integer uuid) {
        this.uuid = uuid;
    }

    public String toString() {
        return "order{id = " + id + ", ordertime = " + ordertime + ", total = " + total + ", uuid = " + uuid + "}";
    }

//    private user user;


}

用户表:

package org.Emp;


import java.util.Date;
import java.util.List;
public class user {
private Integer id;
private String username;
private String password;
private Date birthday;


private List<order> order;


    public user() {
    }

    public user(Integer id, String username, String password, Date birthday, List<order> order) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.birthday = birthday;
        this.order = order;
    }

    /**
     * 获取
     * @return id
     */
    public Integer getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取
     * @return username
     */
    public String getUsername() {
        return username;
    }

    /**
     * 设置
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 获取
     * @return password
     */
    public String getPassword() {
        return password;
    }

    /**
     * 设置
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * 获取
     * @return birthday
     */
    public Date getBirthday() {
        return birthday;
    }

    /**
     * 设置
     * @param birthday
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 获取
     * @return order
     */
    public List<order> getOrder() {
        return order;
    }

    /**
     * 设置
     * @param order
     */
    public void setOrder(List<order> order) {
        this.order = order;
    }

    public String toString() {
        return "user{id = " + id + ", username = " + username + ", password = " + password + ", birthday = " + birthday + ", order = " + order + "}";
    }
}
//    private List<role> role;
写Mapper映射(核心):
<?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="org.dao.oneselMapper">
    <resultMap id="userMap" type="org.Emp.user">
        <id column="uuid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
<!--集合映射 (Collection)-->
        <collection property="order" ofType="org.Emp.order">
            <id column="oid" property="id"></id>
            <result column="ordertime" property="ordertime"></result>
            <result column="total" property="total"></result>
        </collection>
    </resultMap>

    <!--数据库的一对多查询-->
    <select id="onefindallduo" resultMap="userMap">
        select *,o.id oid from user u,orders o where o.uuid = u.id
    </select>

</mapper>
接口:

3、多对多查询:

修改底层Javabean;

role(角色表):

package org.Emp;

import java.util.List;

public class role {
    private Integer id;
    private String roleName;
    private String roleDesc;

    public role() {
    }

    public role(Integer id, String roleName, String roleDesc) {
        this.id = id;
        this.roleName = roleName;
        this.roleDesc = roleDesc;
    }

    /**
     * 获取
     * @return id
     */
    public Integer getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取
     * @return roleName
     */
    public String getRoleName() {
        return roleName;
    }

    /**
     * 设置
     * @param roleName
     */
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    /**
     * 获取
     * @return roleDesc
     */
    public String getRoleDesc() {
        return roleDesc;
    }

    /**
     * 设置
     * @param roleDesc
     */
    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }

    public String toString() {
        return "role{id = " + id + ", roleName = " + roleName + ", roleDesc = " + roleDesc + "}";
    }
}

user(用户表):

package org.Emp;


import java.util.Date;
import java.util.List;
public class user {
private Integer id;
private String username;
private String password;
private Date birthday;
    private List<role> role;


    public user() {
    }

    public user(Integer id, String username, String password, Date birthday, List<role> role) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.birthday = birthday;
        this.role = role;
    }

    /**
     * 获取
     * @return id
     */
    public Integer getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * 获取
     * @return username
     */
    public String getUsername() {
        return username;
    }

    /**
     * 设置
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 获取
     * @return password
     */
    public String getPassword() {
        return password;
    }

    /**
     * 设置
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * 获取
     * @return birthday
     */
    public Date getBirthday() {
        return birthday;
    }

    /**
     * 设置
     * @param birthday
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 获取
     * @return role
     */
    public List<role> getRole() {
        return role;
    }

    /**
     * 设置
     * @param role
     */
    public void setRole(List<role> role) {
        this.role = role;
    }

    public String toString() {
        return "user{id = " + id + ", username = " + username + ", password = " + password + ", birthday = " + birthday + ", role = " + role + "}";
    }
}
写Mapper映射(核心):
<?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="org.dao.oneselMapper">
    <resultMap id="duoduoMapper" type="org.Emp.user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>

        <collection property="role" ofType="org.Emp.role">
            <id column="roleid" property="id"></id>
            <result column="roleName" property="roleName"></result>
            <result column="roleDesc" property="roleDesc"></result>
        </collection>
    </resultMap>

    <!--数据库的多对多查询-->
    <select id="duoduoall" resultMap="duoduoMapper">
        select *  from user u,user_role ur,role r where u.id=ur.userid and r.id=ur.roleid
    </select>

</mapper>
接口:

这样我们的两表查询就写完了。

注意:一定要配置核心文件,添加映射文件和数据库和Java互转的方法。


原文链接: https://blog.csdn.net/daibadetianshi/article/details/140698718

标签: #JAVA 991 #数据库 67
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.