最简单的 iBatis 入门例子

本文提供了一个简单的iBatis入门实例,包括配置文件、实体类、SQL映射文件及使用示例。通过实例演示了如何使用iBatis实现基本的CRUD操作,并指导读者如何在实际项目中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最简单的iBatis入门例子    

iBatis是一个O/R Mapping解决方案,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。下面我们看一个最简单的入门例子,是《ibatis 开发指南》上的例子改的,不过上面讲的不仔细,我开始学的时候搞了一个晚上才把那个例子跑起来的,相信一些朋友也和我一样,在入门的时候有一点小郁闷,我把整个工程项目打包了供朋友下载 ,工具是eclipse3.2+myeclipse5.0,导入即可运行,数据库用的是MySQL。也可以改用别的数据库! 

先建数据库和表吧;sql语句我导出来了:

/**/ /*  

SQLyog 企业版 - MySQL GUI v4.1 

主机 - 5.0.7-beta-nt : 数据库 - sample 

********************************************************************* 

服务器版本 : 5.0.7-beta-nt 

create database if not exists `sample`; 

USE `sample`; 

/* 数据表 `t_user` 的表结构 */  

drop   table   if   exists  `t_user`; 

CREATE   TABLE  `t_user` ( 

  `id`  int  ( 11 NOT   NULL  auto_increment, 

  ` name `  varchar  ( 50 default   NULL  , 

  `sex`  int  ( 11 default   NULL  , 

   PRIMARY   KEY    (`id`) 

) ENGINE = InnoDB  DEFAULT  CHARSET = latin1; 

/**/ /*  数据表 `t_user` 的数据 */  

insert   into  `t_user`  values  ( 1 ' zhupan '  , 1 ),( 2 ' zhupan '  , 2 ),( 3 ' 3 '  , 3 ),( 4 ' 4 '  , 4 ),( 5 ' 5 '  , 5 ); 


整个工程目录结构如下: (图片未能显示,附件里面有)

 

lib包下面的文件: (图片未能显示,附件里面有)

下面开始编写每个文件: 

编写iBatis必须的配置文件SqlMapConfig.xml,放在包com.ctgusec.zhupan.maps下,文件名可以任意改,内容如下:

<?  xml version = "1.0" encoding = "UTF-8"  ?>  

<!  DOCTYPE sqlMapConfig 

    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 

    "http://www.ibatis.com/dtd/sql-map-config-2.dtd"  >  

<  sqlMapConfig  >  

     <  settings  cacheModelsEnabled  = "true"  enhancementEnabled  = "true"  

        lazyLoadingEnabled  = "true"  errorTracingEnabled  = "true"  maxRequests  = "32"  

        maxSessions  = "10"  maxTransactions  = "5"  useStatementNamespaces  = "false"   />  

  

     <  transactionManager  type  = "JDBC"   >  

         <  dataSource  type  = "SIMPLE"   >  

             < property  name ="JDBC.Driver"  value ="com.mysql.jdbc.Driver"   />  

            < property  name ="JDBC.ConnectionURL"     value ="jdbc:mysql://localhost/sample"   />  

            < property  name ="JDBC.Username"  value ="root"   />  

            < property  name ="JDBC.Password"  value =""   />  

             <  property  name  = "Pool.MaximumActiveConnections"  value  = "10"   />  

             <  property  name  = "Pool.MaximumIdleConnections"  value  = "5"   />  

             <  property  name  = "Pool.MaximumCheckoutTime"  value  = "120000"   />  

             <  property  name  = "Pool.TimeToWait"  value  = "500"   />  

             <  property  name  = "Pool.PingQuery"  value  = "select 1 from sample"   />  

             <  property  name  = "Pool.PingEnabled"  value  = "false"   />  

             <  property  name  = "Pool.PingConnectionsOlderThan"  value  = "1"   />  

             <  property  name  = "Pool.PingConnectionsNotUsedFor"  value  = "1"   />  

         </  dataSource  >  

     </  transactionManager  >  

     <  sqlMap  resource  = "com/ctgusec/zhupan/maps/User.xml"   />  

</  sqlMapConfig  >  

如果不用mysql数据库,需要重新配置数据源(红色加粗字体标出),更改相应的属性即可。

然后注意到这个配置文件还引用了一个User.xmliBatis把每个需要O/R MappingJava对象关联到一个xml配置文件,我们需要把t_user表映射到一个User类:

package  com.ctgusec.zhupan.model; 

import  java.io.Serializable; 

  

public   class  User  implements  Serializable 

  

     /** */ /**  

      *  @author  zhupan 

       */  

     private   static   final   long  serialVersionUID  =   1L

  

     private  Integer id ; 

  

     private  String name ; 

  

     private  Integer sex ; 

    

     public  User() 

    }  

  

     public  Integer getId() 

         return   this  . id ; 

    }  

  

     public   void  setId(Integer id) 

         this  . id  =  id; 

    }  

  

     public  String getName() 

         return   this  . name ; 

    }  

  

     public   void  setName(String name) 

         this  . name  =  name; 

    }  

  

     public  Integer getSex() 

         return   this  . sex ; 

    }  

  

     public   void  setSex(Integer sex) 

         this  . sex  =  sex; 

    }  

}  


编写User.xml文件:

<?  xml version = "1.0" encoding = "UTF-8"  ?>  

  

<!  DOCTYPE sqlMap 

    PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 

    "http://www.ibatis.com/dtd/sql-map-2.dtd"  >  

  

<  sqlMap  namespace  = "User"   >  

  

     <  typeAlias  alias  = "user"  type  = "com.ctgusec.zhupan.model.User"   />  

     <  select  id  = "getUser"  parameterClass  = "java.lang.String"  

        resultClass  = "user"   >  

         <![CDATA[      select  name,  sex   from t_user   where name = #name#    ]]>  

     </  select  >  

    

     <  select  id  = "getAllUser"  resultClass  = "user"   >  

         <![CDATA[     select   name,  sex  from t_user   ]]>  

     </  select  >  

  

     <  update  id  = "updateUser"  parameterClass  = "user"   >  

         <![CDATA[     UPDATE t_user  SET name=#name#, sex=#sex# WHERE id = #id#  ]]>  

     </  update  >  

  

     <  insert  id  = "insertUser"  parameterClass  = "user"   >  

        INSERT INTO t_user ( name, sex) VALUES ( #name#, #sex# )  </  insert  >  

  

     <  delete  id  = "deleteUser"  parameterClass  = "java.lang.String"   >  

        delete from t_user where id=#value# 

     </  delete  >  

</  sqlMap  >

通过<insert><delete><update><select>节点,分别定义了针对TUser 对象的增删改查操作。在这些节点中,我们指定了对应的SQL 语句:ID 指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定义的操作,如:sqlMap.update("updateUser",user);   ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)parameterClass 指定了操作所需的参数类型,此例中update 操作以com.ctgusec.zhupan.model.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。parameterClass="user"中,user为“com.ctgusec.zhupan.model.User”类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:<typeAlias alias="user" type="com.ctgusec.zhupan.model.User"/>#name#”在运行期会由传入的user对象的name属性填充。“#sex#”,将在运行期由传入的user 对象的sex属性填充。“#id#”,将在运行期由传入的user对象的id属性填充。 

只要你会写SQL,就能非常容易地写出配置文件。

最后便是如何使用iBatis实现O/R映射,测试给个例子:

package  com.ctgusec.zhupan;   

import  java.sql.SQLException; 

import  java.util.List;   

import  com.ctgusec.zhupan.model.User; 

import  com.ibatis.sqlmap.client.SqlMapClientBuilder;   

/** *//**  

 * 

 *  @author  zhupan 

  */  

public   class  ExampleMain 

  

        public   static   void  update() 

               //  首先初始化 iBatis 获得一个 SqlMapClient 对象 

              String resource  =   " com/ctgusec/zhupan/maps/SqlMapConfig.xml "

              com.ibatis.sqlmap.client.SqlMapClient sqlMap  =   null

               try  

                     java.io.Reader reader  =  com.ibatis.common.resources.Resources.getResourceAsReader(resource); 

                     sqlMap  =  SqlMapClientBuilder.buildSqlMapClient(reader); 

              }   catch  (Exception e) 

                     e.printStackTrace(); 

              }  

               //  sqlMap 系统初始化完毕,开始执行 update 操作 

               try  

                     sqlMap.startTransaction(); 

                     User user  =   new  User(); 

                     user.setId( new  Integer( 1 )); 

                     user.setName( " zhupan " ); 

                     user.setSex( new  Integer( 1 )); 

                     sqlMap.update( " updateUser " , user); 

                     sqlMap.commitTransaction(); 

              }   catch  (SQLException e) 

                     System.out.println(e.getMessage()); 

              }   finally  

                      try  

                            sqlMap.endTransaction(); 

                     }   catch  (SQLException e) 

                            e.printStackTrace(); 

                     }  

              }  

       }  

        public   static  List getUser() 

//             首先初始化 iBatis 获得一个 SqlMapClient 对象 

              String resource  =   " com/ctgusec/zhupan/maps/SqlMapConfig.xml "

              com.ibatis.sqlmap.client.SqlMapClient sqlMap  =   null

              List user = null

               try  

                     java.io.Reader reader  =  com.ibatis.common.resources.Resources.getResourceAsReader(resource); 

                     sqlMap  =  SqlMapClientBuilder.buildSqlMapClient(reader); 

              }   catch  (Exception e) 

                     e.printStackTrace(); 

              }  

               //  sqlMap 系统初始化完毕,开始执行 getAllUser 操作 

               try  

                     sqlMap.startTransaction();                         

                     user = sqlMap.queryForList( " getAllUser " null ); 

                     sqlMap.commitTransaction(); 

              }   catch  (SQLException e) 

                     System.out.println(e.getMessage()); 

              }   finally  

                      try  

                            sqlMap.endTransaction(); 

                     }   catch  (SQLException e) 

                            e.printStackTrace(); 

                     }  

              }  

               return  user; 

       }  

        public   static   void  main(String[] args) 

              update(); 

              List user = getUser();       

               for ( int  i = 0 ;i < user.size();i ++

              

                     System.out.println(((User)user.get(i)).getName()); 

              } 

       } 

} 


运行时把lib包下的所有.jar构建到路径中,操作如下: (图片未能显示,附件里面有)

点击   (图片未能显示,附件里面有)  找到.jar文件全部选中,确认即可

 

 

 

 

最简单的iBatis入门例子    

iBatis是一个O/R Mapping解决方案,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。下面我们看一个最简单的入门例子,是《ibatis 开发指南》上的例子改的,不过上面讲的不仔细,我开始学的时候搞了一个晚上才把那个例子跑起来的,相信一些朋友也和我一样,在入门的时候有一点小郁闷,我把整个工程项目打包了供朋友下载 ,工具是eclipse3.2+myeclipse5.0,导入即可运行,数据库用的是MySQL。也可以改用别的数据库! 

先建数据库和表吧;sql语句我导出来了:

/**/ /*  

SQLyog 企业版 - MySQL GUI v4.1 

主机 - 5.0.7-beta-nt : 数据库 - sample 

********************************************************************* 

服务器版本 : 5.0.7-beta-nt 

create database if not exists `sample`; 

USE `sample`; 

/* 数据表 `t_user` 的表结构 */  

drop   table   if   exists  `t_user`; 

CREATE   TABLE  `t_user` ( 

  `id`  int  ( 11 NOT   NULL  auto_increment, 

  ` name `  varchar  ( 50 default   NULL  , 

  `sex`  int  ( 11 default   NULL  , 

   PRIMARY   KEY    (`id`) 

) ENGINE = InnoDB  DEFAULT  CHARSET = latin1; 

/**/ /*  数据表 `t_user` 的数据 */  

insert   into  `t_user`  values  ( 1 ' zhupan '  , 1 ),( 2 ' zhupan '  , 2 ),( 3 ' 3 '  , 3 ),( 4 ' 4 '  , 4 ),( 5 ' 5 '  , 5 ); 


整个工程目录结构如下: (图片未能显示,附件里面有)

 

lib包下面的文件: (图片未能显示,附件里面有)

下面开始编写每个文件: 

编写iBatis必须的配置文件SqlMapConfig.xml,放在包com.ctgusec.zhupan.maps下,文件名可以任意改,内容如下:

<?  xml version = "1.0" encoding = "UTF-8"  ?>  

<!  DOCTYPE sqlMapConfig 

    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 

    "http://www.ibatis.com/dtd/sql-map-config-2.dtd"  >  

<  sqlMapConfig  >  

     <  settings  cacheModelsEnabled  = "true"  enhancementEnabled  = "true"  

        lazyLoadingEnabled  = "true"  errorTracingEnabled  = "true"  maxRequests  = "32"  

        maxSessions  = "10"  maxTransactions  = "5"  useStatementNamespaces  = "false"   />  

  

     <  transactionManager  type  = "JDBC"   >  

         <  dataSource  type  = "SIMPLE"   >  

             < property  name ="JDBC.Driver"  value ="com.mysql.jdbc.Driver"   />  

            < property  name ="JDBC.ConnectionURL"     value ="jdbc:mysql://localhost/sample"   />  

            < property  name ="JDBC.Username"  value ="root"   />  

            < property  name ="JDBC.Password"  value =""   />  

             <  property  name  = "Pool.MaximumActiveConnections"  value  = "10"   />  

             <  property  name  = "Pool.MaximumIdleConnections"  value  = "5"   />  

             <  property  name  = "Pool.MaximumCheckoutTime"  value  = "120000"   />  

             <  property  name  = "Pool.TimeToWait"  value  = "500"   />  

             <  property  name  = "Pool.PingQuery"  value  = "select 1 from sample"   />  

             <  property  name  = "Pool.PingEnabled"  value  = "false"   />  

             <  property  name  = "Pool.PingConnectionsOlderThan"  value  = "1"   />  

             <  property  name  = "Pool.PingConnectionsNotUsedFor"  value  = "1"   />  

         </  dataSource  >  

     </  transactionManager  >  

     <  sqlMap  resource  = "com/ctgusec/zhupan/maps/User.xml"   />  

</  sqlMapConfig  >  

如果不用mysql数据库,需要重新配置数据源(红色加粗字体标出),更改相应的属性即可。

然后注意到这个配置文件还引用了一个User.xmliBatis把每个需要O/R MappingJava对象关联到一个xml配置文件,我们需要把t_user表映射到一个User类:

package  com.ctgusec.zhupan.model; 

import  java.io.Serializable; 

  

public   class  User  implements  Serializable 

  

     /** */ /**  

      *  @author  zhupan 

       */  

     private   static   final   long  serialVersionUID  =   1L

  

     private  Integer id ; 

  

     private  String name ; 

  

     private  Integer sex ; 

    

     public  User() 

    }  

  

     public  Integer getId() 

         return   this  . id ; 

    }  

  

     public   void  setId(Integer id) 

         this  . id  =  id; 

    }  

  

     public  String getName() 

         return   this  . name ; 

    }  

  

     public   void  setName(String name) 

         this  . name  =  name; 

    }  

  

     public  Integer getSex() 

         return   this  . sex ; 

    }  

  

     public   void  setSex(Integer sex) 

         this  . sex  =  sex; 

    }  

}  


编写User.xml文件:

<?  xml version = "1.0" encoding = "UTF-8"  ?>  

  

<!  DOCTYPE sqlMap 

    PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" 

    "http://www.ibatis.com/dtd/sql-map-2.dtd"  >  

  

<  sqlMap  namespace  = "User"   >  

  

     <  typeAlias  alias  = "user"  type  = "com.ctgusec.zhupan.model.User"   />  

     <  select  id  = "getUser"  parameterClass  = "java.lang.String"  

        resultClass  = "user"   >  

         <![CDATA[      select  name,  sex   from t_user   where name = #name#    ]]>  

     </  select  >  

    

     <  select  id  = "getAllUser"  resultClass  = "user"   >  

         <![CDATA[     select   name,  sex  from t_user   ]]>  

     </  select  >  

  

     <  update  id  = "updateUser"  parameterClass  = "user"   >  

         <![CDATA[     UPDATE t_user  SET name=#name#, sex=#sex# WHERE id = #id#  ]]>  

     </  update  >  

  

     <  insert  id  = "insertUser"  parameterClass  = "user"   >  

        INSERT INTO t_user ( name, sex) VALUES ( #name#, #sex# )  </  insert  >  

  

     <  delete  id  = "deleteUser"  parameterClass  = "java.lang.String"   >  

        delete from t_user where id=#value# 

     </  delete  >  

</  sqlMap  >

通过<insert><delete><update><select>节点,分别定义了针对TUser 对象的增删改查操作。在这些节点中,我们指定了对应的SQL 语句:ID 指定了操作ID,之后我们可以在代码中通过指定操作id 来执行此节点所定义的操作,如:sqlMap.update("updateUser",user);   ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)parameterClass 指定了操作所需的参数类型,此例中update 操作以com.ctgusec.zhupan.model.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。parameterClass="user"中,user为“com.ctgusec.zhupan.model.User”类的别名,别名可通过typeAlias节点指定,如示例配置文件中的:<typeAlias alias="user" type="com.ctgusec.zhupan.model.User"/>#name#”在运行期会由传入的user对象的name属性填充。“#sex#”,将在运行期由传入的user 对象的sex属性填充。“#id#”,将在运行期由传入的user对象的id属性填充。 

只要你会写SQL,就能非常容易地写出配置文件。

最后便是如何使用iBatis实现O/R映射,测试给个例子:

package  com.ctgusec.zhupan;   

import  java.sql.SQLException; 

import  java.util.List;   

import  com.ctgusec.zhupan.model.User; 

import  com.ibatis.sqlmap.client.SqlMapClientBuilder;   

/** *//**  

 * 

 *  @author  zhupan 

  */  

public   class  ExampleMain 

  

        public   static   void  update() 

               //  首先初始化 iBatis 获得一个 SqlMapClient 对象 

              String resource  =   " com/ctgusec/zhupan/maps/SqlMapConfig.xml "

              com.ibatis.sqlmap.client.SqlMapClient sqlMap  =   null

               try  

                     java.io.Reader reader  =  com.ibatis.common.resources.Resources.getResourceAsReader(resource); 

                     sqlMap  =  SqlMapClientBuilder.buildSqlMapClient(reader); 

              }   catch  (Exception e) 

                     e.printStackTrace(); 

              }  

               //  sqlMap 系统初始化完毕,开始执行 update 操作 

               try  

                     sqlMap.startTransaction(); 

                     User user  =   new  User(); 

                     user.setId( new  Integer( 1 )); 

                     user.setName( " zhupan " ); 

                     user.setSex( new  Integer( 1 )); 

                     sqlMap.update( " updateUser " , user); 

                     sqlMap.commitTransaction(); 

              }   catch  (SQLException e) 

                     System.out.println(e.getMessage()); 

              }   finally  

                      try  

                            sqlMap.endTransaction(); 

                     }   catch  (SQLException e) 

                            e.printStackTrace(); 

                     }  

              }  

       }  

        public   static  List getUser() 

//             首先初始化 iBatis 获得一个 SqlMapClient 对象 

              String resource  =   " com/ctgusec/zhupan/maps/SqlMapConfig.xml "

              com.ibatis.sqlmap.client.SqlMapClient sqlMap  =   null

              List user = null

               try  

                     java.io.Reader reader  =  com.ibatis.common.resources.Resources.getResourceAsReader(resource); 

                     sqlMap  =  SqlMapClientBuilder.buildSqlMapClient(reader); 

              }   catch  (Exception e) 

                     e.printStackTrace(); 

              }  

               //  sqlMap 系统初始化完毕,开始执行 getAllUser 操作 

               try  

                     sqlMap.startTransaction();                         

                     user = sqlMap.queryForList( " getAllUser " null ); 

                     sqlMap.commitTransaction(); 

              }   catch  (SQLException e) 

                     System.out.println(e.getMessage()); 

              }   finally  

                      try  

                            sqlMap.endTransaction(); 

                     }   catch  (SQLException e) 

                            e.printStackTrace(); 

                     }  

              }  

               return  user; 

       }  

        public   static   void  main(String[] args) 

              update(); 

              List user = getUser();       

               for ( int  i = 0 ;i < user.size();i ++

              

                     System.out.println(((User)user.get(i)).getName()); 

              } 

       } 

} 


运行时把lib包下的所有.jar构建到路径中,操作如下: (图片未能显示,附件里面有)

点击   (图片未能显示,附件里面有)  找到.jar文件全部选中,确认即可 

总结:iBatis确实简单灵活,上手容易,代码很少,配置稍嫌复杂。动态SQL的确是个强点,熟悉后感觉很不错。iBatis中所有的DAO方法都只传一个值对象,复杂查询当然也不例外。另外对常见的1:11:N关系的支持不如Hibernate。使用iBatis 2.01.0有较大区别,主要体现在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地实现DAO模式。持久层使用了iBatis后,团队中以前乱七八糟的jdbc包装不见了,大家的编码风格统一了,可以集中精力进行业务组件的编写! 

源文件下载 进入页面:http://ctguzhupan.go1.icpcn.com/ibatis/ibatis.html 

参考文献:《ibatis 开发指南》 

Ps:第一次写这东西,表达能力实在不怎么样!结合《ibatis 开发指南》会更容易明白!有不明白的地方也可以联系我,我将尽力帮助,有错误地方也请指正,谢谢!

 

 

总结:iBatis确实简单灵活,上手容易,代码很少,配置稍嫌复杂。动态SQL的确是个强点,熟悉后感觉很不错。iBatis中所有的DAO方法都只传一个值对象,复杂查询当然也不例外。另外对常见的1:11:N关系的支持不如Hibernate。使用iBatis 2.01.0有较大区别,主要体现在配置文件上,iBatis 2.0新增了DAO框架,不需要Spring提供的DAO也能很方便地实现DAO模式。持久层使用了iBatis后,团队中以前乱七八糟的jdbc包装不见了,大家的编码风格统一了,可以集中精力进行业务组件的编写! 

源文件下载 进入页面:http://ctguzhupan.go1.icpcn.com/ibatis/ibatis.html 

参考文献:《ibatis 开发指南》 

Ps:第一次写这东西,表达能力实在不怎么样!结合《ibatis 开发指南》会更容易明白!有不明白的地方也可以联系我,我将尽力帮助,有错误地方也请指正,谢谢!

 

内容概要:《中文大模型基准测评2025年上半年报告》由SuperCLUE团队发布,详细评估了2025年上半年中文大模型的发展状况。报告涵盖了大模型的关键进展、国内外大模型全景图及差距、专项测评基准介绍等。通过SuperCLUE基准,对45个国内外代表性大模型进行了六大任务(数学推理、科学推理、代码生成、智能体Agent、精确指令遵循、幻觉控制)的综合测评。结果显示,海外模型如o3、o4-mini(high)在推理任务上表现突出,而国内模型如Doubao-Seed-1.6-thinking-250715在智能体Agent和幻觉控制任务上表现出色。此外,报告还分析了模型性价比、效能区间分布,并对代表性模型如Doubao-Seed-1.6-thinking-250715、DeepSeek-R1-0528、GLM-4.5等进行了详细介绍。整体来看,国内大模型在特定任务上已接近国际顶尖水平,但在综合推理能力上仍有提升空间。 适用人群:对大模型技术感兴趣的科研人员、工程师、产品经理及投资者。 使用场景及目标:①了解2025年上半年中文大模型的发展现状与趋势;②评估国内外大模型在不同任务上的表现差异;③为技术选型和性能优化提供参考依据。 其他说明:报告提供了详细的测评方法、评分标准及结果分析,确保评估的科学性和公正性。此外,SuperCLUE团队还发布了多个专项测评基准,涵盖多模态、文本、推理等多个领域,为业界提供全面的测评服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值