心得:

1、实例变量、字段、属性的区分

  • ```java private String signInName ; // 字段(实例变量) //在一个实体类中,成员变量为 字段(实例变量)

// getLoginName() ==> 去掉get和参数部分 ==> LoginName ==> 首字母小写 ==> loginName (这个才是属性(property)) public String getLoginName() { return signInName; }

  1. **<br />**2、数据库**
  2. 1、数据库中使用 来存储数据,比如 t_students 表用来存储学生信息
  3. 2、在数据库的表 中,使用一行数据表示一个学生信息,每一行数据被称作一个记录(Record)
  4. 3、与数据库中的表对应的类,就是 实体类 ( entity class )
  5. 4、实体类的对象的属性(**property**)与数据库中的**字段**对应
  6. <a name="53a63570"></a>
  7. ## 试卷考务系统
  8. <a name="803ba647"></a>
  9. ### 1、实例对象和数据库的设计
  10. - **Module**<br />1Module 表示课程模块,对应数据库中的 t_modules 表<br />2、模块可以有父模块,所以在该类的设计中增加了一个 parent 成员,它表示自己的父模块<br />3、模块可以有子模块,所以在该类的设计中增加了一个 modules 成员,它表示自己的个子模块组成的集合
  11. ```java
  12. private Integer id ; // 对象标识符(与数据库主键对应)
  13. private String name ; // 当前模块的名称
  14. private Integer position ; // 将来页面上显示模块时模块的当前模块在同一级模块的位
  15. private Module parent ; // 当前模块的父模块
  16. private List<Module> modules ; // 当前模块的子模块
  • Option
    1、Option 表示选择题的选项,对应数据库中的 t_options 表
    2、选项是属于某个题目的,所以在该类的设计中增加了一个 topic 成员,它表示该选项所属的题目
private Integer id ; // 对象标识符(与数据库主键对应)
private String content ; // 选项内容
private String code ; // 选项需要使用的程序代码
// 如果key取值为true则表示该选项是正确答案,否则表示该选项不是正确答案
private boolean key ; // 指示当前选项在该题目中是否是正确答案
private Topic topic ; // 当前选项属于哪个题目
  • Topic
    1、Topic 表示题目,对应数据库中的 t_topics 表
    2、题目是属于某个模块下的,所以在该类的设计中增加了一个 module 成员,它表示该题目所属的父模块
    3、对于选择题来说,一个选择题可能对应多个选项,因此这里声明了 options 成员,它表示该题目所有选项组成的集合
private Integer id ; // 对象标识符(与数据库主键对应)
private String title ; // 题目标题
private Integer score ; // 参考分数
private Integer level ; // 题目难易程度 (比如1表示最低难度、5表示最大难度)
private String code ; // 题目需要使用的程序代码
private Module module ; // 当前题目所属的模块
private List<Option> options ; // 当前题目的选项

数据库的测试

test.sql

-- 查询1模块下的包含所有子模块的题目
select * from t_topics where module_id IN ( select id from t_modules where parent_id = 1 ) ;

先进行IN中的语句

image.png

Dao数据库的操作

心得:现在才发现mybatis的操作原来这么简单,

mybatis直接封装了在老师讲解中的RowMapper方法,将结果集封装到实体类中。

1、TopicDao

1、根据编号查询题目

/**
     * 根据用户指定的题目编号查询数据库后返回与数据库表中相应记录对应额Topic对象
     * @param id 需要查询的题目编号(即数据库主键)
     * @return 返回与数据库表中相应记录对应额Topic对象
     */
public Topic find( Integer id )

2、查询所有moduleId的题目

/**
     * 查询所有moduleId的题目
     * @param moduleId  模块id
     * @return  所有topic题目的列表
     */
public List<Topic> findByModule( int moduleId )

3、添加题目

  • IFNULL的用法 | 1 | IFNULL(expr1,expr2) | | —- | —- | | | |

如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。

在保存题目的过程中,topic对象必须存在id,所以使用 ifnull为topic对象设置max(id)+1 or 0

/**
     * 将单个题目保存到t_topics表中
     * @param t 被保存的题目
     * @return 当保存成功时返回true
     */
    public boolean save( Topic t ) {
        JdbcHelper h = JdbcHelper.getInstance( DatabaseType.MYSQL );
        //NEXT_ID_QUERY = "SELECT ifnull( max(id) , 0 ) + 1 AS next_id FROM t_topics ";
        Integer id = h.single( NEXT_ID_QUERY , idMapper );
        t.setId( id ); // 注意,这里一定要记得设置,否则 Option 在保存时无法获得相应的Topic的id

        Module module = t.getModule() ;
        Object[] params = { id , t.getTitle() , t.getScore() , t.getLevel() , t.getCode() , module.getId() };
        int count = h.update( INSERT , params );
        h.release();

        return count == 1 ;
    }

2、OptionDao

1、根据题目id 获取到 改题目的选项列表

    /**
     * 根据题目id 获取到 改题目的选项列表
     * @param topicId
     * @return
     */
public List<Option> findByTopicId( int topicId )

2、option选项列表的保存

/**
 * 选项的保存
 * @param options
 */
public void save( List<Option> options ) {
    if( options == null || options.isEmpty() ) {
        throw new RuntimeException( "选项不能为空" );
    }
    JdbcHelper h = JdbcHelper.getInstance( DatabaseType.MYSQL );
    for ( Option op : options ) {
        String key = op.isKey() ? "T" : "F" ;
        Topic topic = op.getTopic();
        h.update( INSERT , op.getContent() , op.getCode() , key , topic.getId() );
    }
    h.release();
}

Service业务逻辑

TopicService

1、根据moduleId查询所有模块下的题目

  • 先查询到List< Topic >
  • 再为topic查询对应的选项列表List< Option>并且,设置到topic对象里面去
  • 最后返回 携带选项列表的题目列表

联想Mybaits中的 resultMap标签中的 association子标签

public List<Topic> loadTopics( int moduleId ){

    // 根据模块查询题目(仅查询题目,不包含题目下的选项)
    List<Topic> topics = topicDao.findByModule( moduleId );

    // 迭代List集合,为每个题目查询选项
    for( Topic t :topics ) {
        int topicId = t.getId() ;
        List<Option> options = optionDao.findByTopicId( topicId );
        t.setOptions( options );
    }
    return topics ;
}

2、保存题目,和题目携带的选项

  • 保存单个题目到数据库中
  • 获取题目t的选项列表,将options列表保存到数据库
public boolean saveTopic( Topic t ) {
    topicDao.save( t ); // 保存单个题目到数据库中

    List<Option> list = t.getOptions() ;
    optionDao.save( list ); // 将一批Option对象保存到数据库

    return true ;
}