为了更明了的安全的操作数据库数据,我们将用户通过java操作数据库管理系统更改数据库表数据的整个过程归纳为三层
-1.表示层:与用户交互,向业务层发送请求得到结果
-2.业务层:用来实现业务逻辑,比如登录注册(处理复杂的逻辑)
-3.数据访问层DAO层:实现对数据库的各种操作(增删改查)
我们在这里主要讲解dao层的分层开发(以oracle的emp表举例)
empmgr包:dao类(BaseDao,EmployeeDao,EmployeeDaoImpl):实现具体的操作数据库管理系统
entity包:存放实体类,根据数据库emp表编写对应实体类Employee
项目下新建一个文件:conn.properties,以键值对的形式存放数据库配置文件(driver=oracle.jdbc.driver.OracleDriver;url=jdbc:oracle:thin:@localhost:1521:orcl;user=scott;pwd=tiger)
下面直接上代码:
1.entity包下的实体类: Employee.java(省略)
2.dao包下的接口:EmployeeDao.java(根据业务需求编写,一般是增删改查)
pubic interface EmployeeDao{
//查询所有员工信息
public List selectAll();
//根据id查员工
public Employ selectById(int id);
//删除指定员工
public boolean deleteById(int id);
//增加新员工
public boolean insertEmp(Employ emp);
//更改员工薪水 --因为这个功能跟以上类似所以省略
public boolean updateEmp(int id,double sal);
}
3.dao子包 impl下的基类BaseDao.java(从EmployeeDaoImpl.java抽取的重复代码)
public class BaseDao{
private static String fileName = "conn.properties";
private static String url;
private static String user;
private static String driver;
private static String pwd;
static{
InputStream is = Thread.currentThread.getclass().getResourceAsStream(fileName
);
//生命一个properties对象
Properties pro = new Properties();
//把输入流is中的数据加载到pro中
pro.load(is);
//通过键读取文件中值得内容
url = pro.getProperties(url);
user = pro.getpropertier(user);
pwd = pro.getProperties(pwd);
driver = pro.getProperties(driver);
}
//获取连接
public Connection getConn(){
Class.forName(driver);
return DriverManager.getConnection(url,user,pwd);
}
//关闭资源
public void closeDBResourse(ResultSet rs,Connection conn , PreparedStatement pstmt){
if(rs!=null)rs.close();
if(conn!=null)conn.close();
if(pstmt!=null)pstmt.close();
}
//使用executeUpadate是抽取的共同部分
public void executeU(PrepaString sql,Object...params){
Connection conn = null;
PreparedStatement pstmt = null;
conn = getConn();
pstmt = conn.prepareStatement(sql);
for(int i=1;i<=params.length;i++){
pstmt.setObject(i,params[i-1]);
pstmt.executeUpdate();
}
closeDBResourse(null,pstmt,conn);
}
}
3.dao包下impl 实现类EmployeeDaoImpl.java,业务层操作此类完成对数据库的访问
public class EmployeeDaoImpl extends BaseDao implements EmployeeDao{
//查询所有员工信息
public List selectAll(){
Connection conn = getConn();
String sql = "select * from emp";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.execute();
List empList = new ArrayList();
while(rs.next()){
//根据构造方法获取对应的值
Employee emp = new Employee(rs.getInt("empno")...);
empList.add(emp);
}
closeDBResourse(rs,pstmt,conn);
return empList;
}
//按照id查询员工
public Employee selectById(int id){
Connection conn = genConn();
String sql = "select * from emp where empno = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,id);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
Employee emp = new Employee(rs.getInt(empno)...);
}
closeDBResourse(rs,pstmt,conn);
return emp;
}
//删除指定员工信息
public boolean deleteById(int id){
String sql = "delete from emp where empno = ?";
executeU(sql,id);//这里可以准备一个返回值判断执行成功失败
//return true;
}
//添加员工
public boolean insertEmp(Employee emp){
String sql = "insert into emp values(?,?,?,?,?,?)";
executeU(sql,emp.empno,emp.ename.......);
//return true;
}
}
以上代码就是对jdbc 数据访问层进行了简单的封装,从读取preporties文件参数,到实现接口继承抽象类,再到实现类的完成访问功能,是一个典型的使用面向对象编程的步骤,包括了封装继承多态,对重复代码的提取封装,代码分工明确,思路明了,在以后的学习中我们会慢慢体会到分层开发的代码之美.