/**
* @author Mr.Deng
* @since 2016-5-14
* @version 1.0
*使用notepad打开方便阅读
*欢迎纠正错误,写下自己的见解
*/                                


项目描述:用户登录可以管理对自己的通信录信息进行管理.

项目依赖软件:mysql eclipse.

项目依赖技术:javaSE , JDBC, swing组件   

                                              
1.架构:3层架构

    1.展示层:1.用户只能对自己和自己的通讯录进行操作(私人权限)
              2.使用java GUI图像界面:
                                1.登录注册主页面界面
                                2.注册页面
                                3.功能页面:按上中下3层界面布局:
                                                         1.上:欢迎窗口
                                                         2.中:展示用户所有通讯录信息详情
                                                         3.下:用户对通讯录操作的按钮                                                                                
      
    2.业务层:1.后台人员对所有用户进行操作(管理员权限)
              2.使用java编写后台程序:编写接口和实现类实现类通过调用持久层编写的接口实现功能
                 
    3.持久层:1.java程序员通过编写源代码实现各种操作(造物主)
              2.使用JDBC连接数据库保存数据
              3.使用配置文件连接JDBC,假如修改了数据库。只需要修改配置文件不需要修改源代码
                           
具体实现:3层架构每层通过接口进行连接(依赖关系)
            
        1.展示层---业务层:1.接口:UsersService,ContactsService
                           2.实现类:UsersServiceImpl,ContactsServiceImpl
                        
        作用:展示层获得的数据或操作传入到业务层
              业务层流程:1.调用持久层的接口
                          2.创建接口对象
                          3.调用接口对象身上的方法进行数据操作
        
        原理:1.接口只定义方法体,没有实现细节,不能直接创建对象
              2.ContactDaoImpl类是实现类,重写了接口的所有方法,并且有实现细节
              3.通过创建实现类对象,实例化接口。接口就可以调用所有实现类的方法,进行操作              
              ContactDao ctd = new ContactDaoImpl();                          
       
       
      2.业务层---持久层:1.接口:UsersDao                       
                         2.实现类:UsersDaoImpl                        
        作用:对数据进行各种操作并放入数据库中
                        
        原理:1.通讯录和用户对象随着方法的调用而存在,方法调用结束对象消失。
              2.对象存在于内存,通过JDBC连接数据库就可以将对象身上的属性保存起来。
                             
      3.持久层---展示层:持久层的所有功能依赖于展示层获得的数据
                         没有数据持久层的存在没有意义      
                          没有持久层的功能实现,展示层也没有任何意义
                       
2.包命名规范:
         1.持久层:1.com.lovo.contacts.bean:实体包存放所有的实体对象,Users,contactsdetail遵循javabean规范,实现序列化接口Serializable
                   2.com.lovo.contacts.dao:接口包存放持久层的所有接口    
                   3.com.lovo.contacts.dao.impl:实现类存放所有实现了dao包接口的类
                   4.com.lovo.contacts.util:工具包存放所有持久层代码需要的工具 如文件,DBUtil
                   
         2.业务层:1.com.lovo.contacts.service:业务层包存放所有业务层接口 UsersService,ContactsService                   
                   2.com.lovo.contacts.service.impl:实现类包存放所有实现业务层包接口的实现类
        
         3.展示层:com.lovo.contacts.gui:图形界面包存放所有界面类
        
         4.javabean规范:1.公共的类
                         2.属性私有化
                         3.提供公共的get,set方法
                         4.不带参的构造方法
                         5.实现序列化接口Serializable
                   
总结:1.命名规范化保证项目的可理解性,方便管理。项目由多个程序员编写一个好的命名规范和结构方便更改实现同步编写
      2.每个项目有自己的命名规范,大体一致
      

                       
3.各方法块代码流程:1.获取数据库连接:Connection con = DBUtil.getconnection
                    2.编写SQL语句,使用问号防止SQL注入
                       3.创建预编译处理对象:PreparedStatement pstmt = con.prepardStatement(sql);
                      4.更改问号的值
                    5.执行sql语句:
                             1.增:1.(sql, PreparedStatement.RETURN_GENERATED_KEYS)保证主键自增长,
                                   2.获取对象身上的值,设置到数据库相应的字段中
                                   3.获取数据库结果集,判断将第一个对象的ID设置成1,多个对象实现自增长
                                   4.关闭连接
                                   
                             2.查:1.查询所有字段的值放入结果集,条件id=? and status=1 1表示存在
                                   2.创建新的contactdetail对象,
                                   3.将结果集相应的值设置到contactdetail对象身上
                                   4.关闭连接
                                   
                             3.删:1.status字段表示表的状态,根据查询语句只有status=1时 用户才能查询到这张表
                                   2.设置status=0 用户就不能查询到这张表。逻辑删除:数据还存在,只是用户查询不到。物理删除:数据从数据库消失
                                   3.更新数据库
                                   4.关闭连接
                                   
                             4.改:1.用户传入contactdetail对象,有些字段的值是修改过的
                                   2.获取contactdetail对象身上的值
                                   3.对数据库里contactdetail里字段的每一个字段的值进行覆盖
                                   4.关闭连接

扩展:
    1.自定义异常:1.定义异常类继承Exception的属性和方法
                  2.提供带参和不参的构造方法    
                    public NameNotFoundException() {}
                    public NameNotFoundException(String message) {super(message);}    
                  3.判断语句如果用户名不正确 throw new NameNotFoundException("用户名不存在");
    
    2.try{}finally{}作用:保证try块内发生异常都能执行finally块里的内容                  
                                   
总结:1.对数据库里的数据进行修改后,需要更新。查询不需要
      2.先分析功能理清思路,再写流程注释。最后根据流程注释填充代码。
      3.根据返回类型,参数列表。灵活编写代码,万变不离其宗
                                    

4.时间转换:    
    1.util.date---sql.date:     
        1.获取Contact对象身上的时间毫秒数,如果没有获取系统时间的毫秒数,三元运算符:条件 ?表达式1(true): 表达式2(false)
           long time = detail.getCreateTime() == null ? System.currentTimeMillis() : detail.getCreateTime().getTime();
        2. 调用sql.date类的带参构造方法将时间毫秒数传入获取sql包的时间    
           new Date(time))
    2.sql.date---util.date:
        1.获取sql.date的毫秒数,将其作为参数传入util.date的构造方法类
         new java.util.Date(rs.getDate("d.createtime").getTime())

5.属性对象:1.sql user表 与 detail表是1对多关系, 一个用户可以有多个通讯录
          2. 在contactdetail类放一个user对象,将user类与contactdetail类连接
             user.getid() = contactdetail.getuser().getid()          
             实现java user类与contactdetail类 1对多关系
        
 sql.userid----contact.user
       1.创建user对象
       2.将userid设置到user对象身上
       3.分析 user的set方法参数是user对象,将创建的对象传入user的set方法
       
6.二维数组:在业务层定义方法getAllContact 返回类型:Object[][] 参数:useid        
        1.获取contactdetail对象的集合
          List list = cd.queryContactListByUser(userId);
        2.定义数组长度,第一个字段表示通讯录实体的个数,第2个字段表示通讯录的信息个数
          Object[][] datas = new Object[list.size()][8];
        3. 循环数组 循环一次第一个括号+1,第2个括号挨个放入通讯录信息
            for (int i = 0; i < list.size(); i++) {
            ContactDetail detail = list.get(i);
            datas[i][0] = detail.getId();
            datas[i][1] = detail.getName();
            。。。。。。。。。。。。。。。。}
        4.返回 datas     
        
eclipse:导入项目:file---import---Existing Projects into Workspace---选择项目路径---finish        
        导入图片:项目名---src---general---file system---文件路径---选择图片--finish---把图片移动到lib包
        生成文档:项目右键---export---java---javadoc---选择生成路径---finish
        java架包:项目右键---export---java---jar file选择生成路径----架包名---finish
        导入架包:复制架包到项目---build path
        界面插件使用:类右键---open with---windowbuilder editor---左下角Design按钮