JDBC分层开发

来源:互联网 发布:cnstorm和淘宝比哪个好 编辑:程序博客网 时间:2024/04/27 23:57

为了更明了的安全的操作数据库数据,我们将用户通过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<Employee> 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{    //从conn.properties读取配置文件中,在静态代码块中为了只读取一次    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<Employee> selectAll(){        Connection conn = getConn();        String sql = "select * from emp";        PreparedStatement pstmt = conn.prepareStatement(sql);        ResultSet rs = pstmt.execute();        List<Employee> empList = new ArrayList<Employee>();        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文件参数,到实现接口继承抽象类,再到实现类的完成访问功能,是一个典型的使用面向对象编程的步骤,包括了封装继承多态,对重复代码的提取封装,代码分工明确,思路明了,在以后的学习中我们会慢慢体会到分层开发的代码之美.

1 0
原创粉丝点击