ORM及封装通用的BaseDao实现通用的查询方法

什么是ORM

//根据id去查询数据
    public Yang selectYang(int select_id){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs =null;
        Yang table = null;
        try {
            conn = JdbcUtil.getConnection();
            String sql = "select * from yang where id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1,select_id);
            rs = ps.executeQuery();
            while (rs.next()){
                table = new Yang();
                table.setId(rs.getInt("id"));
                table.setName(rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeAll(ps,conn,rs);
        }
        return table;
    } 

比如上面这个查询操作,while循环里的内容称为ORM(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

上面的例子,我们是基于JDBC的方式去处理ORM的,下面,我们将其封装在通用的方法内

封装通用的BaseDao实现通用的查询方法

BaseDao接口

/**
 * 封装通用的BaseDao
 */
public interface BaseDao { 
    //封装一个查询操作
    /**
     *  <T> List<T>的两个T分别代表什么?
     *  第一个标志这个方法是泛型方法,第二个是List<T>是返回值。
     *  泛型方法返回值前必须带一个<T>,这是一种约定,表示该方法是泛型方法,否则报错。
     */
    //Class 是类的模板,不规定泛型是T,则默认会按照Object去执行
    public <T> List<T> executeFind(String sql, Object[] param,Class<T> clazz);
}

在BaseDaoImpl 接口实现类内实现查询方法

  /**
     * 完成通用查询的方法
     *
     *  注意:通用的查询方法内要求模型对象的属性名必须要和数据库中的列名相同
     */
    @Override
    public <T> List<T> executeFind(String sql, Object[] param, Class<T> clazz) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs =null;
        List<T> list = new ArrayList<>();
        try {
            conn = JDBC.bjsxt.JdbcUtil.getConnection();
            ps = conn.prepareStatement(sql);

            //得到参数的个数
            ParameterMetaData pmd = ps.getParameterMetaData();
            //绑定参数
            for (int i=0;i<pmd.getParameterCount();i++){
                ps.setObject(i+1,param[i]);
            }

            //处理结果集
            rs = ps.executeQuery();
            //获取结果集的信息
            ResultSetMetaData rsmd = rs.getMetaData();
            while (rs.next()){
                //完成ORM处理,通过jdk的反射
                T bean = clazz.newInstance();
                //通过循环处理结果集信息
                for (int i=0;i<rsmd.getColumnCount();i++){
                    /**
                     * 通过反射做值的处理 -- 使用阿帕奇的工具包commons-beanutils-1.7.0.jar,
                     * 该jar包同时依赖于commons-logging-1.2.jar包,需要同时导入
                     */
                    //先得到列名
                    String columnName = rsmd.getColumnName(i+1);
                    //获取列的值
                    Object value = rs.getObject(columnName);
                    //通过BeanUtil工具类将值放入到对象内
                    BeanUtils.setProperty(bean,columnName,value);
                }
                list.add(bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBC.bjsxt.JdbcUtil.closeAll(ps,conn,rs);
        }
        return list;
    }

在pojo包下创建Dept实体类

package JDBC.com.bjsxt.pojo;

public class Dept {
    private int id;
    private String name;
    public Dept(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public Dept() {
    }
    @Override
    public String toString() {
        return "Yang{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
} 

在Dao层的 DepartmentDao 接口内创建一个查询的抽象方法

 //查询方法
    public List<Dept> selectDeptAByLikeName(String deptName);

在DepartmentDaoImpl 接口实现类内实现查询抽象方法


    @Override
    public List<Dept> selectDeptAByLikeName(String deptName) {
        String sql = "select * from yang where name like ?";
        Object[] param = new Object[]{"%"+deptName+"%"};
        return this.executeFind(sql,param,Dept.class);
    }

在业务层,也就是service层,在DepartmentsSerivce接口内,创建一个抽象方法

public List<Dept> findDept(String deptName);

在DepartmentsServiceImpl接口实现类内,实现创建的抽象方法

    //查询信息
    @Override
    public List<Dept> findDept(String deptName) {
        DepartmentsDao deptDao = new DepartmentsDaoImpl();
        return deptDao.selectDeptAByLikeName(deptName);
    }

在Test测试类内进行测试

    public static void main(String[]args){ 
 
        DepartmentsSerivce ds = new DepartmentsServiceImpl();
        List<Dept> list = ds.findDept("n");
        for (Dept d:list){
            System.out.println(d.getId()+" "+d.getName());
        }
    }

输出结果:

在这里插入图片描述
这样,简化完成

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值