Java:Spring + SpringMVC + MyBatis框架的整合

Spring + SpringMVC + MyBatis框架整合

1. 创建基于Maven的Web项目

具体见Java::基于Maven的web项目部署

  • 创建Maven工程

  • 修改pom文件打包方式为war

    <packaging>war</packaging>
    
  • 完成Maven工程的web项目结构

  • 添加web项目依赖(jsp-api和servlet-api)

    <!-- jsp-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    
  • 配置服务器运行环境

2. 部署Mybatis

2.1 添加MyBatis依赖

  • mybatis
  • mysql-driver
<!-- mysql驱动 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.47</version>
</dependency>
<!-- mybatis依赖 -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.6</version>
</dependency>

2.2 添加lombok依赖

<!-- lombok依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>

2.3 创建mybatis配置文件(可不做)

resources包创建mybatis-config.xml

<?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>

</configuration>

3. 部署Spring、SpringMVC

3.1 添加依赖

  • Spring
    • spring-context Spring-IoC依赖
    • spring-aspects Spring-AOP依赖
  • spring持久层处理依赖
    • spring-jdbc
  • SpringMVC
    • spring-web
    • spring-webmvc
  • Spring单元测试
    • spring-test
  • SpringMVC接收json格式数据
    • jackson-databind
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>5.2.13.RELEASE</spring.version>
</properties>

<dependencies>
    <!-- Spring依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- spring整合myvatis依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- SpringMVC依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Spring单元测试依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- jacjson依赖 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
    </dependency>
</dependencies>

3.2 创建Spring配置文件

由于Spring配置文件里面需要配置Spring、SpringMVC自身框架的配置,还需要添加整合配置,所有采用多配置文件分开配置

  • spring-context.xml 只配置注解声明、以及类的管理(Spring-IoC的配置)
  • spring-mvc.xml 进行SpringMVC相关的配置,例如静态资源配置、拦截器配置等
  • spring-mybatis.xml 进行spring与mybatis整合相关的配置
3.2.1 spring-context.xml
  • 声明使用注解配置
  • 声明注解扫描范围
<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!--    声明使用注解配置-->
    <context:annotation-config/>
    <!--    声明Spring工厂注解的扫描范围-->
    <context:component-scan base-package=""/>
    
</beans>
3.2.2 spring-mvc.xml
  • 声明SpringMVC使用注解配置
<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <!--    声明mvc使用注解驱动-->
    <mvc:annotation-driven/>

</beans>
3.2.3 spring-mybatis.xml
  • 配置数据源(4.2)
  • 创建SqlSessionFactory对象(4.3)
  • 创建Mapper(4.4)
<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
</beans>

3.3 配置SpringMVC前端控制器

web.xml进行配置

在这里插入图片描述

<!--配置前端控制器-->
<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

4. 整合配置(IoC)

4.1 添加依赖

  • mybatis-spring
<!-- mybatis-spring依赖 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

4.2 配置Druid连接池

4.2.1 添加Druid依赖
<!-- druid依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.5</version>
</dependency>
4.2.2 创建Druid属性文件
  • resources创建druid.properties
druid.driver=com.mysql.jdbc.Driver           
druid.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8
druid.username=root
druid.password=123456

## 连接池参数
druid.pool.init=1
druid.pool.minIdle=3
druid.pool.maxActive=20
druid.pool.maxWait=30000
4.2.3 配置Druid数据源
  • spring-mybatis.xml配置数据源
<!--加载druid.properties文件-->
<context:property-placeholder location="classpath:druid.properties"/>
<!--依赖Spring容器完成数据源DataSource的创建-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <!--获取属性文件key对应的value-->
    <property name="driverClassName" value="${druid.driver}"/>
    <property name="url" value="${druid.url}"/>
    <property name="username" value="${druid.username}"/>
    <property name="password" value="${druid.password}"/>

    <property name="initialSize" value="${druid.pool.init}"/>
    <property name="minIdle" value="${druid.pool.minIdle}"/>
    <property name="maxActive" value="${druid.pool.maxActive}"/>
    <property name="maxWait" value="${druid.pool.maxWait}"/>
</bean>

4.3 配置SqlSessionFactory

mybatis需要依赖Spring容器创建MyBatis的SqlSessionFactory对象

  • spring-mybatis.xml配置SqlSessionFactory
<!--依赖Spring容器完成SqlSessionFactory的创建-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--配置数据源-->
    <property name="dataSource" ref="druidDataSource"/>
    <!--配置Mapper文件路径-->
    <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
    <!--配置需要定义别名的实体类的包-->
    <property name="typeAliasesPackage" value="com.xiaoqing.bean"/>
    <!--配置MyBatis的配置文件-->
    <property name="configLocation" value="mybatis-config.xml"/>
</bean>

4.4 配置MapperScannerConfigurer

加载所有dao接口,把dao创建成对象,存储到Spring容器

  • spring-mybatis.xml配置MapperScannerConfigurer
<!--配置MapperScannerConfigurer-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!--配置SqlSessionFactory-->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <!--配置dao包的路径-->
    <property name="basePackage" value="com.xiaoqing.dao"/>
</bean>

5. 整合配置(AOP)

使用Spring提供的事务管理完成DAO操作的事务管理

基于文件的配置方式使用起来不灵活,因此一般采用使用基于注解方式的事务管理配置

  • spring-mybatis.xml配置事务管理
<!--1.将Spring提供的事务管理配置给Spring容器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="druidDataSource"/>
</bean>
<!--2.声明使用注解完成事务配置-->
<tx:annotation-driven transaction-manager="transactionManager"/>
  • 使用注解方式实例
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDAO userDAO;
    @Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.SUPPORTS)
    @Override
    public List<User> listUsers() {
        return userDAO.queryUsers();
    }
}

6. 整合测试

6.1 DAO单元测试

测试案例:查询users表中的用户信息

6.1.1 创建数据表
  • 在数据库db6创建users表

  • user表里面有5个字段(user_id、user_name、user_pwd、user_realname、user_img)

  • 添加数据

  • users

在这里插入图片描述

6.1.2 创建实体类
  • 创建bean包创建User实体类

  • 里面有5个属性,对应数据中的字段(userId、serName、userPwd、userRealname、userImg)

  • User
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {

    private int userId;
    private String userName;
    private String userPwd;
    private String userRealname;
    private String userImg;
}
6.1.3 创建DAO接口

在DAO包下创建UserDAO

  • UserDAO
public interface UserDAO {

    public User queryUserByName(String username);
}
6.1.4 创建Mapper映射文件

在mappers包下创建UserMapper

  • UserMapper
<?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.xiaoqing.dao.UserDAO">

    <resultMap id="userMap" type="user">
        <id column="user_id" property="userId"/>
        <result column="user_name" property="userName"/>
        <result column="user_pwd" property="userPwd"/>
        <result column="user_realname" property="realName"/>
        <result column="user_img" property="userImg"/>
    </resultMap>
    <select id="queryUserByName" resultMap="userMap">
        select user_id,user_name,user_pwd,user_realname,user_img
        from users
        where user_name = #{userName}
    </select>

</mapper>
6.1.5 对UserDAO进行单元测试
  • 添加junit、spring-test依赖

  • 在测试类上使用@RunWith和@ContextConfiguration注解

  • //@RunWith() 指定用哪种驱动进行单元测试,默认就是junit
    //@RunWith(SpringJUnit4ClassRunner.class),使用Spring的单元测试模块执行来执行标了 @Test 注解的测试方法

    //@ContextConfiguration(locations = “”) 使用它来指定Spring的配置文件的位置,可以使用集合指定多个配置文件

<!-- junit依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
  • 单元测试类 UserDAOTest

在这里插入图片描述

//@RunWith() 指定用哪种驱动进行单元测试,默认就是junit
//@RunWith(SpringJUnit4ClassRunner.class)
//使用Spring的单元测试模块执行来执行标了 @Test 注解的测试方法
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = "") 使用它来指定Spring的配置文件的位置
@ContextConfiguration({"classpath:spring-context.xml","classpath:spring-mvc.xml","classpath:spring-mybatis.xml"})
public class UserDAOTest {
    @Resource
    private UserDAO userDAO;
    @Test
    public void queryUserByName() {
        User user = userDAO.queryUserByName("zhangsan");
        System.out.println(user);
    }
}
  • 测试结果

在这里插入图片描述

6.2 Service单元测试

6.2.1 创建Service接口

在service包下创建UserService接口

public interface UserService {
    //用户登陆验证
    public User checkLogin(String username,String password);
}

6.2.2 创建Service接口实现类

在service/impl包下创建UserServiceImpl

在这里插入图片描述

@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserDAO userDAO;
    @Override
    public User checkLogin(String username, String password) {

        User user = userDAO.queryUserByName(username);
        //加密

        //判断user是否为空
        if(user == null){
            return null;
        }else {
            //判断是否登陆成功
            if(user.getUserPwd().equals(password)){
                return user;
            }
            return null;
        }
    }
}
6.2.3 对UserServiceImpl进行单元测试
  • UserServiceImplTest

在这里插入图片描述

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context.xml","classpath:spring-mvc.xml","classpath:spring-mybatis.xml"})
public class UserServiceImplTest {
    @Resource
    private UserService userService;
    @Test
    public void checkLogin() {
        User user = userService.checkLogin("zhangsan", "123456");

        assertNotNull(user);
    }
}
  • 测试结果

数据库数据 zhangsan 123456

在这里插入图片描述

6.3 Controller测试

6.3.1 创建控制器

在controllers包下创建UserController

  • UserController

在这里插入图片描述

@Controller
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;

    @RequestMapping("/login")
    public String login(String userName,String userPwd,HttpServletRequest request){
        System.out.println("---------login");
        User user = userService.checkLogin(userName, userPwd);
        if(user == null){
            request.setAttribute("tips","用户登陆失败,请重新登陆~");
            return "/login.jsp";
        }else {
            request.getSession().setAttribute("user",user);
            return "redirect:/success.jsp";
        }
    }
}
6.3.2 创建登录页面

在webapp下创建login.jsp

<%--
  Created by IntelliJ IDEA.
  User: c
  Date: 2023/1/8
  Time: 17:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登陆</title>
</head>
<body>
  <h3>用户登陆</h3>
  <p style="color: red">${pageContext.request.getAttribute("tips")}</p>
  <form action="${pageContext.request.contextPath}/user/login" method="post">
    <p>用户账号:<input type="text" name="userName">
    <p>用户密码:<input type="password" name="userPwd"></p>
    <p><input type="submit" value="登陆"></p>
  </form>
</body>
</html>
6.3.3 创建欢迎页面

在webapp下创建success.jsp

<%--
  Created by IntelliJ IDEA.
  User: c
  Date: 2023/1/8
  Time: 17:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>欢迎页面</title>
</head>
<body>
    <h1>欢迎${user.userName}!</h1>
    <a href="login.jsp">返回登陆页面</a>
</body>
</html>
6.3.4 对控制器进行测试

访问http://localhost:8080/ssm_demo01/login.jsp

  • 用户名:admin 密码:123456

在这里插入图片描述
在这里插入图片描述

  • 用户名:zhangsan密码:123456

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring+SpringMVC+MyBatis框架技术整合是目前Java企业级应用开发中最为流行的技术组合之一。在这个技术组合中,Spring负责IoC和AOP,SpringMVC则是MVC框架,而MyBatis则是ORM框架。 下面是一个简单的整合案例: 1. 首先,我们需要创建一个Maven项目,并添加SpringSpringMVCMyBatis的依赖: ```xml <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> ``` 2. 接着,我们需要配置SpringSpringMVCMyBatis的配置文件。在这里,我们使用注解方式配置SpringSpringMVC,而使用XML方式配置MyBatisSpring配置文件: ```java @Configuration @ComponentScan(basePackages = "com.example") @EnableWebMvc public class AppConfig { // ... 配置其他Bean @Bean public DataSource dataSource() { // 配置数据源 return new DriverManagerDataSource(); } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); // 配置MyBatis插件 Interceptor[] plugins = {pageHelper()}; sessionFactory.setPlugins(plugins); // 配置MyBatis映射文件 sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath*:mapper/*.xml")); return sessionFactory.getObject(); } @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer(); scannerConfigurer.setBasePackage("com.example.mapper"); scannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); return scannerConfigurer; } @Bean public PageInterceptor pageHelper() { PageInterceptor pageInterceptor = new PageInterceptor(); Properties properties = new Properties(); properties.setProperty("helperDialect", "mysql"); pageInterceptor.setProperties(properties); return pageInterceptor; } } ``` SpringMVC配置文件: ```java @Configuration public class WebConfig implements WebMvcConfigurer { // ... 配置其他内容 @Bean public ViewResolver viewResolver() { // 配置视图解析器 InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 配置静态资源 registry.addResourceHandler("/static/**") .addResourceLocations("/static/"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } ``` MyBatis配置文件: ```xml <configuration> <typeAliases> <!-- 配置别名 --> <package name="com.example.model"/> </typeAliases> <mappers> <!-- 配置映射文件 --> <mapper resource="mapper/userMapper.xml"/> </mappers> <!-- 配置分页插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> </plugin> </plugins> </configuration> ``` 3. 接着,我们需要创建Controller和Mapper接口以及对应的视图和映射文件。这里我们以用户管理为例: UserController.java: ```java @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/list", method = RequestMethod.GET) public String list(Model model) { List<User> users = userService.getAllUsers(); model.addAttribute("users", users); return "user/list"; } @RequestMapping(value = "/add", method = RequestMethod.GET) public String addForm() { return "user/add"; } @RequestMapping(value = "/add", method = RequestMethod.POST) public String add(User user) { userService.addUser(user); return "redirect:/user/list"; } @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) public String editForm(@PathVariable("id") Long id, Model model) { User user = userService.getUserById(id); model.addAttribute("user", user); return "user/edit"; } @RequestMapping(value = "/edit", method = RequestMethod.POST) public String edit(User user) { userService.updateUser(user); return "redirect:/user/list"; } @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) public String delete(@PathVariable("id") Long id) { userService.deleteUser(id); return "redirect:/user/list"; } } ``` UserMapper.java: ```java public interface UserMapper { List<User> getAllUsers(); User getUserById(Long id); void addUser(User user); void updateUser(User user); void deleteUser(Long id); } ``` userMapper.xml: ```xml <mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userMap" type="com.example.model.User"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="age" column="age" /> </resultMap> <select id="getAllUsers" resultMap="userMap"> SELECT * FROM user </select> <select id="getUserById" resultMap="userMap"> SELECT * FROM user WHERE id = #{id} </select> <insert id="addUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, age) VALUES(#{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> ``` 4. 最后,我们需要配置web.xml文件,启动Spring容器和SpringMVC DispatcherServlet。 web.xml: ```xml <web-app> <display-name>MyApp</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/config/spring/appConfig.java</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/config/spring/webConfig.java</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` 这样,我们就完成了Spring+SpringMVC+MyBatis框架技术的整合。在实际开发中,我们可以根据需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值