欢迎来到 IT实训基地-南通科迅教育
咨询电话:0513-81107100
JDBC实现客户关系管理系统模块
2017/3/16
南通科迅教育
342
南通IT培训机构哪家靠谱

这是一个使用JDBC技术来实现客户关系管理系统的案例。

vc架构的web项目">创建MVC架构的Web项目

在Eclipse中新创建一个day14_customer项目,导入项目所需要的开发包(jar包),创建项目所需要的包,在java开发中,架构的层次是以包的形式体现出来的。
项目所需要的开发包(jar包)

序号 开发包名称 描述
1 stl-1.2.jar jstl标签库和EL表达式依赖包
2 mysql-connector-java-5.1.38-bin.jar MySQL数据库驱动包
3 commons-beanutils-1.9.2.jar 工具类,用于处理bean对象
4 commons-logging-1.2.jar commons-beanutils-1.9.2.jar的依赖jar包
5 commons-collections-3.2.2.jar commons-beanutils-1.9.2.jar的依赖jar包

项目所需要的包

序号 包名 描述 所属层次
1 cn.itcast.domain 存放系统的JavaBean类(只包含简单的属性以及属性对应的get和set方法,不包含具体的业务处理方法),提供给【数据访问层】、【业务逻辑层】、【Web层】来使用 domain(域模型)层
2 cn.itcast.dao 存放访问数据库的操作接口类 数据访问层
3 cn.itcast.dao.impl 存放访问数据库的操作接口的实现类 数据访问层
4 cn.itcast.service 存放处理系统业务接口类 业务逻辑层
5 cn.itcast.service.impl 存放处理系统业务接口的实现类 业务逻辑层
6 cn.itcast.web.controller 存放作为系统控制器的Servlet(处理请求的servlet) Web层(表现层)
7 cn.itcast.utils 存放系统的通用工具类,提供给【数据访问层】、【业务逻辑层】、【Web层】来使用  

以上就是根据此项目的实际情况创建的包,可能还需要创建其他的包,这个得根据项目的需要来定了。
为应用创建相应库和表
根据如下数据库表customer的结构,在数据库中创建一张customer表。
这里写图片描述
建表SQL语句:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
create database day14_customer character set utf8 collate utf8_general_ci;
use day14_customer;
create table customer
(
    id varchar(40) primary key,
    name varchar(40) notnull,
    gender varchar(4) notnull,
    birthday date,
    cellphone varchar(20),
    email varchar(40),
    preference varchar(255),
    type varchar(100) notnull,
    description varchar(255)
);

除此之外,还应在src目录下创建一个db.properties文件,在db.properties中编写MySQL数据库的连接信息,内容如下所示:

?
1
2
3
4
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day14_customer
username=root
password=yezi

在WEB-INF目录下创建一个jsp目录,jsp目录存放系统的一些受保护(不允许用户直接通过URL地址访问)的jsp页面,用户要想访问这些受保护的jsp页面,一般来说只能通过cn.itcast.web.UI这个包里面的Servlet。但是在这个项目中我们在cn.itcast.web.UI这个包中并没有创建任何Servlet,关于要想访问这些受保护的jsp页面,后面会详细的介绍到
创建好的项目架构如下图所示:
这里写图片描述

分层架构的代码编写

分层架构的代码也是按照【域模型层(domain)】→【数据访问层(dao、dao.impl)】→【业务逻辑层(service、service.impl)】→【表现层(web.controller、web.UI、web.filter、web.listener)】→【工具类(util)】→【测试类(junit.test)】的顺序进行编写的。

开发domain层

在cn.itcast.domain包下创建一个Customer类。
这里写图片描述
Customer类具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
publicclassCustomer {
 
    privateString id;
    privateString name;
    privateString gender;
    privateDate birthday;
    privateString cellphone;
    privateString email;
    privateString preference;
    privateString type;
    privateString description;
 
    publicString getId() {
        returnid;
    }
    publicvoidsetId(String id) {
        this.id = id;
    }
    publicString getName() {
        returnname;
    }
    publicvoidsetName(String name) {
        this.name = name;
    }
    publicString getGender() {
        returngender;
    }
    publicvoidsetGender(String gender) {
        this.gender = gender;
    }
    publicDate getBirthday() {
        returnbirthday;
    }
    publicvoidsetBirthday(Date birthday) {
        this.birthday = birthday;
    }
    publicString getCellphone() {
        returncellphone;
    }
    publicvoidsetCellphone(String cellphone) {
        this.cellphone = cellphone;
    }
    publicString getEmail() {
        returnemail;
    }
    publicvoidsetEmail(String email) {
        this.email = email;
    }
    publicString getPreference() {
        returnpreference;
    }
    publicvoidsetPreference(String preference) {
        this.preference = preference;
    }
    publicString getType() {
        returntype;
    }
    publicvoidsetType(String type) {
        this.type = type;
    }
    publicString getDescription() {
        returndescription;
    }
    publicvoidsetDescription(String description) {
        this.description = description;
    }
 
}

开发数据访问层(dao、dao.impl)

在开发数据访问层时,由于要编写得到MySQL数据库链接和释放资源这些性质的操作,所以应该把他们放在一个工具类JdbcUtils中。在cn.itcast.utils包下创建一个JdbcUtils类。
这里写图片描述
JdbcUtils类的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
publicclassJdbcUtils {
 
    privatestaticProperties config =newProperties();
    // 静态代码块只执行一次,因为静态代码块在类加载时执行,类永远只加载一次
    static{
        try{
            config.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
            Class.forName(config.getProperty("driver"));
        }catch(Exception e) {
            /*
             * db.properties文件无法读取,那么整个应用程序无法连接数据库,
             * 驱动都加载不了,那么整个应用程序都无法工作,
             * 所以都应该抛一个错误(ExceptionInInitializerError)
             */
            thrownewExceptionInInitializerError(e);//
        }
    }
 
    publicstaticConnection getConnection()throwsSQLException {
        returnDriverManager.getConnection(config.getProperty("url"), config.getProperty("username"), config.getProperty("password"));
    }
 
    publicstaticvoidrelease(Connection conn, Statement st, ResultSet rs) {
 
        if(rs!=null) {
            try{
                rs.close();// 假设throw异常
            }catch(Exception e) {
                e.printStackTrace();// 只需在后台记录异常
            }
            rs =null;// 假设rs对象没有释放,将其置为null,该对象就变成垃圾,由Java垃圾回收器回收
        }
        if(st!=null) {
            try{
                st.close();// 假设throw异常
            }catch(Exception e) {
                e.printStackTrace();// 只需在后台记录异常
            }
            st =null;
        }
        if(conn!=null) {
            try{
                conn.close();
            }catch(Exception e) {
                e.printStackTrace();// 只需在后台记录异常
            }
        }
 
    }
}

在cn.itcast.dao包下创建一个CustomerDao接口类。
这里写图片描述
CustomerDao接口的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
publicinterfaceCustomerDao {
 
    voidadd(Customer c);
 
    voidupdate(Customer c);
 
    voiddelete(String id);
 
    Customer find(String id);
 
    List<customer> getAll();
 
}</customer>

对于接口中的方法定义,这个只能是根据具体的业务来分析需要定义哪些方法了,但是无论是多么复杂的业务,都离不开基本的CRUD(增删改查)操作,Dao层是直接和数据库交互的,所以Dao层的接口一般都会有增删改查这四种操作的相关方法。
接着应该编写CustomerDao接口的实现类——CustomerDaoImpl,其里面一般都会有增删改查这四种操作的相关方法,增删改查时,难免会发生异常,所以在实际开发中,最好每一个层都编写一个自定义异常,例如在Dao层(数据访问层)自定义一个异常类——DaoException。
在cn.itcast.exception包中创建异常类DaoException,如下:
这里写图片描述
DaoException类的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
publicclassDaoExceptionextendsRuntimeException {
 
    publicDaoException() {
        // TODO Auto-generated constructor stub
    }
 
    publicDaoException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }
 
    publicDaoException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }
 
    publicDaoException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }
 
    publicDaoException(String message, Throwable cause,booleanenableSuppression,booleanwritableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        // TODO Auto-generated constructor stub
    }
 
}

在cn.itcast.dao.impl包下创建一个CustomerDao接口的实现类——CustomerDaoImpl。
这里写图片描述
CustomerDaoImpl类的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
publicclassCustomerDaoImplimplementsCustomerDao {
 
    @Override
    publicvoidadd(Customer c) {
        Connection conn =null;
        PreparedStatement st =null;
        ResultSet rs =null;
        try{
            conn = JdbcUtils.getConnection();
            String sql ="insert into customer(id, name,gender,birthday,cellphone,email,preference,type,description) values(?,?,?,?,?,?,?,?,?)";
            st = conn.prepareStatement(sql);
            st.setString(1, c.getId());
            st.setString(2, c.getName());
            st.setString(3, c.getGender());
            st.setDate(4,newjava.sql.Date(c.getBirthday().getTime()));
            st.setString(5, c.getCellphone());
            st.setString(6, c.getEmail());
            st.setString(7, c.getPreference());
            st.setString(8, c.getType());
            st.setString(9, c.getDescription());
 
            st.executeUpdate();
        }catch(Exception e) {
            thrownewDaoException(e);
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }
 
    @Override
    publicvoidupdate(Customer c) {
        Connection conn =null;
        PreparedStatement st =null;
        ResultSet rs =null;
        try{
            conn = JdbcUtils.getConnection();
            String sql ="update customer set name=?,gender=?,birthday=?,cellphone=?,email=?,preference=?,type=?,description=? where id=?";
            st = conn.prepareStatement(sql);
 
            st.setString(1, c.getName());
            st.setString(2, c.getGender());
            st.setDate(3,newjava.sql.Date(c.getBirthday().getTime()));
            st.setString(4, c.getCellphone());
            st.setString(5, c.getEmail());
            st.setString(6, c.getPreference());
            st.setString(7, c.getType());
            st.setString(8, c.getDescription());
            st.setString(9, c.getId());
 
            st.executeUpdate();
        }catch(Exception e) {
            thrownewDaoException(e);
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }
 
    @Override
    publicvoiddelete(String id) {
        Connection conn =null;
        PreparedStatement st =null;
        ResultSet rs =null;
        try{
            conn = JdbcUtils.getConnection();
            String sql ="delete from customer where id=?";
            st = conn.prepareStatement(sql);
            st.setString(1, id);
            st.executeUpdate();
        }catch(Exception e) {
            thrownewDaoException(e);
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }
 
    @Override
    publicCustomer find(String id) {
        Connection conn =null;
        PreparedStatement st =null;
        ResultSet rs =null;
        try{
            conn = JdbcUtils.getConnection();
            String sql ="select * from customer where id=?";
            st = conn.prepareStatement(sql);
            st.setString(1, id);
            rs = st.executeQuery();
            if(rs.next()) {
                Customer c =newCustomer();
                c.setBirthday(rs.getDate("birthday"));
                c.setCellphone(rs.getString("cellphone"));
                c.setDescription(rs.getString("description"));
                c.setEmail(rs.getString("email"));
                c.setGender(rs.getString("gender"));
                c.setId(rs.getString("id"));
                c.setName(rs.getString("name"));
                c.setPreference(rs.getString("preference"));
                c.setType(rs.getString("type"));
                returnc;
            }
            returnnull;
        }catch(Exception e) {
            thrownewDaoException(e);
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }
 
    @Override
    publicList<customer> getAll() {
        Connection conn =null;
        PreparedStatement st =null;
        ResultSet rs =null;
        try{
            conn = JdbcUtils.getConnection();
            String sql ="select * from customer";
            st = conn.prepareStatement(sql);
            rs = st.executeQuery();
            List<customer> list =newArrayList<customer>();
            while(rs.next()) {
                Customer c =newCustomer();
                c.setBirthday(rs.getDate("birthday"));
                c.setCellphone(rs.getString("cellphone"));
                c.setDescription(rs.getString("description"));
                c.setEmail(rs.getString("email"));
                c.setGender(rs.getString("gender"));
                c.setId(rs.getString("id"));
                c.setName(rs.getString("name"));
                c.setPreference(rs.getString("preference"));
                c.setType(rs.getString("type"));
                list.add(c);
            }
            returnlist;
        }catch(Exception e) {
            thrownewDaoException(e);
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }
 
}</customer></customer></customer>

照理说,开发完数据访问层,一定要对程序已编写好的部分代码进行测试。但我们有信心以上代码都不会有任何问题,这点自信都没有,搞鬼啊!

开发service层(service层对web层提供所有的业务服务)

在cn.itcast.service包下创建一个BusinessService接口类。
这里写图片描述
BusinessService接口类的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//业务类,统一对web层提供所有服务
publicinterfaceBusinessService {
 
    voidaddCustomer(Customer c);
 
    voidupdateCustomer(Customer c);
 
    voiddeleteCustomer(String id);
 
    Customer findCustomer(String id);
 
    List<customer> getAllCustomer();
 
}</customer>

接着在cn.itcast.service.impl包下编写BusinessService接口的一个实现类——BusinessServiceImpl。
这里写图片描述
BusinessServiceImpl实现类的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * 此业务层代码很少,所以称为薄薄的业务层
 */
publicclassBusinessServiceImplimplementsBusinessService {
 
    privateCustomerDao dao =newCustomerDaoImpl();
 
    @Override
    publicvoidaddCustomer(Customer c) {
        dao.add(c);
    }
 
    @Override
    publicvoidupdateCustomer(Customer c) {
        dao.update(c);
    }
 
    @Override
    publicvoiddeleteCustomer(String id) {
        dao.delete(id);
    }
 
    @Override
    publicCustomer findCustomer(String id) {
        returndao.find(id);
    }
 
    @Override
    publicList<customer> getAllCustomer() {
        returndao.getAll();
    }
 
}</customer>

同理,开发完业务逻辑层,一定要对程序已编写好的部分代码进行测试,但我们有信心业务逻辑层的代码没有任何问题,所以我们略过测试这一步。

开发Web层

在一个项目中,开发Web层是最麻烦的,我们一定要有耐心哟。此客户关系管理系统的首页index.jsp,我们是采用分帧的方式来设计的,index.jsp代码如下:

?
1
2
<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

接着我们创建head.jsp页面,head.jsp代码如下:

?
1
2
<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

XXX客户关系管理系统


添加客户 查看客户

使用IE浏览器通过http://localhost:8080/day14_customer/链接访问该客户关系管理系统,显示如下:
这里写图片描述

开发添加客户的功能

在cn.itcast.utils包下创建一个WebUtils工具类,该工具类的功能就是封装客户端提交的表单数据到Customer对象中。
这里写图片描述
WebUtils工具类的具体代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
publicclassWebUtils {
 
    publicstatic<e> E request2Bean(HttpServletRequest request, Class<e> beanClass) {
 
        try{
            E bean = beanClass.newInstance();
 
            // 得到request里面所有数据
            Map<string,> map = request.getParameterMap();
 
            // 注册一个转换器
            ConvertUtils.register(newConverter() {
 
                @Override
                public<t> T convert(Class<t> type, Object value) {
                    if(value==null) {
                        returnnull;
                    }
                    String str = (String)value;
                    if(str.trim().equals("")) {
                        returnnull;
                    }
 
                    SimpleDateFormat df =newSimpleDateFormat("yyyy-MM-dd");
                    try{
                        return(T) df.parse(str);
                    }catch(ParseException e) {
                        thrownewRuntimeException(e);
                    }
                }
            }, Date.class);
 
            BeanUtils.populate(bean, map);// map{name=aa,password=abc,birthday=1990-10-09}     bean(name=aa,password=abc,birthday=Date)        
            returnbean;
        }catch(Exception e) {
            thrownewRuntimeException(e);
        }
 
    }
 
    // 产生全球唯一的id
    publicstaticString generateID() {
        returnUUID.randomUUID().toString();// UUID算法根据你系统的网卡的xx地址、CPU、机器的型号等等生成一个128位长的字符串,可以确保是全球唯一的。
    }
}</t></t></string,></e></e>
77
关闭
先学习,后交费申请表
每期5位名额
在线咨询
免费电话
QQ联系
先学习,后交费
TOP
您好,您想咨询哪门课程呢?
关于我们
机构简介
官方资讯
地理位置
联系我们
0513-91107100
周一至周六     8:30-21:00
微信扫我送教程
手机端访问
南通科迅教育信息咨询有限公司     苏ICP备15009282号     联系地址:江苏省南通市人民中路23-6号新亚大厦三楼             法律顾问:江苏瑞慈律师事务所     Copyright 2008-