• Spring和mybatis的整合


    一、搭建项目开发环境

    1. 新建一个maven项目SpringMybatis,项目结构如下:

                                                                                   

    说明:

    src/main/java 存放java代码和映射文件:

             com.study.springmybatis.dao 存放mapper接口

             com.study.springmybatis.mapper 存放mapper映射文件

             com.study.springmybatis.model 存放pojo类

             com.study.springmybatis.service 存放service接口和对应的实现类

    src/test/java存放测试代码

    src/main/resources 存放数据库配置文件和xml配置文件

    2. 在pom.xml文件引入spring和mybatis相关的依赖,这里用的是阿里的maven远程仓库http://maven.aliyun.com/nexus/content/groups/public/

      1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      3   <modelVersion>4.0.0</modelVersion>
      4 
      5   <groupId>com.study.springmybatis</groupId>
      6   <artifactId>SpringMybatis</artifactId>
      7   <version>0.0.1-SNAPSHOT</version>
      8   <packaging>jar</packaging>
      9 
     10   <name>SpringMybatis</name>
     11   <url>http://maven.apache.org</url>
     12 
     13   <properties>
     14     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     15   </properties>
     16 
     17   <dependencies>
     18     <!-- 添加Spring相关的依赖 begin-->
     19         <dependency>
     20             <groupId>org.springframework</groupId>
     21             <artifactId>spring-core</artifactId>
     22             <version>4.3.12.RELEASE</version>
     23         </dependency>
     24         
     25         <dependency>
     26             <groupId>org.springframework</groupId>
     27             <artifactId>spring-context</artifactId>
     28             <version>4.3.12.RELEASE</version>
     29         </dependency>
     30         
     31         <dependency>
     32             <groupId>org.springframework</groupId>
     33             <artifactId>spring-tx</artifactId>
     34             <version>4.3.12.RELEASE</version>
     35         </dependency>
     36         
     37         <dependency>
     38             <groupId>org.springframework</groupId>
     39             <artifactId>spring-jdbc</artifactId>
     40             <version>4.3.12.RELEASE</version>
     41         </dependency>
     42         
     43         <dependency>
     44             <groupId>org.springframework</groupId>
     45             <artifactId>spring-test</artifactId>
     46             <version>4.3.12.RELEASE</version>
     47         </dependency>
     48         
     49         <dependency>
     50           <groupId>org.springframework</groupId>
     51           <artifactId>spring-aop</artifactId>
     52           <version>4.3.12.RELEASE</version>
     53         </dependency>
     54         
     55         <dependency>
     56           <groupId>org.springframework</groupId>
     57           <artifactId>spring-beans</artifactId>
     58           <version>4.3.12.RELEASE</version>
     59         </dependency>
     60 
     61         <dependency>
     62           <groupId>org.apache.geronimo.bundles</groupId>
     63           <artifactId>aspectjweaver</artifactId>
     64           <version>1.6.8_2</version>
     65         </dependency>
     66    <!-- 添加Spring相关的依赖 end-->
     67          
     68    <!-- 添加mybatis的核心包 begin-->
     69         <dependency>
     70             <groupId>org.mybatis</groupId>
     71             <artifactId>mybatis</artifactId>
     72             <version>3.2.8</version>
     73         </dependency>
     74    <!-- 添加mybatis的核心包 end-->
     75         
     76    <!-- 添加mybatis与Spring整合的核心包 begin -->
     77         <dependency>
     78             <groupId>org.mybatis</groupId>
     79             <artifactId>mybatis-spring</artifactId>
     80             <version>1.2.0</version>
     81         </dependency>
     82    <!-- 添加mybatis与Spring整合的核心包 end -->
     83         
     84    <!--数据库连接相关包 begin  -->
     85         <dependency>
     86           <groupId>org.wisdom-framework</groupId>
     87           <artifactId>mysql-connector-java</artifactId>
     88           <version>5.1.34_1</version>
     89         </dependency>
     90         
     91         <dependency>
     92           <groupId>commons-dbcp</groupId>
     93           <artifactId>commons-dbcp</artifactId>
     94           <version>1.4</version>
     95         </dependency>
     96         
     97         <dependency>
     98           <groupId>commons-pool</groupId>
     99           <artifactId>commons-pool</artifactId>
    100           <version>1.6</version>
    101         </dependency>
    102             
    103         <dependency>
    104           <groupId>c3p0</groupId>
    105           <artifactId>c3p0</artifactId>
    106           <version>0.9.1.2</version>
    107         </dependency>
    108    <!--数据库连接相关包 end  -->
    109         
    110    <!-- 其他附加包 begin-->
    118         <dependency>
    119           <groupId>commons-logging</groupId>
    120           <artifactId>commons-logging</artifactId>
    121           <version>1.1.3</version>
    122         </dependency>    
    123         
    124         <dependency>
    125             <groupId>junit</groupId>
    126             <artifactId>junit</artifactId>
    127             <version>4.12</version>
    128             <scope>test</scope>
    129         </dependency>
    130     <!-- 其他附加包 end-->
    131             
    132   </dependencies>
    133 </project>

    二、创建表SQL和使用mybatis逆向工程生成代码

    1.建表

    1 CREATE TABLE `t_user` (
    2   `id` int(11) NOT NULL AUTO_INCREMENT,
    3   `username` varchar(30) NOT NULL COMMENT '用户名称',
    4   `birthday` date DEFAULT NULL COMMENT '生日',
    5   `sex` char(2) DEFAULT NULL COMMENT '性别',
    6   `address` varchar(256) DEFAULT NULL COMMENT '地址',
    7   PRIMARY KEY (`id`)
    8 ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='用户信息表';

    2. 使用mybatis逆向工程生成代码

       mybatis逆向工程能根据数据库的表结构生成对应的mapper映射文件,接口,实体类,具体操作方法可以看我的前一篇文章:mybatis逆向工程,然后修改生成文件的名称为符合java命名规范的名称

    3. 生成逆向工程后的代码目录结构如下,这里使用的是spring的注解管理bean

       生成的mapper接口UserDao.java代码

     1 package com.study.springmybatis.dao;
     2 
     3 import org.springframework.stereotype.Repository;
     4 
     5 import com.study.springmybatis.model.UserModel;
     6 
     7 /**
     8  * 用户接口
     9  * 
    10  * @author lgs
    11  *
    12  */
    13 @Repository("userDao")
    14 public interface UserDao {
    15     int deleteByPrimaryKey(Integer id);
    16 
    17     int insert(UserModel record);
    18 
    19     int insertSelective(UserModel record);
    20 
    21     UserModel selectByPrimaryKey(Integer id);
    22 
    23     int updateByPrimaryKeySelective(UserModel record);
    24 
    25     int updateByPrimaryKey(UserModel record);
    26 }

    生成的mapper映射文件mapper-user.xml,因为之前对生成的实体和接口做了名称修改,所以这里也要对mapper-user.xml里面的内容做对应的修改,修改后的内容如下

      1 <?xml version="1.0" encoding="UTF-8" ?>
      2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
      3 <mapper namespace="com.study.springmybatis.dao.UserDao" >
      4 
      5     <resultMap id="BaseResultMap" type="com.study.springmybatis.model.UserModel" >
      6         <id column="id" property="id" jdbcType="INTEGER" />
      7         <result column="username" property="username" jdbcType="VARCHAR" />
      8         <result column="birthday" property="birthday" jdbcType="DATE" />
      9         <result column="sex" property="sex" jdbcType="CHAR" />
     10         <result column="address" property="address" jdbcType="VARCHAR" />
     11     </resultMap>
     12 
     13     <sql id="Base_Column_List" >
     14         id, username, birthday, sex, address
     15     </sql>
     16 
     17     <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     18         select 
     19         <include refid="Base_Column_List" />
     20         from t_user
     21         where id = #{id,jdbcType=INTEGER}
     22     </select>
     23 
     24     <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
     25         delete from t_user
     26         where id = #{id,jdbcType=INTEGER}
     27     </delete>
     28 
     29     <insert id="insert" parameterType="com.study.springmybatis.model.UserModel" >
     30         insert into t_user (id, username, birthday, 
     31             sex, address)
     32         values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{birthday,jdbcType=DATE}, 
     33             #{sex,jdbcType=CHAR}, #{address,jdbcType=VARCHAR})
     34     </insert>
     35 
     36     <insert id="insertSelective" parameterType="com.study.springmybatis.model.UserModel" >
     37         insert into t_user
     38         <trim prefix="(" suffix=")" suffixOverrides="," >
     39             <if test="id != null" >
     40                 id,
     41             </if>
     42             <if test="username != null" >
     43                 username,
     44             </if>
     45             <if test="birthday != null" >
     46                 birthday,
     47             </if>
     48             <if test="sex != null" >
     49                 sex,
     50             </if>
     51             <if test="address != null" >
     52                 address,
     53             </if>
     54         </trim>
     55         <trim prefix="values (" suffix=")" suffixOverrides="," >
     56             <if test="id != null" >
     57                 #{id,jdbcType=INTEGER},
     58             </if>
     59             <if test="username != null" >
     60                 #{username,jdbcType=VARCHAR},
     61             </if>
     62             <if test="birthday != null" >
     63                 #{birthday,jdbcType=DATE},
     64             </if>
     65             <if test="sex != null" >
     66                 #{sex,jdbcType=CHAR},
     67             </if>
     68             <if test="address != null" >
     69                 #{address,jdbcType=VARCHAR},
     70             </if>
     71         </trim>
     72     </insert>
     73 
     74     <update id="updateByPrimaryKeySelective" parameterType="com.study.springmybatis.model.UserModel" >
     75         update t_user
     76         <set >
     77             <if test="username != null" >
     78                 username = #{username,jdbcType=VARCHAR},
     79             </if>
     80             <if test="birthday != null" >
     81                 birthday = #{birthday,jdbcType=DATE},
     82             </if>
     83             <if test="sex != null" >
     84                 sex = #{sex,jdbcType=CHAR},
     85             </if>
     86             <if test="address != null" >
     87                 address = #{address,jdbcType=VARCHAR},
     88             </if>
     89         </set>
     90         where id = #{id,jdbcType=INTEGER}
     91     </update>
     92 
     93     <update id="updateByPrimaryKey" parameterType="com.study.springmybatis.model.UserModel" >
     94         update t_user
     95         set username = #{username,jdbcType=VARCHAR},
     96             birthday = #{birthday,jdbcType=DATE},
     97             sex = #{sex,jdbcType=CHAR},
     98             address = #{address,jdbcType=VARCHAR}
     99         where id = #{id,jdbcType=INTEGER}
    100     </update>
    101 </mapper>

    生成的pojo即实体类UserModel.java

     1 package com.study.springmybatis.model;
     2 
     3 import java.util.Date;
     4 
     5 /**
     6  * 用户信息表
     7  * 
     8  * @author lgs
     9  * 
    10  * @date 2017-10-21
    11  */
    12 public class UserModel {
    13     private Integer id;
    14 
    15     /**
    16      * 用户名称
    17      */
    18     private String username;
    19 
    20     /**
    21      * 生日
    22      */
    23     private Date birthday;
    24 
    25     /**
    26      * 性别
    27      */
    28     private String sex;
    29 
    30     /**
    31      * 地址
    32      */
    33     private String address;
    34 
    35     public Integer getId() {
    36         return id;
    37     }
    38 
    39     public void setId(Integer id) {
    40         this.id = id;
    41     }
    42 
    43     public String getUsername() {
    44         return username;
    45     }
    46 
    47     public void setUsername(String username) {
    48         this.username = username == null ? null : username.trim();
    49     }
    50 
    51     public Date getBirthday() {
    52         return birthday;
    53     }
    54 
    55     public void setBirthday(Date birthday) {
    56         this.birthday = birthday;
    57     }
    58 
    59     public String getSex() {
    60         return sex;
    61     }
    62 
    63     public void setSex(String sex) {
    64         this.sex = sex == null ? null : sex.trim();
    65     }
    66 
    67     public String getAddress() {
    68         return address;
    69     }
    70 
    71     public void setAddress(String address) {
    72         this.address = address == null ? null : address.trim();
    73     }
    74 }

    业务的接口UserServiceI.java和实现类UserService.java

     1 package com.study.springmybatis.service;
     2 
     3 import com.study.springmybatis.model.UserModel;
     4 
     5 /**
     6  * 业务接口
     7  * @author lgs
     8  *
     9  */
    10 public interface UserServiceI {
    11 
    12     /**
    13      * 根据用户id获取用户
    14      * @param userId
    15      * @return
    16      */
    17     UserModel getUserById(Integer userId);
    18 }
     1 package com.study.springmybatis.service;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.stereotype.Service;
     6 
     7 import com.study.springmybatis.dao.UserDao;
     8 import com.study.springmybatis.model.UserModel;
     9 
    10 /**
    11  * 业务实现类
    12  * @author lgs
    13  *
    14  */
    15 @Service("userService")
    16 public class UserService implements UserServiceI {
    17 
    18     /**
    19      * 使用Resource注解注入userDao实例,
    20      * 当需要使用userDao时,Spring就会自动注入UserDao
    21      */
    22     @Resource
    23     private UserDao userDao;
    24 
    25     public UserModel getUserById(Integer userId) {
    26         return userDao.selectByPrimaryKey(userId);
    27     }
    28 }

    三、在src/main/resources目录下编写配置文件

    1. 数据库配置dbconfig.properties

    1 driver=com.mysql.jdbc.Driver
    2 jdbc_url=jdbc:mysql://192.168.152.1:3306/study?characterEncoding=utf-8
    3 jdbc_username=root
    4 jdbc_password=123456
    5 validationQuery=SELECT 1

    2. Spring框架的核心配置文件spring.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2  <beans
     3      xmlns="http://www.springframework.org/schema/beans"
     4      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5      xmlns:p="http://www.springframework.org/schema/p"
     6      xmlns:context="http://www.springframework.org/schema/context"
     7      xsi:schemaLocation="http://www.springframework.org/schema/beans
     8      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     9      http://www.springframework.org/schema/context
    10      http://www.springframework.org/schema/context/spring-context-3.0.xsd
    11      ">
    12     <!--spring框架的配置文件  -->
    13     
    14     <!-- 引入dbconfig.properties属性文件 -->
    15     <context:property-placeholder location="classpath:dbconfig.properties" />
    16     <!-- 自动扫描(自动注入),扫描com.study.springmybatis这个包以及它的子包的所有使用spring注解标注的类 -->
    17     <context:component-scan base-package="com.study" />
    18 </beans>

    3. Spring框架与Mybatis框架整合的配置文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <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" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
     3 http://www.springframework.org/schema/beans 
     4 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     5 http://www.springframework.org/schema/tx 
     6 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     7 http://www.springframework.org/schema/aop 
     8 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     9 ">
    10    <!--spring与mybatis整合的配置文件  -->
    11    
    12      <!--配置数据源 -->
    13     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    14         destroy-method="close">
    15         <property name="driverClassName">
    16            <value>${driver}</value>
    17         </property>
    18         <property name="url">
    19             <value>${jdbc_url}</value>
    20         </property>
    21         <property name="username">
    22             <value>${jdbc_username}</value>
    23         </property>
    24         <property name="password">
    25             <value>${jdbc_password}</value>
    26         </property>
    27         <property name="maxActive" value="100"></property>
    28         <property name="maxIdle" value="30"></property>
    29         <property name="maxWait" value="500"></property>
    30         <property name="defaultAutoCommit" value="true"></property>
    31     </bean>
    32     
    33     <!-- ========================================分隔线========================================= -->
    34     
    35     <!-- ========================================针对myBatis的配置项============================== -->
    36     <!-- 配置sqlSessionFactory -->
    37     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    38         <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
    39         <property name="dataSource" ref="dataSource" />
    40         <!-- 自动扫描com/study/springmybatis/mapper/目录下的所有SQL映射的xml文件, 省掉SqlMapConfig.xml里的手工配置
    41         value="com/study/springmybatis/mapper/*.xml"指的是classpath(类路径)下com.study.springmybatis.mapper包中的所有xml文件
    42         SQL映射的xml文件位于com.study.springmybatis.mapper包下,这样就可以被自动扫描
    43          -->
    44         <property name="mapperLocations" value="classpath:com/study/springmybatis/mapper/*.xml" />
    45     </bean>
    46     <!-- 配置扫描器 -->
    47     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    48         <!-- 扫描com.study.springmybatis.dao这个包以及它的子包下的所有映射接口类 -->
    49         <property name="basePackage" value="com.study.springmybatis.dao" />
    50         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    51     </bean>
    52     
    53     <!-- ========================================分隔线========================================= -->
    54     <!-- 配置Spring的事务管理器 -->
    55     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    56         <property name="dataSource" ref="dataSource" />
    57     </bean>
    58 
    59     <!-- 注解方式配置事物 -->
    60     <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
    61 
    62     <!-- 拦截器方式配置事物 -->
    63     <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    64         <tx:attributes>
    65             <tx:method name="add*" propagation="REQUIRED" />
    66             <tx:method name="append*" propagation="REQUIRED" />
    67             <tx:method name="insert*" propagation="REQUIRED" />
    68             <tx:method name="save*" propagation="REQUIRED" />
    69             <tx:method name="update*" propagation="REQUIRED" />
    70             <tx:method name="modify*" propagation="REQUIRED" />
    71             <tx:method name="edit*" propagation="REQUIRED" />
    72             <tx:method name="delete*" propagation="REQUIRED" />
    73             <tx:method name="remove*" propagation="REQUIRED" />
    74             <tx:method name="repair" propagation="REQUIRED" />
    75             <tx:method name="delAndRepair" propagation="REQUIRED" />
    76 
    77             <tx:method name="get*" propagation="SUPPORTS" />
    78             <tx:method name="find*" propagation="SUPPORTS" />
    79             <tx:method name="load*" propagation="SUPPORTS" />
    80             <tx:method name="search*" propagation="SUPPORTS" />
    81             <tx:method name="datagrid*" propagation="SUPPORTS" />
    82 
    83             <tx:method name="*" propagation="SUPPORTS" />
    84         </tx:attributes>
    85     </tx:advice>
    86     <!--Spring事物切面配置  -->
    87     <aop:config>
    88         <aop:pointcut id="transactionPointcut" expression="execution(* com.study.springmybatis.service.*.*(..))" />
    89         <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
    90     </aop:config>
    91 
    92 </beans>

    四、在src/test/java编写测试类SpringMyBatisTest,本来测试类是放在src/test/java目录下面的。但是不知道为啥找不到junit的注解@Test,这里就偷了一下懒移到src/main/java目录的com.study.springmybatis.test包下面了

     1 package com.study.springmybatis.test;
     2 
     3 
     4 import javax.annotation.Resource;
     5 
     6 import org.junit.Test;
     7 import org.junit.runner.RunWith;
     8 import org.springframework.test.context.ContextConfiguration;
     9 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    10 
    11 import com.study.springmybatis.model.UserModel;
    12 import com.study.springmybatis.service.UserServiceI;
    13 
    14 
    15 @RunWith(SpringJUnit4ClassRunner.class)
    16 //配置了@ContextConfiguration注解并使用该注解的locations属性指明spring和配置文件之后,
    17 @ContextConfiguration(locations = {"classpath:spring.xml", "classpath:spring-mybatis.xml" })
    18 public class SpringMyBatisTest {
    19 
    20     //注入userService
    21     @Resource
    22     private UserServiceI userService;
    23     
    24     
    25     @Test
    26     public void testGetUserById(){
    27         int userId = 1;
    28         UserModel user = userService.getUserById(userId);
    29         System.out.println("查询到的用户名为:"+user.getUsername());
    30     }
    31 }

    运行测试类的结果为:

     1 十月 22, 2017 3:08:00 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper getDefaultTestExecutionListenerClassNames
     2 信息: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
     3 十月 22, 2017 3:08:00 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper instantiateListeners
     4 信息: Could not instantiate TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener]. Specify custom listener classes or make the default listener classes (and their required dependencies) available. Offending class: [javax/servlet/ServletContext]
     5 十月 22, 2017 3:08:00 下午 org.springframework.test.context.support.DefaultTestContextBootstrapper getTestExecutionListeners
     6 信息: Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@3b6eb2ec, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@1e643faf, org.springframework.test.context.support.DirtiesContextTestExecutionListener@6e8dacdf, org.springframework.test.context.transaction.TransactionalTestExecutionListener@7a79be86, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@34ce8af7]
     7 十月 22, 2017 3:08:00 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
     8 信息: Loading XML bean definitions from class path resource [spring.xml]
     9 十月 22, 2017 3:08:00 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    10 信息: Loading XML bean definitions from class path resource [spring-mybatis.xml]
    11 十月 22, 2017 3:08:00 下午 org.springframework.context.support.GenericApplicationContext prepareRefresh
    12 信息: Refreshing org.springframework.context.support.GenericApplicationContext@5a61f5df: startup date [Sun Oct 22 15:08:00 CST 2017]; root of context hierarchy
    13 查询到的用户名为:lgs

    五、需要完整工程代码的同学去我的githup上下载https://github.com/leeSmall/SpringMybatis

  • 相关阅读:
    第01组 Alpha冲刺 (4/4)
    第01组 Alpha冲刺 (3/4)
    发布 学习进度条 博客要求
    0302思考并回答一些问题
    13商软 《软件工程》课程设计 评分
    13商软 《软件工程》课程设计
    数独游戏的设计与实现 13商软《软件工程》补考题目
    期未总评分
    《软件工程》 团队项目展示
    20150616 最后一次冲刺
  • 原文地址:https://www.cnblogs.com/leeSmall/p/7709983.html
Copyright © 2020-2023  润新知