文章目录
一、Web项目介绍
web项目:通俗的说就是在服务器上跑的项目,页面是通过服务器上的程序运算所得到的的结果
Javaweb项目:用Java代码写的web项目
二、Web工程中项目分层介绍
POJO —— 实体类 com.openlab.pojo
DAO —— 数据链路层 com.openlab.dao
Service —— 业务层 【接口】 com.openlab.service
Impl —— 业务层 【接口的实现】com.openlab.service
servlet —— 控制层 controller
三、问什么要分层
- 为了方便项目管理,PMP项目管理
- 顶多能给你的是就是接口
- 类和类之间的松耦合
- 非常方便分工处理 方便代码的维护和扩展
- 面向对象思想 主要的要求就是让每一个类的功能都是单一化
- 提高代码的重复利用率
四、Web工程例题
连接数据库,完成数据库查询业务
1. JDBCUtil新改写的类中
1.2 单条记录的查询
步骤:
- 由于查询语句最终需要返回一个语句,但不确定是什么类型。——所以我们将其返回值设置为 Object 类(万物都是Object);
- 照常进行connection与statement的连接;
- 将传入sql语句利用statement类的executeQuery()方法来下达select指令以查询数据库;
- 最后将有数据库相应的查询结果ResultSet类对象,转化为Object类进行最终返回。
- 无论是否返回错误,都要关闭资源(放在finally中),最终在try外进行返回
//单条记录的查询
public Object QueryByOne(String sql){
Object obj = null;
try {
conn = getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
obj = rsToObj(rs);
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcClose(conn,st);
}
return list;
}
1.2 多条记录的查询
步骤:
- 与单条查询相似,但返回值为LIst ArrayList;
- 注意ResultSet转化为List函数与单句查询不同。
- 无论是否返回错误,都要关闭资源(放在finally中),最终在try外进行返回
//多条记录的查询 List ArrayList
public List QueryByAll(String sql){
List list = null;
try {
conn = getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
list = rsToList(rs);
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcClose(conn,st);
}
return list;
}
1.3 添加抽象方法
public abstract Object rsToObj(ResultSet rs);
public abstract List rsToList(ResultSet rs);
2. 确定需求后,建立工程
构建相应包
com.openlab.pojo
com.openlab.dao
com.openlab.service
com.openlab.service.impl
2.1 构建实体类 com.openlab.pojo
步骤:
- 创建自己的雇员实体类
- 实现其构造,get,set,Tostring方法
//领域对象层
public class Employee {
private String username;
private int age;
private float salary;
public Employee() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee{" +
"username='" + username + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
2.2 创建业务接口 com.openlab.service
步骤:
- 编写业务将要实现的的方法接口
- 注意返回类型根据输出有所不同
- 传入参数类型无特殊要求,age的int也可改为String
//业务层接口
public interface EmployeeService{
public Employee queryByusername(String username);
public List queryByage(int age);
public Employee queryBysalary(float salary);
}
2.3 数据链路层 com.openlab.dao
由于我们写的JDBCUtils 是抽象类,无法自身实现实例化,所以我们利用数据链路层进行实例化。
步骤:
- 继承JDBCUTils 实现其抽象方法
- 创建雇员对象
- 利用pojo中的方法,如果其有值,进行输出
- 注意返回值为Object与List,要进行转化
- 注意单条与多条查询,在判断有无值输出时,单条为 if 判断,多条为 while 判断
- 注意:在多记录查询中,List表的添加方式与单记录有所不同
//数据链路层
public class EmployeeServiceDao extends JDBCUtil{
@Override
public Object rsToObj(ResultSet rs) {
Object obj = null;
try {
Employee emp = new Employee();
if(rs.next()){
emp.setUsername(rs.getString("username"));
emp.setAge(rs.getInt("age"));
emp.setSalary(rs.getFloat("salary"));
obj = emp;
}
} catch (SQLException e) {
e.printStackTrace();
}
return obj;
}
@Override
public List rsToList(ResultSet rs) {
List list = new ArrayList();
try {
Employee emp = new Employee();
while(rs.next()){
emp.setUsername(rs.getString("username"));
emp.setAge(rs.getInt("age"));
emp.setSalary(rs.getFloat("salary"));
list.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
2.4 业务接口实现com.openlab.service.impl
步骤:
- 创建数据链路层对象,方便调用
- 完善SQL查询语句
- 调用数据链路层Dao中的方法进行ResultSet与Object之间的转换
- 最终根据所要输出的类型将Object转成所需对应类型,并进行返回
- 注意注意注意!!:float由于自身原因,无法进行精确查找,当查询语句为select * from tb1 where salary=23000.3;时查询结果为null,由于float无法进行精确查询,详情请看下文。
public class EmployeeServiceimpl implements EmployeeService {
EmployeeServiceDao edao = new EmployeeServiceDao();
@Override
public Employee queryByusername(String username) {
String sql = "select * from tb1 where username='"+username+"'";
Object o = edao.QueryByOne(sql);
Employee emp = (Employee) o;
return emp;
}
@Override
public List queryByage(int age) {
String sql = "select * from tb1 where age='"+age+"'";
List list = edao.QueryByAll(sql);
return list;
}
@Override
public Employee queryBysalary(float salary) {
String sql = "select * from tb1 where salary like "+salary;
Object o = edao.QueryByOne(sql);
Employee emp = (Employee) o;
return emp;
}
}
2.5 测试 com.openlab.test
public class EmployeeServiceImplTest {
EmployeeServiceimpl eimpl = new EmployeeServiceimpl();
@Test
public void test(){
Employee e = eimpl.queryByusername("zhangsan");
System.out.println(e);
//或者运用该方法,前者为期望中的值,后者为实际中的值,将其进行比对
TestCase.assertEquals("zhangsan",e.getUsername());
}
@Test
public void test1(){
List list = eimpl.queryByage(23);
System.out.println(list);
TestCase.assertEquals(2,list.size());
}
@Test
public void test2(){
Employee e = eimpl.queryBysalary(23000.3f);
System.out.println(e);
}
}
附: MySQL中的float,double字段,查询为null??
在MySQL中,字段类型为Float的字段,如果不指定FLoat的长度和小数位数,要根据float字段的值精确查找,结果会为空。
是由于类似于直接 “ = ” 这种精确查找,是查不到任何结果的。
原因:在MySQL中,float是福电视,MySQL存储的时候是近似值,所以用精确查找无法匹配;但是可以用like匹配。
select * from tb1 where salary like 23000.3;
select * from tb1 where salary like '23000.3';
select * from tb1 where salary like '%23000.3%';
select * from tb1 where salary like '23000.3%';
同理, 以上四种均可以查到结果。