第二步:mybatis的xml实现形式,从书写到实现及相关基础知识

在使用mybatisx生成后,初始xml内容如下

在这里插入图片描述

书写sql语句

以banner的代码为例
··· <?xml version="1.0" encoding="UTF-8"?>

<resultMap id="BaseResultMap" type="com.example.springtest.domain.Banner">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="pic" column="pic" jdbcType="VARCHAR"/>
</resultMap>

<sql id="Base_Column_List">
    id,pic
</sql>
<!-- 查询所有的横幅图片 -->
<select id="getAllBanners" resultType="com.example.springtest.domain.Banner">
    SELECT * FROM banner
</select>

<!-- 根据ID查询横幅图片 -->
<select id="getBannerById" parameterType="int" resultType="com.example.springtest.domain.Banner">
    SELECT * FROM banner WHERE id = #{id}
</select>

<!-- 插入新的横幅图片 -->
<insert id="insertBanner" parameterType="com.example.springtest.domain.Banner">
    INSERT INTO banner (pic) VALUES (#{pic})
</insert>

<!-- 根据ID更新横幅图片 -->
<update id="updateBanner" parameterType="com.example.springtest.domain.Banner">
    UPDATE banner SET pic = #{pic} WHERE id = #{id}
</update>

<!-- 根据ID删除横幅图片 -->
<delete id="deleteBannerById" parameterType="int">
    DELETE FROM banner WHERE id = #{id}
</delete>

注意事项:xml相当于是在外面进行实现,mapper里面的接口还是要写方法的声明

在这里插入图片描述

此外,对于basemapper

在 MyBatis-Plus 中,BaseMapper 是一个通用的 Mapper 接口,提供了基础的CRUD操作方法。通过继承 BaseMapper,自定义 Mapper 接口可以直接使用这些通用方法,而无需再显式地编写这些方法的实现。

继承 BaseMapper 的效果

  1. 提供通用的CRUD方法

    • BaseMapper 接口中已经定义了常见的数据库操作方法,例如insertdeleteupdateselectByIdselectList等。这些方法的实现由 MyBatis-Plus 提供,你可以直接使用。
  2. 减少重复代码

    • 通过继承 BaseMapper,无需再为每个实体类单独编写常见的数据库操作方法,从而减少了代码的重复和维护成本。
  3. 类型安全

    • 由于 BaseMapper 是一个泛型接口,你可以在定义自定义 Mapper 接口时指定具体的实体类类型,从而获得类型安全的数据库操作。

BaseMapper 提供的方法

BaseMapper 接口提供了一些常见的数据库操作方法,例如:

  • int insert(T entity);:插入一条记录。
  • int deleteById(Serializable id);:根据ID删除一条记录。
  • int updateById(T entity);:根据ID更新一条记录。
  • T selectById(Serializable id);:根据ID查询一条记录。
  • List<T> selectList(Wrapper<T> queryWrapper);:查询满足条件的所有记录。

示例解释

public interface BannerMapper extends BaseMapper<Banner> {

    List<Banner> getAllBanners();

    Banner getBannerById(int id);

    int insertBanner(Banner banner);

    int updateBanner(Banner banner);

    int deleteBannerById(int id);
}

在这个示例中:

  • BannerMapper 继承了 BaseMapper<Banner>,因此它已经拥有了 BaseMapper 中定义的所有基础操作方法。
  • 仍然可以定义特定于 Banner 实体的自定义方法,例如 getAllBannersgetBannerById 等。这些方法的实现可以在 XML 文件中定义,也可以使用 MyBatis-Plus 提供的其他扩展功能。

结论

  • BaseMapper:是 MyBatis-Plus 提供的一个通用 Mapper 接口,包含了常见的CRUD操作方法。
  • 继承 BaseMapper:使得自定义 Mapper 接口可以直接使用这些通用方法,同时你仍然可以定义和实现特定的自定义方法。

通过继承 BaseMapper,你可以大大简化基础数据库操作的代码,同时保持代码的简洁和可维护性。

标签sql

在代码片段中,可以看到,有一个这样的片段,这个片段的目的是为了进行一个替换效果

<sql id="Base_Column_List">
    id,pic
</sql>

你的 `BannerMapper.xml` 文件看起来基本正确。关于 `<sql>` 元素的使用,这里有一个详细的解释:

`<sql>` 元素是 MyBatis 中的一个便利标签,它用于定义SQL片段。SQL片段可以包含在其他SQL语句中,从而实现代码复用。这在定义常用的列名列表或者复杂的条件时特别有用。

在这个示例中,<sql> 元素定义了一个名为 Base_Column_List 的SQL片段,它包含了banner表的两个列名:idpic。这个SQL片段可以在其他SQL语句中重复使用,避免了多次手动输入列名,减少了出错的可能性。

引用 <sql> 元素

你可以在其他SQL语句中使用 <include> 元素来引用这个SQL片段。例如,在查询所有横幅图片的语句中可以这样使用:

<select id="getAllBanners" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List"/> FROM banner
</select>

这样做的好处是,如果你需要修改表中的列名,只需要修改一次SQL片段,所有引用该片段的地方都会自动更新。

完整示例

以下是结合 <sql> 元素的完整 BannerMapper.xml 文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springtest.mapper.BannerMapper">

    <resultMap id="BaseResultMap" type="com.example.springtest.domain.Banner">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="pic" column="pic" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        id, pic
    </sql>

    <!-- 查询所有的横幅图片 -->
    <select id="getAllBanners" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List"/> FROM banner
    </select>

    <!-- 根据ID查询横幅图片 -->
    <select id="getBannerById" parameterType="int" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List"/> FROM banner WHERE id = #{id}
    </select>

    <!-- 插入新的横幅图片 -->
    <insert id="insertBanner" parameterType="com.example.springtest.domain.Banner">
        INSERT INTO banner (pic) VALUES (#{pic})
    </insert>

    <!-- 根据ID更新横幅图片 -->
    <update id="updateBanner" parameterType="com.example.springtest.domain.Banner">
        UPDATE banner SET pic = #{pic} WHERE id = #{id}
    </update>

    <!-- 根据ID删除横幅图片 -->
    <delete id="deleteBannerById" parameterType="int">
        DELETE FROM banner WHERE id = #{id}
    </delete>
</mapper>

其他注意事项

  • resultMapresultType:已经定义了 BaseResultMap,所以在使用的时候可以直接引用 resultMap="BaseResultMap"。这种方式可以更精细地控制属性映射,特别是在复杂的映射需求时。

  • 使用 <sql> 元素的好处:通过将常用的SQL片段抽取出来,可以大大减少代码的重复,提高可维护性。例如,增加一个新的列时,只需在 <sql> 元素中添加列名即可,所有引用此片段的地方会自动更新。

  • 提到的<sql>元素不仅限于SELECT语句的情况,它实际上可以用来定义任何常用的SQL片段,以便在多个SQL语句中复用。这包括但不限于列名列表、条件、表名等。以下是一些常见的使用场景:

1. 复用列名列表

如之前的例子中看到的,可以用来定义一个列名列表:

<sql id="Base_Column_List">
    id, pic
</sql>

SELECT语句中引用:

<select id="getAllBanners" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List"/> FROM banner
</select>

同样地,它也可以在其他语句中使用,例如INSERTUPDATE语句。

2. 复用条件

可以定义一段常用的条件语句,避免在每个SQL中重复写相同的条件:

<sql id="Base_Conditions">
    WHERE status = 'ACTIVE'
</sql>

<select id="getActiveBanners" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List"/> FROM banner <include refid="Base_Conditions"/>
</select>

3. 复用表名或其他片段

可以用来复用表名或者其他任意的SQL片段,方便进行表名的统一管理和修改:

<sql id="BannerTable">banner</sql>

<select id="getAllBanners" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List"/> FROM <include refid="BannerTable"/>
</select>

<insert id="insertBanner" parameterType="com.example.springtest.domain.Banner">
    INSERT INTO <include refid="BannerTable"/> (pic) VALUES (#{pic})
</insert>

<update id="updateBanner" parameterType="com.example.springtest.domain.Banner">
    UPDATE <include refid="BannerTable"/> SET pic = #{pic} WHERE id = #{id}
</update>

INSERTUPDATE中复用列名列表

假如你有一个比较长的列名列表,你可以定义一个<sql>片段并在INSERTUPDATE语句中复用:

<sql id="Column_List">
    column1, column2, column3, column4
</sql>

<insert id="insertData" parameterType="com.example.springtest.domain.Data">
    INSERT INTO data (<include refid="Column_List"/>) VALUES (#{column1}, #{column2}, #{column3}, #{column4})
</insert>

<update id="updateData" parameterType="com.example.springtest.domain.Data">
    UPDATE data SET
    column1 = #{column1},
    column2 = #{column2},
    column3 = #{column3},
    column4 = #{column4}
    WHERE id = #{id}
</update>

这样,如果有新的列需要添加,只需修改<sql id="Column_List">中的内容即可,减少了修改错误和遗漏的风险。

结论

<sql>元素不仅仅局限于SELECT语句的情况,它是MyBatis提供的一个非常灵活的功能,用于在多个SQL语句中复用任何常用的SQL片段。通过合理使用<sql><include>,你可以大大减少重复代码,简化SQL管理,提高代码的可读性和维护性。

标签resultmap用法

ResultMap 是 MyBatis 框架中一个非常重要的概念,它用于定义数据库查询结果与Java对象属性之间的映射关系。ResultMap 提供了强大的映射功能,能够处理复杂的属性映射,包括别名、复杂对象嵌套、联合主键等。

作用和用途

  1. 定义结果集与对象的映射关系ResultMap 用于将数据库查询结果中的列与Java对象的属性一一对应,从而将查询结果转换为Java对象。

  2. 处理属性名和列名不一致的情况:在实际应用中,数据库列名和Java对象的属性名可能不一致,ResultMap 可以指定如何映射这些属性。

  3. 支持复杂对象映射ResultMap 可以处理复杂类型的属性映射,例如对象中的对象(嵌套对象)、集合类型等。

基本使用

1. 基本结构

ResultMap 通常由一个或多个 <id><result> 元素组成,分别表示主键和普通字段的映射。每个元素都有以下属性:

  • property:Java对象的属性名。
  • column:数据库中的列名。
  • jdbcType:列的数据类型(可选)。
  • javaType:Java类型(可选)。
2. 示例

假设有一个简单的 User 表和对应的 User 类:

CREATE TABLE User (
    userId INT PRIMARY KEY,
    userName VARCHAR(100),
    userEmail VARCHAR(100)
);
public class User {
    private int userId;
    private String userName;
    private String userEmail;

    // Getters and Setters
}

我们可以定义一个 ResultMap 来映射查询结果到 User 对象:

<resultMap id="UserResultMap" type="com.example.User">
    <id property="userId" column="userId" />
    <result property="userName" column="userName" />
    <result property="userEmail" column="userEmail" />
</resultMap>

在这个例子中:

  • id 元素用于映射主键列 userIdUser 类的 userId 属性。
  • result 元素用于映射普通列 userNameuserEmailUser 类的相应属性。

高级用法

1. 嵌套结果映射

当对象中包含另一个对象时,可以使用嵌套的 ResultMap 来处理。例如,假设每个 User 还有一个 Address 对象:

public class Address {
    private String street;
    private String city;
    // Getters and Setters
}

public class User {
    private int userId;
    private String userName;
    private String userEmail;
    private Address address;
    // Getters and Setters
}

可以定义 ResultMap 如下:

<resultMap id="UserResultMap" type="com.example.User">
    <id property="userId" column="userId" />
    <result property="userName" column="userName" />
    <result property="userEmail" column="userEmail" />
    <association property="address" javaType="com.example.Address">
        <result property="street" column="street" />
        <result property="city" column="city" />
    </association>
</resultMap>
2. 集合映射

ResultMap 还支持集合类型的映射,例如 ListSet 等。

<resultMap id="UserResultMap" type="com.example.User">
    <id property="userId" column="userId" />
    <result property="userName" column="userName" />
    <result property="userEmail" column="userEmail" />
    <collection property="roles" ofType="com.example.Role">
        <id property="roleId" column="roleId"/>
        <result property="roleName" column="roleName"/>
    </collection>
</resultMap>

详细解析

ResultMap 元素及其子元素

在 MyBatis 中,ResultMap 用于定义数据库查询结果与 Java 对象属性之间的映射关系。以下是具体的元素和属性:

  1. ResultMap

    • 用于定义结果集的映射关系。
  2. <id>

    • 用于映射主键字段。
    • 属性:
      • property:Java 对象的属性名。
      • column:数据库中的列名。
      • jdbcType(可选):列的数据类型。
      • javaType(可选):Java 类型。
  3. <result>

    • 用于映射普通字段。
    • 属性:
      • property:Java 对象的属性名。
      • column:数据库中的列名。
      • jdbcType(可选):列的数据类型。
      • javaType(可选):Java 类型。
  4. <association>

    • 用于映射复杂类型(嵌套对象)。
    • 属性:
      • property:Java 对象的属性名。
      • javaType:Java 类型。
      • 内部包含 <id><result> 元素。
  5. <collection>

    • 用于映射集合类型(如 List、Set)。
    • 属性:
      • property:Java 对象的属性名。
      • ofType:集合中元素的 Java 类型。
      • 内部包含 <id><result> 元素。

1. jdbcType

jdbcType 用于指定数据库列的 JDBC 类型。JDBC 类型是一个与数据库表列类型相关的标准化类型,用于确保 Java 程序与数据库之间的兼容性。以下是一些常见的 JDBC 类型:

CHAR:用于定长的字符数据。
VARCHAR:用于变长的字符数据。
LONGVARCHAR:用于非常大的变长字符数据。
NUMERIC:用于精确的数字数据。
DECIMAL:用于精确的十进制数据。
BIT:用于单个位的布尔值。
TINYINT:用于非常小的整数。
SMALLINT:用于较小的整数。
INTEGER:用于标准的整数。
BIGINT:用于大的整数。
REAL:用于精度不高的浮点数。
FLOAT:用于双精度浮点数。
DOUBLE:用于双精度浮点数。
BINARY:用于定长的二进制数据。
VARBINARY:用于变长的二进制数据。
LONGVARBINARY:用于非常大的变长二进制数据。
DATE:用于日期。
TIME:用于时间。
TIMESTAMP:用于时间戳。
CLOB:用于字符大型对象。
BLOB:用于二进制大型对象。
BOOLEAN:用于布尔值。

2. javaType

javaType 用于指定 Java 类的完全限定名。它通常在 MyBatis 不能根据属性类型自动推断出类型时使用。以下是一些常见的 javaType 映射:

String:对应于数据库中的 CHAR、VARCHAR 等类型。
Integer:对应于数据库中的 INTEGER、SMALLINT 等类型。
Long:对应于数据库中的 BIGINT 类型。
Boolean:对应于数据库中的 BIT、BOOLEAN 类型。
Byte:对应于数据库中的 TINYINT 类型。
Short:对应于数据库中的 SMALLINT 类型。
Double:对应于数据库中的 DOUBLE 类型。
Float:对应于数据库中的 FLOAT 类型。
BigDecimal:对应于数据库中的 NUMERIC、DECIMAL 类型。
Date:对应于数据库中的 DATE 类型。
Time:对应于数据库中的 TIME 类型。
Timestamp:对应于数据库中的 TIMESTAMP 类型。
byte[]:对应于数据库中的 BINARY、VARBINARY、LONGVARBINARY 类型。
Clob:对应于数据库中的 CLOB 类型。
Blob:对应于数据库中的 BLOB 类型

示例详解

假设我们有以下数据库表和对应的 Java 类:

数据库表
CREATE TABLE User (
    userId INT PRIMARY KEY,
    userName VARCHAR(100),
    userEmail VARCHAR(100)
);
Java 类
public class User {
    private int userId;
    private String userName;
    private String userEmail;

    // Getters and Setters
}

ResultMap 示例

以下是一个简单的 ResultMap 示例,映射 User 表到 User 类:

<resultMap id="UserResultMap" type="com.example.User">
    <id property="userId" column="userId" jdbcType="INTEGER"/>
    <result property="userName" column="userName" jdbcType="VARCHAR"/>
    <result property="userEmail" column="userEmail" jdbcType="VARCHAR"/>
</resultMap>
  • <id> 元素:映射主键字段 userId

    • property="userId":Java 对象的属性 userId
    • column="userId":数据库中的列 userId
    • jdbcType="INTEGER":列的数据类型(可选)。
  • <result> 元素:映射普通字段 userNameuserEmail

    • property="userName":Java 对象的属性 userName
    • column="userName":数据库中的列 userName
    • jdbcType="VARCHAR":列的数据类型(可选)。

使用 ResultMap 的查询语句

以下是使用上述 ResultMap 的查询语句示例:

<select id="getAllUsers" resultMap="UserResultMap">
    SELECT userId, userName, userEmail FROM User
</select>

在这个例子中,resultMap="UserResultMap" 指定了查询结果集与 User 对象之间的映射关系。

总结

  • property:Java 对象的属性名。
  • column:数据库中的列名。
  • <id>:用于映射主键字段。
  • <result>:用于映射普通字段。

通过定义 ResultMap,可以明确地指定数据库查询结果与 Java 对象属性之间的映射关系,使得查询结果能够正确地映射到 Java 对象上。这对于处理复杂的查询结果和对象关系映射非常有用。

进行功能实现

controller

第一步,基本调用


@RestController
@RequestMapping("/banners")
public class BannerController {
    private BannerService bannerService;
    @Autowired
    
    public BannerController(BannerService bannerService){
     this.bannerService=bannerService;
 }
    // 获取所有横幅图片
    @GetMapping
    public List<Banner> getAllBanners() {
        return bannerService.getAllBanners();
    }

    // 根据ID获取横幅图片
    @GetMapping("/{id}")
    public Banner getBannerById(@PathVariable int id) {
        return bannerService.getBannerById(id);
    }

    // 添加新的横幅图片
    @PostMapping
    public int insertBanner(@RequestBody Banner banner) {
        return bannerService.insertBanner(banner);
    }

    // 更新横幅图片
    @PutMapping("/{id}")
    public int updateBanner(@PathVariable int id, @RequestBody Banner banner) {
        banner.setId(id);
        return bannerService.updateBanner(banner);
    }

    // 根据ID删除横幅图片
    @DeleteMapping("/{id}")
    public int deleteBannerById(@PathVariable int id) {
        return bannerService.deleteBannerById(id);
    }
}

第二步 添加文档注解


@Api(tags = "Banner Management", description = "Operations pertaining to banner management")
@RestController
@RequestMapping("/banners")
public class BannerController {

    @Autowired
    private BannerService bannerService;

    @ApiOperation(value = "Get all banners", notes = "Retrieve a list of all banners")
    @GetMapping
    public List<Banner> getAllBanners() {
        return bannerService.getAllBanners();
    }

    @ApiOperation(value = "Get banner by ID", notes = "Retrieve a banner by its ID")
    @GetMapping("/{id}")
    public Banner getBannerById(@ApiParam(value = "ID of the banner to retrieve", required = true) @PathVariable int id) {
        return bannerService.getBannerById(id);
    }

    @ApiOperation(value = "Add a new banner", notes = "Add a new banner to the system")
    @PostMapping
    public int insertBanner(@ApiParam(value = "Banner object to be added", required = true) @RequestBody Banner banner) {
        return bannerService.insertBanner(banner);
    }

    @ApiOperation(value = "Update an existing banner", notes = "Update an existing banner by its ID")
    @PutMapping("/{id}")
    public int updateBanner(@ApiParam(value = "ID of the banner to update", required = true) @PathVariable int id,
                            @ApiParam(value = "Updated banner object", required = true) @RequestBody Banner banner) {
        banner.setId(id);
        return bannerService.updateBanner(banner);
    }

    @ApiOperation(value = "Delete a banner by ID", notes = "Delete a banner from the system by its ID")
    @DeleteMapping("/{id}")
    public int deleteBannerById(@ApiParam(value = "ID of the banner to delete", required = true) @PathVariable int id) {
        return bannerService.deleteBannerById(id);
    }
}

service

在这里插入图片描述

serviceimpl


@Service
public class BannerServiceImpl implements BannerService {

   
    private BannerMapper bannerMapper;
    @Autowired
    public BannerServiceImpl(BannerMapper bannerMapper){
        this.bannerMapper=bannerMapper;
    }
    @Override
    public List<Banner> getAllBanners() {
        return bannerMapper.getAllBanners();
    }

    @Override
    public Banner getBannerById(int id) {
        return bannerMapper.getBannerById(id);
    }

    @Override
    public int insertBanner(Banner banner) {
        return bannerMapper.insertBanner(banner);
    }

    @Override
    public int updateBanner(Banner banner) {
        return bannerMapper.updateBanner(banner);
    }

    @Override
    public int deleteBannerById(int id) {
        return bannerMapper.deleteBannerById(id);
    }
}

注解总结

在Spring框架和MyBatis中,注解是非常重要的工具,用于简化配置和管理Bean的生命周期。以下是你提到的几个主要注解及其相关知识的总结:

1. @Mapper

  • 用途@Mapper 注解用于标识MyBatis的Mapper接口,并将其注册为Spring的Bean。
  • 功能
    • 使MyBatis能够自动生成接口的实现类,并将其交给Spring管理。
    • 配合MyBatis的Mapper扫描器(如@MapperScan),可以自动扫描指定包下的所有Mapper接口。
  • 替代方案
    • 在XML配置文件中配置Mapper扫描路径,或使用@MapperScan注解。
示例
@Mapper
public interface BannerMapper {
    // 方法签名
}

2. @RestController

  • 用途@RestController 注解用于标识Spring MVC的控制器类,适用于RESTful Web服务。
  • 功能
    • 组合了@Controller@ResponseBody,标识该类中的每个方法的返回值都应该直接写入HTTP响应体。
    • 自动将返回的Java对象序列化为JSON或XML并返回给客户端。
  • 适用场景:当你希望编写一个API接口服务时,使用@RestController可以避免手动编写@ResponseBody注解。
示例
@RestController
@RequestMapping("/api")
public class ApiController {
    // 控制器方法
}

3. @RequestMapping

  • 用途@RequestMapping 注解用于映射HTTP请求到Spring MVC的控制器方法。
  • 功能
    • 可以用在类级别和方法级别,指定URL路径和请求方法(GET, POST, PUT, DELETE等)。
    • 配合类级别和方法级别的使用,形成完整的请求路径。
示例
@RestController
@RequestMapping("/api")
public class ApiController {

    @RequestMapping(value = "/data", method = RequestMethod.GET)
    public String getData() {
        return "data";
    }
}
  • 扩展注解@GetMapping, @PostMapping, @PutMapping, @DeleteMapping 等是@RequestMapping的快捷注解,简化了常用的HTTP方法请求的配置。

4. @Service

  • 用途@Service 注解用于标识业务层的组件(服务类),将其注册为Spring的Bean。
  • 功能
    • 表明该类是业务逻辑组件,便于分层架构的识别和管理。
    • 配合Spring的依赖注入功能,自动管理这些Bean的生命周期。
  • 适用场景:在服务层,@Service通常用于实现具体的业务逻辑,与数据访问层(DAO/Mapper)和控制层(Controller)进行交互。
示例
@Service
public class BannerService {
    // 业务逻辑方法
}

5. 无注解的Mapper

在MyBatis中,如果你使用XML配置SQL语句,可以省略@Mapper注解。你需要做的是:

  • 在配置文件中配置Mapper扫描路径,或使用@MapperScan注解来扫描特定包中的Mapper接口。
  • MyBatis会根据XML文件中的配置生成Mapper接口的实现,并将其注册为Spring的Bean。
示例
@MapperScan("com.example.mapper")
public class AppConfig {
    // 其他配置
}

总结

  • @Mapper:用于标识MyBatis的Mapper接口,并将其注册为Spring Bean。可通过@MapperScan扫描指定包下的所有Mapper接口。
  • @RestController:用于标识RESTful Web服务的控制器类,自动序列化返回对象为JSON或XML。
  • @RequestMapping:用于映射HTTP请求到控制器方法,支持GET、POST、PUT、DELETE等请求方式。
  • @Service:用于标识服务层组件,管理业务逻辑。
  • 无注解的Mapper:通过XML配置实现,与MyBatis的XML配置文件结合使用,可以不用显式地为Mapper接口添加注解。

这些注解共同帮助我们在Spring和MyBatis中构建一个清晰分层、易于维护的应用架构。

结果验证(数据库已有数据)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值