JDBC分层开发

为了更明了的安全的操作数据库数据,我们将用户通过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文件参数,到实现接口继承抽象类,再到实现类的完成访问功能,是一个典型的使用面向对象编程的步骤,包括了封装继承多态,对重复代码的提取封装,代码分工明确,思路明了,在以后的学习中我们会慢慢体会到分层开发的代码之美.

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值