MyBatis学习:从入门到实践指南
2024/10/11 23:32:38
本文主要是介绍MyBatis学习:从入门到实践指南,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文将详细介绍MyBatis的学习内容,包括环境搭建、核心概念、基本操作和高级特性。环境搭建部分将涵盖从工具和库准备到具体步骤的详细介绍。核心概念将深入讲解SqlSession和SqlSessionFactory的使用方法,并通过代码示例展示XML配置文件的解析。基本操作部分将通过代码示例详细介绍CRUD操作、设置和获取结果集,以及处理一对多和多对多关系。高级特性部分将提供使用注解简化开发、一级和二级缓存机制,以及分页查询和延迟加载的详细内容及代码示例。实战案例部分将通过一个简单的用户管理系统项目,从数据库设计、表创建到业务逻辑实现与测试的详细步骤。
MyBatis简介MyBatis是什么
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,使得开发者可以使用简单的 API 访问数据库,同时提供了更强大的特性,如:动态 SQL、延迟加载、映射器接口等。MyBatis 可以通过配置文件来配置 SQL 映射,也可以通过注解来简化配置,使得开发者可以将更多的精力放在业务逻辑的实现上。
MyBatis的优势和应用场景
MyBatis 有以下几个明显的优势:
- 强大的动态 SQL 支持:MyBatis 提供了动态 SQL 的支持,能够根据不同的条件动态生成 SQL 语句。
- 灵活的配置与映射:MyBatis 的配置文件和映射文件可以独立于 Java 代码,使得 Java 代码与 SQL 代码分离,易于维护。
- 支持存储过程:MyBatis 支持存储过程的调用。
- 易于集成:MyBatis 可以很容易地与其他框架集成使用,如 Spring 框架。
- 性能优良:MyBatis 在查询速度和缓存机制方面具有优势,可以显著提高应用的性能。
MyBatis 适用于以下应用场景:
- 中大型项目:需要与数据库频繁交互的中大型项目,尤其是在数据操作频繁的场景中,MyBatis 的性能优势尤为明显。
- 复杂查询:需要进行复杂查询的场景,如联表查询、分页查询等,MyBatis 的动态 SQL 支持可以有效地简化这些操作。
- SQL 优化:在 SQL 优化方面,MyBatis 提供了丰富的配置选项,使得开发人员可以更好地控制 SQL 的生成。
- 灵活的扩展:需要灵活扩展的场景,MyBatis 的配置文件和映射文件可以独立于 Java 代码,使得 Java 代码与 SQL 代码分离,易于维护。
MyBatis与Hibernate的区别
MyBatis 和 Hibernate 都是流行的持久层框架,但是它们的设计和使用方式存在一些明显的区别:
特性 | MyBatis | Hibernate |
---|---|---|
SQL 映射 | 手动编写 SQL 语句和映射 XML 文件 | 自动生成 SQL 语句,不需要编写 SQL 映射,只需要定义 Java 对象的映射关系 |
SQL 执行 | 提供了原生的 SQL 执行,支持动态 SQL 和存储过程调用 | 提供了 ORM(对象关系映射),自动将 Java 对象映射为 SQL 语句,并且自动生成 SQL 语句 |
性能 | 性能较高,特别是在查询速度和缓存机制方面有优势 | 性能较低,特别是在查询速度方面不及 MyBatis,但是可以通过二级缓存优化性能 |
配置与维护 | 配置文件和映射文件可以独立于 Java 代码,易于维护 | 需要配置 Hibernate 配置文件和持久化类的映射关系,配置相对复杂 |
使用场景 | 适用于需要频繁与数据库交互的中大型项目,尤其在复杂的查询和性能要求高的场景中 | 适用于需要对象关系映射的场景,尤其是 Java 对象映射关系较为复杂的场景 |
灵活性 | 灵活性较高,可以针对不同的数据库进行优化,支持存储过程调用 | 灵活性较低,虽然可以通过 Hibernate 提供的 API 进行自定义配置,但是相较于 MyBatis,灵活性较差 |
准备开发环境
为了搭建 MyBatis 开发环境,你需要以下工具和库:
- JDK(建议使用 JDK 8 或以上版本)
- IDE(如 IntelliJ IDEA 或 Eclipse)
- 数据库驱动(如 MySQL、Oracle)
- MyBatis 库
以下是如何在 IntelliJ IDEA 中搭建 MyBatis 开发环境的步骤:
- 创建新的 Java 项目:在 IntelliJ IDEA 中,选择
File -> New -> Project
,选择Java
,然后设置项目名称、位置等信息。 - 导入 MyBatis 库:在项目中,通过
File -> Project Structure -> Modules -> Dependencies
,添加 MyBatis 库。 - 配置数据库驱动:将数据库驱动添加到项目的
Libraries
中,例如 MySQL 的驱动:- 下载 MySQL 的 JDBC 驱动(MySQL Connector/J),然后在 IntelliJ IDEA 中通过
File -> Project Structure -> Artifacts
添加该驱动。 - 也可以通过 Maven 或 Gradle 管理依赖,例如在
pom.xml
文件中添加以下依赖:<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency>
- 下载 MySQL 的 JDBC 驱动(MySQL Connector/J),然后在 IntelliJ IDEA 中通过
下载并导入MyBatis库
下载 MyBatis 库的方法有两种:
- 手动下载:访问 MyBatis 官方网站,下载最新版本的 MyBatis 库,然后将下载的库添加到项目的
Libraries
中。 - 通过 Maven 或 Gradle 管理依赖:在
pom.xml
文件中添加以下依赖:<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>
创建第一个MyBatis项目
为了创建第一个 MyBatis 项目,你需要以下几个步骤:
- 创建数据库表:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 创建 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.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration>
- 创建映射 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.UserMapper"> <select id="selectUser" resultType="com.example.User"> SELECT id, name, age FROM user WHERE id = #{id} </select> </mapper>
-
创建 Java 类:
public class User { private int id; private String name; private int age; // getters and setters }
- 创建 Mapper 接口:
public interface UserMapper { User selectUser(int id); }
-
创建主程序类:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUser(1); System.out.println(user.getName()); } } }
SqlSession和SqlSessionFactory
MyBatis 的核心接口是 SqlSession
,它提供了从数据库获取、插入、更新和删除数据的功能。SqlSessionFactory
是创建 SqlSession
的工厂类,它是线程不安全的,因此通常在应用中创建一个单例的 SqlSessionFactory
。
SqlSessionFactory 创建代码示例:
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession 使用示例:
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUser(1); System.out.println(user.getName()); }
Mapper接口
Mapper 接口是 MyBatis 中的一个重要概念,它类似于 Java 的 Mapper 接口,可以定义 SQL 映射的接口,从而简化对数据库的操作。Mapper 接口中的方法直接对应 XML 映射文件中的 SQL 语句。
Mapper 接口示例:
public interface UserMapper { User selectUser(int id); void insertUser(User user); }
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.UserMapper"> <select id="selectUser" resultType="com.example.User"> SELECT id, name, age FROM user WHERE id = #{id} </select> <insert id="insertUser"> INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age}) </insert> </mapper>
XML配置文件解析
MyBatis 的配置文件主要包括以下几个部分:
- 数据库连接配置:定义数据库连接的驱动、URL、用户名和密码。
- 环境配置:定义不同的环境,如开发环境和测试环境。
- 映射文件:定义 SQL 映射文件的位置。
- 事务管理器配置:定义事务管理器的类型,如 JDBC、MANAGED 等。
- 缓存配置:定义缓存的级别和缓存的策略。
配置文件示例:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration>MyBatis基本操作
CRUD操作(增删改查)
MyBatis 提供了多种方式来完成 CRUD 操作,包括 XML 映射文件和注解的方式。下面是 CRUD 操作的基本示例:
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.UserMapper"> <select id="selectUser" resultType="com.example.User"> SELECT id, name, age FROM user WHERE id = #{id} </select> <insert id="insertUser"> INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age}) </insert> <update id="updateUser"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="deleteUser"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
Mapper 接口示例:
public interface UserMapper { User selectUser(int id); void insertUser(User user); void updateUser(User user); void deleteUser(int id); }
主程序示例:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); // 插入数据 User user = new User(1, "John Doe", 30); mapper.insertUser(user); session.commit(); // 查询数据 User user1 = mapper.selectUser(1); System.out.println(user1.getName()); // 更新数据 user.setName("Jane Doe"); mapper.updateUser(user); session.commit(); // 删除数据 mapper.deleteUser(1); session.commit(); } } }
设置和获取结果集
MyBatis 提供了多种设置和获取结果集的方式,包括 resultType
和 resultMap
。resultType
是最简单的设置方式,直接设置结果集的类型;resultMap
是更强大的设置方式,可以处理复杂的结果集映射。
resultType 示例:
<select id="selectUser" resultType="com.example.User"> SELECT id, name, age FROM user WHERE id = #{id} </select>
resultMap 示例:
<resultMap id="userResultMap" type="com.example.User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <result property="age" column="user_age"/> </resultMap> <select id="selectUser" resultMap="userResultMap"> SELECT user_id, user_name, user_age FROM user WHERE id = #{id} </select>
处理一对多和多对多关系
MyBatis 支持处理一对多和多对多关系,可以通过 association
和 collection
标签来实现。
一对多关系示例:
假设有一个 User
和 Order
的一对多关系,一个用户可以有多个订单。
User 类示例:
public class User { private int id; private String name; private List<Order> orders; // getters and setters }
Order 类示例:
public class Order { private int id; private int userId; private String productName; // getters and setters }
XML 映射文件示例:
<resultMap id="userResultMap" type="com.example.User"> <id property="id" column="user_id"/> <result property="name" column="user_name"/> <collection property="orders" javaType="java.util.List" ofType="com.example.Order"> <id property="id" column="order_id"/> <result property="productName" column="product_name"/> </collection> </resultMap> <select id="selectUserWithOrders" resultMap="userResultMap"> SELECT user_id, user_name, order_id, product_name FROM user LEFT JOIN order ON user.user_id = order.user_id WHERE user_id = #{id} </select>
Mapper 接口示例:
public interface UserMapper { User selectUserWithOrders(int id); }
主程序示例:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserWithOrders(1); System.out.println(user.getName()); user.getOrders().forEach(order -> System.out.println(order.getProductName())); } } }MyBatis高级特性
使用注解简化开发
MyBatis 支持使用注解来简化开发,例如 @Select
、@Insert
、@Update
、@Delete
等注解可以直接在 Mapper 接口中使用,而不需要编写 XML 映射文件。
Mapper 接口示例:
public interface UserMapper { @Select("SELECT id, name, age FROM user WHERE id = #{id}") User selectUser(int id); @Insert("INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})") void insertUser(User user); @Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}") void updateUser(User user); @Delete("DELETE FROM user WHERE id = #{id}") void deleteUser(int id); }
一级和二级缓存机制
MyBatis 提供了一级和二级缓存机制来提高查询性能。
一级缓存:一级缓存是 MyBatis 的默认缓存,是线程隔离的缓存,同一个会话中,相同 SQL 语句的查询结果会被缓存。一级缓存是自动管理的,无需开发人员干预。
二级缓存:二级缓存是共用的缓存,多个会话可以共享二级缓存。二级缓存需要通过配置来启用,并且可以设置缓存的级别、缓存的策略等。
配置示例:
<cache-ref default="true" />
Mapper 接口示例:
public interface UserMapper { @Cacheable User selectUser(int id); }
分页查询和延迟加载
MyBatis 提供了分页查询和延迟加载的功能。
分页查询:MyBatis 通过 RowBounds
类来实现分页查询,也可以通过插件来实现分页查询。
Mapper 接口示例:
public interface UserMapper { List<User> selectUsers(RowBounds rowBounds); }
主程序示例:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.List; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.selectUsers(new RowBounds(0, 10)); users.forEach(user -> System.out.println(user.getName())); } } }
延迟加载:MyBatis 的延迟加载可以实现按需加载,例如在查询用户时,可以延迟加载用户的订单信息。
配置示例:
<settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>
Mapper 接口示例:
public interface UserMapper { @Select("SELECT id, name, age FROM user WHERE id = #{id}") @ResultMap("userResultMap") User selectUser(int id); }
User 类示例:
public class User { private int id; private String name; private int age; private List<Order> orders; // getters and setters }MyBatis实战案例
实战项目搭建
假设我们要开发一个简单的用户管理系统,包括用户注册、登录、修改和查询等功能。
-
创建数据库表:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
创建 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.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration>
-
创建映射 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.UserMapper"> <select id="selectUser" resultType="com.example.User"> SELECT id, username, password, email FROM user WHERE id = #{id} </select> <insert id="insertUser"> INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email}) </insert> <update id="updateUser"> UPDATE user SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id} </update> <delete id="deleteUser"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
-
创建 Java 类:
public class User { private int id; private String username; private String password; private String email; // getters and setters }
-
创建 Mapper 接口:
public interface UserMapper { User selectUser(int id); void insertUser(User user); void updateUser(User user); void deleteUser(int id); }
-
创建主程序类:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); // 注册新用户 User user = new User(1, "john_doe", "password123", "john@doe.com"); mapper.insertUser(user); session.commit(); // 查询用户信息 User user1 = mapper.selectUser(1); System.out.println(user1.getUsername()); // 更新用户信息 user.setPassword("new_password123"); mapper.updateUser(user); session.commit(); // 删除用户 mapper.deleteUser(1); session.commit(); } } }
数据库设计与表创建
在本例中,我们设计了一个简单的用户表 user
,包括 id
、username
、password
和 email
字段。
数据库表创建代码示例:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
业务逻辑实现与测试
在本例中,我们实现了一个简单的用户注册、登录、修改和查询功能。
Mapper 接口示例:
public interface UserMapper { User selectUser(int id); void insertUser(User user); void updateUser(User user); void deleteUser(int id); }
主程序示例:
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); // 注册新用户 User user = new User(1, "john_doe", "password123", "john@doe.com"); mapper.insertUser(user); session.commit(); // 查询用户信息 User user1 = mapper.selectUser(1); System.out.println(user1.getUsername()); // 更新用户信息 user.setPassword("new_password123"); mapper.updateUser(user); session.commit(); // 删除用户 mapper.deleteUser(1); session.commit(); } } }
通过以上步骤,我们成功搭建了一个简单的用户管理系统,并实现了基本的 CRUD 操作。MyBatis 的强大之处在于它允许你灵活地控制 SQL 生成和配置,同时提供了多种方式来处理复杂的数据库操作,如一对多和多对多关系、动态 SQL 等。希望这个实战案例能帮助你更好地理解和应用 MyBatis。
总结通过本指南,我们学习了 MyBatis 的基础知识、环境搭建、核心概念、基本操作、高级特性以及实战案例。MyBatis 是一个强大的持久层框架,适用于需要频繁与数据库交互的场景,它提供了灵活的配置选项和丰富的特性,可以有效地提高应用的性能和可维护性。
如果你希望进一步了解 MyBatis 的高级特性,或者希望在实际项目中应用 MyBatis,可以参考 MyBatis 官方文档和一些在线教程。推荐编程学习网站可以是 慕课网,那里提供了丰富的在线课程,可以帮助你深入学习 MyBatis 和其他编程技术。
这篇关于MyBatis学习:从入门到实践指南的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15JavaMailSender是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-15JWT 用户校验学习:从入门到实践
- 2024-11-15Nest学习:新手入门全面指南
- 2024-11-15RestfulAPI学习:新手入门指南
- 2024-11-15Server Component学习:入门教程与实践指南
- 2024-11-15动态路由入门:新手必读指南
- 2024-11-15JWT 用户校验入门:轻松掌握JWT认证基础
- 2024-11-15Nest后端开发入门指南
- 2024-11-15Nest后端开发入门教程
- 2024-11-15RestfulAPI入门:新手快速上手指南