add Contact class
重构 getAllContacts 用 Contact 替换之前的 Map
重构 getContactById，用 Contact 替换 Map
重构 getContactById，抽取给 Contact 赋值的代码
重构 getAllContacts，使用刚刚抽取的 getContactFromResultSet
重构 getContactById，没有找到指定的 Contact 就返回 null
重命名方法 getContactFromResultSet
为 createContactFromResultSet
重构 getAllContacts，把使用 ResultSet 的代码移动出来。
现在代码变成了明显的三部分，第一部分连接数据库并查询。
第二部分，使用 ResultSet。
第三部分，释放资源。
创建了 DatabaseManager，用于把数据库相关变量打包到一起
重构 getAllContacts，把 sql 查询语句提取到变量中
把创建数据库连接然后执行查询的代码抽取到方法中
把释放数据库资源的代码抽取到方法中
抽取方法：从 sql 查询结果获得所有的 Contact
重构 getAllContacts：inline 查询语句
重构 getContactById：使用刚刚创建的查询并获得所有contact的方法
提取方法：把获得查询结果中的第一个 Contact 的代码抽取出来