三层架构:
用户层UI
服务层Service
数据层DAO
UI—->服务层—–>DAO层—–>数据库
UI<—-服务层<—–DAO层<—–数据库
web项目结构(IDEA):
DAO层:
DAO层操作数据库—->数据库连接池JDBC、C3P0——–>数据库MySQL
1:导入依赖的jar包,在WEB层里面,WEB-INFO/lib目录下面。
2:在domain中创建数据库中表对应的实体类。(传递数据)
2:在具体实现类中,操作流程如下:
- 继承DAO层父级接口
- 重写实现方法
- 获取连接池对象(请配置好对应的c3p0-config.xml文件)在实现方法中:
1
QueryRunner qr=new QueryRunner(JDBCUtil.dataSource);
DML—–>qr.update()
DQL——>qr.query()1
2
3
4
5
6//qr.query(sql语句,resultset结果集处理方式,Object... paramsql中有几个?就应该给几个实参)
/**
* sql:select 结果分为三种情况
* 1. 查询结果是多行多列 BeanListHandler<表对应的java类型>
* 2. 查询结果是单行多列 BeanHandler<表对应的java类型>
* 3. 查询结果是单行单列,一般是聚合函数 select count() from sum() max() min() avg() ScalarHandler===>Object1
返回值 int 参数(sql语句,Object... paramsql)
服务层Service:
承上启下,中间过渡。
- 定义接口和实现类
- 接口可以复制同名的DAO层接口(可以适当的修改方法名,方便前端调用)
- 在具体实现类中,操作流程如下:在具体的方法里面直接调用DaoImpl对象的方法即可。
1
UserDao userdao = new UserDaoImpl();
当然也可以写入逻辑内容,比如判断传递的数据是否合法。
用户层UI:
在开始写页面前,强烈建议先测试前面的功能是否已经完成无误。
在WEB下面新建网页,开始写前端页面,通过servlet组件来传递数据。
- 写一个功能名+servlet的类,使其继承Servlet接口或其子类如HttpServlet等。
- 操作如下:
1
2
3
4
5
6
7HttpServletRequest:获取请求对象
HttpServletResponse:获取响应对象
1:使用HttpServletRequest对象获取用户传递的信息
2:创建domain里的对象来保存用户传递的信息
3:创建ServiceImpl对象,调用方法,获得返回值
4:使用HttpServletResponse对象的getWriter()方法创建PrintWriter对象
5:使用PrintWriter对象将返回内容显示给前端网页配置文件web.xml:1
2
31:获取传递的信息
2:处理信息(封装成类,验证合法,传递后台)
3:返回处理的结果1
2
3
4
5
6
7
8<servlet>
<servlet-name>UserLoginServlet</servlet-name>
<servlet-class>servlet.UserLoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserLoginServlet</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
- 第2行和第6行的名字必须一样
- 第3行输入完整的引用名:包名.类名
- 第7行输入/起的别名(HTML中提交表单要用)
1
action:/虚拟路径名称/servlet配置的url-pattern
问题和猜想:
1:为什么要使用一个父接口对应一个实现类?
明明只需要一个实现类就可以完成的,为什么要多此一举?
1 | 可能是为了解耦,用接口隔离来实现的。 |
2:为什么要架构三层而不是两层?
1 | 因为如果服务层Service啥事不干的话,我们完全可以直接两层: |