Mybatis(SSM框架)

目录

一、核心API

二、全局与映射配置文件

1.全局配置文件

2.映射配置文件

三、事务管理

1. JDBC 事务管理

2. Spring 事务管理

四、Sqlsession

1.SqlSession 的主要功能和用途:

2.如何使用 SqlSession:

五、Mapper动态代理

1.Mapper 动态代理的工作原理:

2.示例:

六、动态SQL

1.  标签

2. , , 和  标签

3. , , 和  标签

4.  标签

七、缓存使用

1. 一级缓存

2. 二级缓存

3.自定义缓存

八、多表关联查询

九、注解开发

1. @Select

2. @Insert

3. @Update

4. @Delete

5. @Results 和 @Result

6. @Param

7. @SelectProvider、@InsertProvider、@UpdateProvider 和 @DeleteProvider


一、核心API

MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通的 Java 对象)为数据库中的记录。

MyBatis 的核心 API 主要包括以下几个部分:

  1. SqlSessionFactoryBuilder

    • 这个类用于构建 SqlSessionFactory。
    • 它通过读取 MyBatis 的配置文件(如 mybatis-config.xml)或者通过编程方式配置,然后构建 SqlSessionFactory 对象。
  2. SqlSessionFactory

    • 这是一个工厂接口,用于创建 SqlSession 对象。
    • SqlSession 是 MyBatis 的核心接口,用于执行 SQL 语句、获取映射器实例和管理事务。
  3. SqlSession

    • SqlSession 提供了执行 SQL 语句、获取映射器实例和管理事务的方法。
    • 它代表了一个和数据库交互的会话,完成一次数据库操作后,通常需要关闭 SqlSession 来释放资源。
  4. Mapper

    • Mapper 接口是 MyBatis 的另一个核心组件,它对应于 SQL 映射文件(如 UserMapper.xml)。
    • 通过 Mapper 接口,我们可以直接调用 SQL 语句,而无需编写 JDBC 代码。
    • MyBatis 通过动态代理技术,为 Mapper 接口生成实现类,实现类会调用相应的 SQL 语句。
  5. RowBounds 和 ResultMap

    • RowBounds 用于设置查询结果的分页信息。
    • ResultMap 用于定义 SQL 查询结果的映射规则,它可以将查询结果映射到 Java 对象中。

这些核心 API 共同构成了 MyBatis 的基础架构,使得我们可以方便地执行 SQL 语句、管理数据库连接和事务,并将查询结果映射到 Java 对象中。通过合理地使用这些 API,我们可以编写出高效、易维护的数据库访问代码。

二、全局与映射配置文件

MyBatis 中的全局配置文件和映射配置文件是 MyBatis 框架的重要组成部分,它们共同定义了 MyBatis 的运行环境和 SQL 映射规则。

1.全局配置文件

全局配置文件通常命名为 mybatis-config.xml,它包含了 MyBatis 的核心配置信息。这个文件主要用于配置 MyBatis 的运行环境,如数据源、事务管理、别名、类型处理器、插件等。

以下是一个简单的全局配置文件的示例:

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
        "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
    <!-- 配置环境 -->  
    <environments default="development">  
        <environment id="development">  
            <!-- 配置事务管理器 -->  
            <transactionManager type="JDBC"/>  
            <!-- 配置数据源 -->  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.jdbc.Driver"/>  
                <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>  
                <property name="username" value="root"/>  
                <property name="password" value="password"/>  
            </dataSource>  
        </environment>  
    </environments>  
  
    <!-- 配置类型别名 -->  
    <typeAliases>  
        <typeAlias alias="User" type="com.example.User"/>  
    </typeAliases>  
  
    <!-- 配置插件 -->  
    <plugins>  
        <!-- 插件配置 -->  
    </plugins>  
  
    <!-- 配置映射文件 -->  
    <mappers>  
        <mapper resource="com/example/UserMapper.xml"/>  
    </mappers>  
</configuration>

在上面的示例中,<environments> 标签用于配置数据库环境,<typeAliases> 用于配置类型别名,<mappers> 用于配置映射文件的位置。

2.映射配置文件

映射配置文件(通常命名为 Mapper.xml)用于定义 SQL 语句、输入参数类型和输出结果映射规则。这些文件通常与 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="com.example.UserMapper">  
  
    <!-- 插入用户 -->  
    <insert id="insertUser" parameterType="com.example.User">  
        INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})  
    </insert>  
  
    <!-- 查询用户 -->  
    <select id="findUserById" parameterType="int" resultType="com.example.User">  
        SELECT * FROM user WHERE id = #{id}  
    </select>  
  
    <!-- 更新用户 -->  
    <update id="updateUser" parameterType="com.example.User">  
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}  
    </update>  
  
    <!-- 删除用户 -->  
    <delete id="deleteUser" parameterType="int">  
        DELETE FROM user WHERE id = #{id}  
    </delete>  
  
</mapper>

在上面的示例中,<mapper> 标签的 namespace 属性需要与对应的 Mapper 接口的全限定名一致。<insert><select><update> 和 <delete> 标签分别用于定义插入、查询、更新和删除操作的 SQL 语句。parameterType 属性指定输入参数的类型,resultType 或 resultMap 属性指定输出结果的映射规则。

全局配置文件和映射配置文件共同构成了 MyBatis 的核心配置,它们一起定义了 MyBatis 如何与数据库进行交互,以及如何映射查询结果到 Java 对象中。

三、事务管理

MyBatis 的事务管理是其核心功能之一,它允许用户执行数据库操作时能够在一个事务的上下文中进行,从而确保数据的一致性和完整性。MyBatis 支持两种类型的事务管理:一种是使用 JDBC 的事务管理,另一种是与 Spring 集成,利用 Spring 的事务管理功能。

1. JDBC 事务管理

在 MyBatis 的全局配置文件中,你可以指定使用 JDBC 的事务管理器。以下是如何配置的示例:

<configuration>  
    <!-- ... 其他配置 ... -->  
  
    <environments default="development">  
        <environment id="development">  
            <!-- 使用 JDBC 的事务管理 -->  
            <transactionManager type="JDBC"/>  
            <!-- 配置数据源 -->  
            <dataSource type="POOLED">  
                <!-- ... 数据源配置 ... -->  
            </dataSource>  
        </environment>  
    </environments>  
  
    <!-- ... 映射器配置 ... -->  
</configuration>

在 JDBC 事务管理模式下,MyBatis 会使用 Java 的 java.sql.Connection 对象来管理事务。当你打开一个 SqlSession 时,MyBatis 会从数据源中获取一个 Connection 对象,并在执行 SQL 语句时使用这个 Connection。如果你调用 SqlSession 的 commit() 方法,MyBatis 会提交事务;如果你调用 rollback() 方法,则会回滚事务。当 SqlSession 关闭时,如果它关联的事务没有被显式提交或回滚,MyBatis 会根据配置(默认为自动提交)来决定是否提交事务。

2. Spring 事务管理

当 MyBatis 与 Spring 集成时,通常使用 Spring 的声明式事务管理来管理 MyBatis 的事务。Spring 提供了强大的事务管理功能,包括事务的传播行为、隔离级别、只读设置等。

要在 Spring 中配置 MyBatis 的事务管理,你需要在 Spring 的配置文件中定义事务管理器,并将其与数据源和 MyBatis 的 SqlSessionFactory 关联起来。通常使用 DataSourceTransactionManager 作为事务管理器。

以下是一个 Spring 配置文件的示例,展示了如何配置 MyBatis 与 Spring 的事务管理集成:

<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:tx="http://www.springframework.org/schema/tx"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd  
       http://www.springframework.org/schema/tx  
       http://www.springframework.org/schema/tx/spring-tx.xsd">  
  
    <!-- 配置数据源 -->  
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
        <!-- ... 数据源属性配置 ... -->  
    </bean>  
  
    <!-- 配置 SqlSessionFactory -->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource"/>  
        <!-- ... 其他配置 ... -->  
    </bean>  
  
    <!-- 配置事务管理器 -->  
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource"/>  
    </bean>  
  
    <!-- 启用事务注解 -->  
    <tx:annotation-driven transaction-manager="transactionManager"/>  
  
    <!-- 配置 Mapper -->  
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
        <property name="mapperInterface" value="com.example.UserMapper"/>  
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>  
    </bean>  
  
    <!-- ... 其他 Bean 配置 ... -->  
  
</beans>

在上面的配置中,<tx:annotation-driven> 标签启用了 Spring 的基于注解的事务管理。你可以在服务层的方法上使用 @Transactional 注解来声明该方法需要在事务的上下文中执行。Spring 会根据该注解来创建、提交或回滚事务。

例如:

@Service  
public class UserService {  
  
    @Autowired  
    private UserMapper userMapper;  
  
    @Transactional  
    public void addUser(User user) {  
        userMapper.insertUser(user);  
        // 其他数据库操作...  
    }  
}

在上面的 UserService 类中,addUser 方法使用了 @Transactional 注解,这意味着当该方法被调用时,Spring 会自动为它创建一个事务,并在方法执行完毕后提交事务(如果方法正常结束)或回滚事务(如果方法抛出异常)。

四、Sqlsession

在 MyBatis 中,SqlSession 是应用程序与数据库之间交互的核心接口。它代表了一个与数据库会话的上下文,提供了执行 SQL 语句、获取映射器(Mapper)以及管理事务的方法。

1.SqlSession 的主要功能和用途:

  1. 执行 SQL 语句SqlSession 提供了执行 SQL 语句的方法,如 selectOne()selectList()insert()update(), 和 delete()。这些方法允许你执行各种数据库操作。

  2. 获取 MapperSqlSession 可以用来获取 Mapper 接口的实例,这些 Mapper 接口通常用于定义与数据库表对应的 CRUD 操作。通过 Mapper,你可以以面向对象的方式执行 SQL 语句,而不是直接编写 SQL 字符串。

  3. 管理事务SqlSession 提供了管理事务的方法,如 commit() 和 rollback()。当你使用 MyBatis 的 JDBC 事务管理器时,你可以通过 SqlSession 来控制事务的边界。

  4. 缓存SqlSession 还可以用于缓存查询结果,从而提高性能。

  5. 关闭会话:完成数据库操作后,应该关闭 SqlSession 以释放资源。

2.如何使用 SqlSession:

通常,你不会直接创建 SqlSession 实例。相反,你会通过 SqlSessionFactory 来获取 SqlSessionSqlSessionFactory 是 MyBatis 的核心,它负责创建 SqlSession 实例。

下面是一个简单的示例,展示了如何使用 SqlSession

// 获取 SqlSessionFactory(通常通过 MyBatis 的配置文件或注解配置)  
SqlSessionFactory sqlSessionFactory = ...;  
  
try (SqlSession session = sqlSessionFactory.openSession()) {  
    // 获取 Mapper 接口的实例  
    UserMapper userMapper = session.getMapper(UserMapper.class);  
      
    // 使用 Mapper 执行查询  
    User user = userMapper.selectUserById(1);  
      
    // 提交事务(如果使用的是非自动提交模式)  
    session.commit();  
}

在上面的代码中,我们首先通过 SqlSessionFactory 打开一个 SqlSession。然后,我们使用 session.getMapper() 方法获取 UserMapper 的实例,并通过该 Mapper 执行查询操作。最后,我们提交事务并关闭 SqlSession

注意:在实际应用中,通常不会在每个数据库操作中都手动打开和关闭 SqlSession。相反,你可能会使用 Spring 框架来管理 SqlSession 的生命周期,这样可以在方法执行完毕后自动关闭 SqlSession。这通过 Spring 的声明式事务管理和 MyBatis 的 Spring 集成实现。

五、Mapper动态代理

在 MyBatis 中,Mapper 动态代理是 MyBatis 框架提供的一种方便的方式来自动创建 Mapper 接口的代理实现类,从而允许你以面向接口编程的方式与数据库进行交互。

当你定义了一个 Mapper 接口,并且配置了相应的 SQL 映射文件(XML)后,MyBatis 会在运行时为你生成这个接口的动态代理实现类。这样,你就可以直接注入这个接口到你的服务层或其他组件中,并通过它来执行 SQL 语句,而无需关心底层的实现细节。

1.Mapper 动态代理的工作原理:

  1. 定义 Mapper 接口:首先,你需要定义一个 Mapper 接口,这个接口中声明了与数据库操作相关的方法。

  2. 编写 SQL 映射文件:接着,你需要编写与 Mapper 接口对应的 SQL 映射文件(通常是 XML 文件),在这个文件中定义具体的 SQL 语句以及参数和结果的映射关系。

  3. 配置 MyBatis:在 MyBatis 的配置文件中,你需要告诉 MyBatis 哪些接口需要创建动态代理实现类,以及这些接口对应的 SQL 映射文件的位置。

  4. MyBatis 创建动态代理:当 MyBatis 初始化时,它会扫描配置文件中指定的 Mapper 接口,并为每个接口创建一个动态代理实现类。这个代理实现类会拦截接口方法的调用,并根据 SQL 映射文件中的配置来执行相应的 SQL 语句。

  5. 使用 Mapper 接口:在你的应用程序中,你可以直接注入 Mapper 接口的实例,并通过这个接口来执行数据库操作。由于动态代理的存在,你实际上是在调用代理实现类的方法,而这个代理实现类会负责执行相应的 SQL 语句并返回结果。

2.示例:

假设你有一个 UserMapper 接口,它声明了一个 selectUserById 方法来根据 ID 查询用户信息。

public interface UserMapper {  
    User selectUserById(int id);  
}

对应的 SQL 映射文件 UserMapper.xml 如下:

<mapper namespace="com.example.mapper.UserMapper">  
    <select id="selectUserById" resultType="com.example.model.User">  
        SELECT * FROM user WHERE id = #{id}  
    </select>  
</mapper>

在 MyBatis 的配置文件中,你需要注册这个 Mapper 接口:

<configuration>  
    <!-- ... 其他配置 ... -->  
    <mappers>  
        <mapper resource="com/example/mapper/UserMapper.xml"/>  
    </mappers>  
</configuration>

然后,在你的服务层或其他组件中,你可以这样使用 UserMapper 接口:

@Service  
public class UserService {  
    private final UserMapper userMapper;  
  
    @Autowired  
    public UserService(UserMapper userMapper) {  
        this.userMapper = userMapper; // MyBatis 会自动注入动态代理实现类的实例  
    }  
  
    public User getUserById(int id) {  
        return userMapper.selectUserById(id); // 调用动态代理实现类的方法执行 SQL 语句  
    }  
}

这样,你就可以通过 UserMapper 接口以面向接口编程的方式与数据库进行交互,而无需关心底层的 SQL 语句执行和结果映射等细节。MyBatis 的 Mapper 动态代理功能极大地简化了数据库操作的编码工作,提高了开发效率。

六、动态SQL

在 MyBatis 中,动态 SQL 是一种非常强大的功能,它允许你根据不同的条件生成不同的 SQL 语句。这使得编写复杂和灵活的 SQL 查询变得更加容易和直观。

MyBatis 提供了几种标签来帮助你构建动态 SQL,包括 <if><choose><when><otherwise><trim><where><set> 和 <foreach> 等。

下面是一些使用动态 SQL 的常见场景和示例:

1. <if> 标签

<if> 标签用于根据条件包含或排除某些 SQL 片段。

<select id="findUsersByCondition" resultType="User">  
    SELECT * FROM user  
    WHERE 1=1  
    <if test="name != null">  
        AND name = #{name}  
    </if>  
    <if test="age != null">  
        AND age = #{age}  
    </if>  
</select>

在这个例子中,如果 name 不为 null,则包含 name = #{name} 这个条件;如果 age 不为 null,则包含 age = #{age} 这个条件。

2. <choose><when>, 和 <otherwise> 标签

这些标签类似于 Java 中的 switch-case-default 语句,用于根据多个条件生成不同的 SQL 片段。

<select id="findUsersByType" resultType="User">  
    SELECT * FROM user  
    <choose>  
        <when test="type == 'admin'">  
            WHERE role = 'ADMIN'  
        </when>  
        <when test="type == 'user'">  
            WHERE role = 'USER'  
        </when>  
        <otherwise>  
            WHERE status = 'ACTIVE'  
        </otherwise>  
    </choose>  
</select>

3. <trim><where>, 和 <set> 标签

这些标签用于处理 SQL 语句中的前缀和后缀,以及动态地添加 WHERE 和 SET 子句。

<update id="updateUser" parameterType="User">  
    UPDATE user  
    <set>  
        <if test="name != null">  
            name = #{name},  
        </if>  
        <if test="age != null">  
            age = #{age},  
        </if>  
    </set>  
    WHERE id = #{id}  
</update>

在这个更新操作中,<set> 标签会自动处理逗号和 WHERE 子句的前缀,避免在生成的 SQL 语句中出现多余的逗号或前缀。

4. <foreach> 标签

<foreach> 标签用于遍历集合,通常用于构建 IN 子句或批量插入/更新操作。

<select id="findUsersByIds" resultType="User">  
    SELECT * FROM user  
    WHERE id IN  
    <foreach item="id" index="index" collection="ids" open="(" separator="," close=")">  
        #{id}  
    </foreach>  
</select>

在这个例子中,ids 是一个包含多个 ID 的集合,<foreach> 标签会遍历这个集合,并生成一个由逗号分隔的 ID 列表,用于构建 IN 子句。

动态 SQL 是 MyBatis 中非常强大的一个特性,它允许你根据业务需求构建灵活多变的 SQL 语句,而无需在 Java 代码中拼接字符串或编写大量的条件逻辑。通过使用 MyBatis 提供的动态 SQL 标签,你可以编写更加清晰、可维护和易读的代码。

七、缓存使用

MyBatis 提供了两种类型的缓存:一级缓存(SqlSession 级别的缓存)和二级缓存(Mapper 级别的缓存)。这两种缓存都可以帮助提高数据库查询的性能,减少不必要的数据库访问。

1. 一级缓存

一级缓存是默认开启的,它基于 SqlSession,只要 SqlSession 没有关闭,一级缓存就有效。对于同一个 SqlSession 执行的相同的 SQL 语句,MyBatis 会从一级缓存中直接获取结果,而不会去数据库查询。

一级缓存的特点

  • 生命周期与 SqlSession 一致。
  • 缓存的数据范围是针对同一个 SqlSession 的所有查询操作。
  • 当执行增删改操作时,一级缓存会被清空。

2. 二级缓存

二级缓存是 Mapper 级别的缓存,多个 SqlSession 可以共享同一个二级缓存。当执行相同的 SQL 语句时,如果二级缓存中有数据,MyBatis 就会从二级缓存中获取结果,而不是去数据库查询。

启用二级缓存

  • 在 MyBatis 的全局配置文件中启用二级缓存(通常默认已启用)。
  • 在需要使用二级缓存的 Mapper XML 文件中添加 <cache/> 标签。
  • 也可以为 <cache/> 标签配置属性,以定制缓存的行为,例如设置缓存的过期时间、大小等。

二级缓存的特点

  • 生命周期与 Mapper 映射文件一致。
  • 缓存的数据范围是跨 SqlSession 的,不同的 SqlSession 可以共享。
  • 当执行增删改操作时,MyBatis 默认会清空该 Mapper 对应的二级缓存,但可以通过配置来改变这一行为。

注意事项

  • 当使用二级缓存时,需要确保查询的 SQL 语句和参数完全一致,否则 MyBatis 会认为它们是不同的查询,从而无法从缓存中获取结果。
  • 由于二级缓存是跨 SqlSession 的,因此在使用时需要注意并发问题,避免脏读、脏写等问题的发生。
  • 不是所有的查询都适合使用缓存,特别是对于那些数据变化频繁或者对实时性要求很高的查询,使用缓存可能会带来问题。因此,在使用缓存时需要根据实际情况进行判断和选择。

3.自定义缓存

除了使用 MyBatis 提供的默认缓存实现外,你还可以自定义缓存实现。这通常涉及实现 MyBatis 提供的接口,如 org.apache.ibatis.cache.Cache,并在 Mapper XML 文件中通过 <cache-ref/> 或 <cache type="你的自定义缓存类型"/> 来引用或使用它。

自定义缓存可以让你根据业务需求实现更复杂的缓存逻辑,例如集成第三方缓存库(如 Redis、Memcached 等)。但请注意,自定义缓存实现需要更多的工作,并可能引入额外的复杂性和性能开销。因此,在决定使用自定义缓存之前,请仔细评估其必要性和潜在影响。

八、多表关联查询

在 MyBatis 中,多表关联查询通常通过编写复杂的 SQL 语句来实现,并结合 MyBatis 的映射文件将查询结果映射到相应的 Java 对象上。MyBatis 支持多种关联查询方式,包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)等。

下面是一个使用 MyBatis 进行多表关联查询的示例:

假设我们有两个表,一个是用户表 user,另一个是订单表 order,它们通过用户ID进行关联。

user 表

CREATE TABLE user (  
    id INT PRIMARY KEY,  
    name VARCHAR(50),  
    email VARCHAR(50)  
);

order 表

CREATE TABLE order (  
    order_id INT PRIMARY KEY,  
    user_id INT,  
    order_date DATE,  
    amount DECIMAL(10, 2),  
    FOREIGN KEY (user_id) REFERENCES user(id)  
);

现在,我们想要查询某个用户的所有订单信息,包括订单详情和用户信息。

Mapper XML 文件

首先,我们需要在 Mapper XML 文件中编写一个 SQL 查询语句,并使用 <resultMap> 标签定义结果映射。

<mapper namespace="com.example.mapper.OrderMapper">  
    <!-- 定义结果映射 -->  
    <resultMap id="orderUserResultMap" type="OrderUser">  
        <id property="orderId" column="order_id"/>  
        <result property="orderDate" column="order_date"/>  
        <result property="amount" column="amount"/>  
        <association property="user" javaType="User">  
            <id property="id" column="id"/>  
            <result property="name" column="name"/>  
            <result property="email" column="email"/>  
        </association>  
    </resultMap>  
      
    <!-- 查询用户订单 -->  
    <select id="findOrdersByUserId" resultMap="orderUserResultMap">  
        SELECT o.order_id, o.order_date, o.amount, u.id, u.name, u.email  
        FROM order o  
        INNER JOIN user u ON o.user_id = u.id  
        WHERE u.id = #{userId}  
    </select>  
</mapper>

在这个示例中,我们定义了一个名为 orderUserResultMap 的结果映射,它将查询结果映射到 OrderUser 类型的对象上。OrderUser 是一个包含 Order 和 User 属性的自定义 Java 类,用于存储订单和用户信息。

在 <association> 标签中,我们定义了用户信息的映射关系。property 属性指定了 OrderUser 类中的用户属性名,javaType 属性指定了用户对象的类型。然后,我们使用 <id> 和 <result> 标签将数据库列映射到用户对象的属性上。

在 <select> 标签中,我们编写了一个 SQL 查询语句,使用 INNER JOIN 将 order 表和 user 表连接起来,并根据用户ID进行过滤。查询结果将使用 orderUserResultMap 进行映射。

Java 代码

在 Java 代码中,我们可以通过注入 OrderMapper 接口的实例来调用 findOrdersByUserId 方法进行查询。

@Autowired  
private OrderMapper orderMapper;  
  
public List<OrderUser> findOrdersByUserId(int userId) {  
    return orderMapper.findOrdersByUserId(userId);  
}

这样,当我们调用 findOrdersByUserId 方法并传入用户ID时,MyBatis 会执行相应的 SQL 查询语句,并将结果映射到 OrderUser 类型的对象列表上。我们就可以在 Java 代码中处理这些对象了。

这只是一个简单的示例,实际的多表关联查询可能会涉及更复杂的 SQL 语句和结果映射。你可以根据具体的业务需求和数据表结构来编写相应的 MyBatis 代码。

九、注解开发

MyBatis 支持基于注解的开发方式,允许开发者直接在接口方法上使用注解来替代 XML 映射文件。使用注解可以减少 XML 配置的复杂性,并使代码更加简洁。下面是一些常用的 MyBatis 注解:

1. @Select

用于执行查询操作。

@Select("SELECT * FROM user WHERE id = #{id}")  
User selectUserById(@Param("id") int id);

2. @Insert

用于执行插入操作。

@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")  
int insertUser(User user);

3. @Update

用于执行更新操作。

@Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")  
int updateUser(User user);

4. @Delete

用于执行删除操作。

@Delete("DELETE FROM user WHERE id = #{id}")  
int deleteUser(@Param("id") int id);

5. @Results 和 @Result

用于处理复杂的结果映射,特别是在查询返回多个字段或需要映射到自定义对象时。

@Select("SELECT id, name, email FROM user")  
@Results({  
    @Result(id = true, column = "id", property = "id"),  
    @Result(column = "name", property = "name"),  
    @Result(column = "email", property = "email")  
})  
List<User> selectAllUsers();

6. @Param

当方法参数不止一个,或者需要指定 SQL 语句中参数的名称时,使用 @Param 注解。

@Select("SELECT * FROM user WHERE name = #{name} AND age = #{age}")  
User findUserByNameAndAge(@Param("name") String name, @Param("age") int age);

7. @SelectProvider@InsertProvider@UpdateProvider 和 @DeleteProvider

这些注解允许你使用类和方法来动态地构建 SQL 语句。

@SelectProvider(type = UserSqlBuilder.class, method = "buildSelectUserSql")  
User selectUserDynamically(Map<String, Object> params);

在 UserSqlBuilder 类中,你需要实现一个名为 buildSelectUserSql 的方法,该方法将返回动态构建的 SQL 字符串。

注意事项

  • 使用注解时,MyBatis 会自动扫描并注册标注了 @Mapper 或 @Repository 的接口。
  • 注解方式虽然简洁,但不适合处理复杂 SQL 或需要大量配置的场景。对于这类情况,XML 映射文件通常更为灵活和强大。
  • 注解和 XML 映射文件可以混合使用,你可以根据项目的具体需求选择最适合的方式。

最后,要确保你的 MyBatis 配置正确设置了注解扫描的路径,这样 MyBatis 才能找到并使用这些注解。这通常通过在 MyBatis 的配置文件中设置 mapperLocations 或使用 Spring Boot 的自动配置来完成。


 文章制作不易,如果有帮助的话,还希望能给个点赞关注支持一下,谢谢大家!🙏🙏🙏

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

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

相关文章

LPA算法简介

1. 背景 标签传播算法(Label Propagation Algorithm)是一种基于图的半监督学习方法&#xff0c;其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。 2. 算法流程 1. 为每个节点随机的指定一个自己特有的标签&#xff1b; 2. 逐轮刷新所有节点的标签&#xff0…

设计模式(四):单例模式

设计模式&#xff08;四&#xff09;&#xff1a;单例模式 1. 单例模式的介绍2. 单例模式的类图3. 单例模式的实现3.1 懒汉式&#xff08;线程不安全&#xff09;3.2 懒汉式&#xff08;线程安全&#xff09;3.3 饿汉式3.4 静态内部类3.5 枚举 1. 单例模式的介绍 单例模式&…

SQL-DML数据操纵语言(Oracle)

文章目录 DML数据操纵语言常见的字段属性字符型字段属性char(n)varchar2(n)/varchar(n) 数值型字段属性number([p],[s]int 日期型字段属性DATEtimestamp 如何查看字段属性增加数据INSERT快捷插入 删除数据DELETE修改数据UPDATE DML数据操纵语言 定义 是针对数据做处理&#xf…

信息系统项目管理49个过程、查看工具与技术!最好用的工具

高项【浏览器打开&#xff0c;用于默写49个过程、查看工具与技术】.html 下载html后建议使用Edge、chrome或者火狐浏览器打开   查看工具与技术&#xff1a;鼠标左键单击管理活动&#xff1b;关闭工具与技术&#xff1a;点击工具与技术外面退回 1、点击【开始默写】按钮&…

在国企上班,有必要考软考吗?

现在很多在私企工作的朋友都会参加软考&#xff0c;国企员工更是如此。软考可以以考代评&#xff0c;传统的职称获取需要两步&#xff0c;第一步是评审&#xff0c;第二步是单位聘任。而通过软考取得证书就可以省去第一步&#xff0c;只需获得单位聘任即可享受相应的职称福利。…

Ventus(承影):基于RISC V的开源GPGPU

Ventus&#xff08;承影&#xff09;&#xff1a;基于RVV的开源GPGPU 清华大学集成电路学院dsp-lab的承影RVV GPGPU设计文档。 整体目标 提供一个开源的基于RVV的GPGPU实现方案&#xff0c;并给出软件映射方案、指令集&#xff08;支持的指令及特性、添加的自定义指令&#xf…

路由引入,路由过滤,路由策略实验

1&#xff0c;配置IP地址 R1&#xff1a; [R1]dis ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 100.1.1.1/24 up up LoopBack0 …

OpenHarmony实战开发-如何实现tabContent内容可以在tabBar上显示并且tabBar可以响应滑动事件的功能。

介绍 本示例实现了tabContent内容可以在tabBar上显示并且tabBar可以响应滑动事件的功能。 效果图预览 使用说明 1.点击播放按钮进行视频播放&#xff0c;按住进度条按钮和进度条下方区域可以拖动进度条&#xff0c;更改视频播放进度。 实现思路 原生的Tabs组件&#xff0c…

IP地址SSL证书的申请流程——五步轻松实现https

没有域名或者不方便提供域名&#xff0c;只有IP地址也可以申请SSL证书&#xff0c;为IP地址申请ssl证书是需要开放443或者80端口&#xff0c;一般开放几分钟用来验证IP管理权即可&#xff01; 具体流程如下 IP地址证书 ssl证书点击这里直接申请 https://www.joyssl.com/certif…

鸿蒙应用开发之Web组件6

前面学习怎么样设置Web界面显示不同的颜色配置,这种适合不同时间来设置,比如白天要亮一些,晚上要暗一些。现在来学习使用Web组件选择文件文件列表的功能。 这个功能主要就是使用在Web打开一个页面,然后有上传文件的按钮,比如下面的界面: 当用户点击选择文件按钮时,就会…

nvidia-smi 输出内容详解

一、nvidia-smi 介绍 nvidia-smi&#xff08;NVIDIA System Management Interface&#xff09;是一种命令行实用程序&#xff0c;主要用于监控和管理NVIDIA GPU&#xff08;图形处理器&#xff09;的状态和性能。它提供了一个简单而强大的方式来获取有关GPU的实时信息&#xf…

javaWeb项目-财务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Springboot框架 …

管理集群工具之LVS

管理集群工具之LVS 集群概念 将很多机器组织在一起&#xff0c;作为一个整体对外提供服务集群在扩展性、性能方面都可以做到很灵活集群分类 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing …

面向对象练习坦克大兵游戏

游戏玩家&#xff08;名称&#xff0c;生命值&#xff0c;等级&#xff09;&#xff0c;坦克&#xff0c;大兵类&#xff0c;玩家之间可以相互攻击&#xff0c;大兵拥有武器&#xff0c;用枪弹和反坦克炮弹&#xff0c;造成攻击不同&#xff0c;坦克攻击值固定&#xff0c;请设…

Java 源码-多级时间轮TimingWheel

多级时间轮TimingWheel 一、时间轮是什么 类似现实中的钟表&#xff0c;由多个环形数组组成&#xff0c;每个环形数组包含20个时间单位&#xff0c;表示一个时间维度&#xff08;一轮&#xff09;&#xff0c;如&#xff1a;第一层时间轮&#xff0c;数组中的每个元素代表1m…

梯度,hesse阵与Jacobi矩阵

分清楚三个量的含义和计算方法。 梯度 表征的是一个列向量&#xff0c;是相对于某个方向而言的&#xff0c;但是某个方向上可能有多个变量&#xff0c;所以梯度不是简单的直接求偏导&#xff0c;并且说了&#xff0c;它是一个列向量&#xff0c;所以&#xff0c; 我们设 f : …

海外仓系统能做什么?提升仓库盈利能力,不再低效经营!

海外仓管理系统和机械设备不同&#xff0c;这句话看似有点矛盾&#xff0c;但是还真就是这么回事儿。 当机械设备出现故障的时候&#xff0c;你会明确的知道他无法运转&#xff0c;已经影响到你的生产效率了。但是海外仓系统不会&#xff0c;它看似还可以运转&#xff0c;但是…

【行为型模式】备忘录模式

一、备忘录模式概述 备忘录模式定义&#xff1a;又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern)&#xff0c;是指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;这样我们就可以在需要的时候将该对…

2024三大常用自动化框架对比【建议收藏】

上次发布过性能测试工具的对比后&#xff0c;有小伙伴后台留言&#xff0c;想了解一下自动化测试框架的对比&#xff0c;尤其是RobotFramework、pytest和unitest之间的优劣势情况。 这不我们今天就来分析一下他们之间的区别和各自的优缺点。 1、RobotFramework 优点&#xff1…

SMT工艺上出现焊锡球,将有什么影响?

在表面贴装技术&#xff08;SMT&#xff09;加工过程中&#xff0c;可能会出现焊锡球形成的问题&#xff0c;焊锡球的存在不仅影响产品的外观质量&#xff0c;还可能导致电路短路&#xff0c;从而影响产品性能和可靠性&#xff0c;所以必须提前了解焊锡球的形成原因&#xff0c…
最新文章