将重复代码提取写一个BaseDao用来简化dao

来了来了,又是偷懒摸鱼的一天!!!

在这里插入图片描述

初学没有接触到MyBatis时,用来避免大量重复书写DAO(Data Access Object)操作,将重复操作提取出来的BaseDao。
package dao;

import java.io.File;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BaseDAO<T> {
    Connection conn;
    PreparedStatement ps;
    ResultSet rs;

    public void updata(String sql, Object[] params) {/*params 参数*/
        try {
            //获得链接对象
            conn = JdbcUtils.getConn();
            //获得声明
            ps = conn.prepareStatement(sql);
            //设置参数
            for (int i = 0; i < params.length; i++) {/*数组从0开始*/
                ps.setObject(i + 1, params[i]);/* ?从1开始 */
            }
            //执行sql语句
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.closeAll(null, ps, conn);
        }
    }

    public List<T> select(String sql, Object[] params, Class c) {
        List<T> list = new ArrayList<>();
        try {
            //获得链接对象
            conn = JdbcUtils.getConn();
            //获得statement
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }
            //执行
            rs = ps.executeQuery();
            Field[] fields=c.getDeclaredFields();/*声明所有字段*/
            while (rs.next()){
                Object obj=c.newInstance();
                for(Field field:fields) {
                    String fieldName = field.getName();
                    field.setAccessible(true);
                    field.set(obj,rs.getObject(fieldName));
                }
                list.add((T) obj);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }finally {
            //关闭链接
            JdbcUtils.closeAll(rs, ps, conn);
        }
        return list;
    }
}

一个员工dao

package dao;

import entity.Emp;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

public class EmpDao {
    BaseDAO<Emp> baseDAO=new BaseDAO<>();

    /**
     * 员工新增。
     * @param emp
     */
    public void sava(Emp emp){
        //声明sql语句
        String sql="insert into emp value(?,?,?,?,?,?,?,?)";
        Object[] params={emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno()};
        baseDAO.updata(sql, params);
    }
    /**
     * 修改
     * @param emp
     */
    public void update(Emp emp){
        String sql="update emp set ename=? job=? mgr=? hiredate=? sal=? comm=? deptno=? where empno=?";
        Object[] params={emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno()};
        baseDAO.updata(sql, params);
    }

    /**
     *  更改员工部门
     * @param emp
     */
    public void changeDept(Emp emp){
        String sql="update emp set deptno=? where empno=?";
        Object[] params={emp.getDeptno(),emp.getEmpno()};
        baseDAO.updata(sql, params);
    }

    /**
     * 员工涨工资。
     * @param emp
     */
    public void changeSal(Emp emp){
        String sql="update emp set sal=? where empno=?";
        Object[] params={emp.getSal(),emp.getEmpno()};
        baseDAO.updata(sql, params);
    }

    /**
     * id查看详情
     * @param emp
     */
    public void findById(Emp emp){
        String sql = "select  * from  student where  empno=? ";
        Object[] params={emp.getSal(),emp.getEmpno()};
        baseDAO.updata(sql, params);
    }

    /**
     * 员工换上级。
     * @param emp
     */
    public void changeMgr(Emp emp){
        String sql="update emp set mgr=? where empno=?";
        Object[] params={emp.getMgr(),emp.getEmpno()};
        baseDAO.updata(sql, params);

    }

    /**
     *  删除一个员工
     * @param emp
     */
    public void delEmp(Emp emp){
        String sql="delete from emp where empno=?";
        Object[] params={emp.getEmpno()};
        baseDAO.updata(sql, params);
    }

    /**
     * 批量删除员工(复选框)
     * @param emps
     */
    public void delEmps(Emp[] emps){
        for (int i = 0; i < emps.length; i++) {
            String sql="delete from emp where empno=?";
            Object[] params={emps[i].getEmpno()};
            baseDAO.updata(sql, params);
        }
    }

    /**
     *  按工资区间查找员工信息(可以填一个、也可以都填)。
     * @param less
     * @param more
     * @return
     */
    public List<Emp> findBySal(Integer less,Integer more){
        String sql="SELECT * FROM emp where "+less+"<sal and sal<"+more+"";
        Object[] params={};
        List<Emp> empList=baseDAO.select(sql, params, Emp.class);
        return empList;
    }
    public List<Emp> findBySal(Integer less){
        return findBySal(less, 20000);
    }

    public List<Emp> findSal(Integer less){
        String sql="select * from emp where sal >=? ";
        Object[] params={};
        List<Emp> empList=baseDAO.select(sql, params, Emp.class);
        return empList;
    }

    /**
     * 查看所有
     * @return
     */
    public List<Emp> findAll(){
        String sql = "select * from emp";
        Object[] params = {};
        List<Emp> empList = baseDAO.select(sql, params, Emp.class);
        return empList;
    }

    //测试
    public static void main(String[] args) {
        EmpDao empDao=new EmpDao();
//        empDao.changeDept();
		List<Emp> deptList = empDao.findBySal(2000);
		for(Emp emp:deptList) {
			System.out.println(emp.getEname());
		}
    }
}
相比较之前实体dao少了许多,当然在用MyBatis后,md真香,写的更少。对于还没有学到框架的小伙伴,这不失为一种便利方法,多动脑,能省事则省,能少写就少写,但是偷懒是为了多学!!!!!
最后简单介绍一下使用泛型:

泛型用于类的定义中,在实例化时,指定T的具体类型就可以使用。在定义泛型时,不传入泛型类型的实参的话,在泛型类中使用的泛型方法或者成员变量定义的类型可以为任何类型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值