关于java:数据库CRUD封装

5次阅读

共计 3338 个字符,预计需要花费 9 分钟才能阅读完成。

数据库 CRUD 封装

在一个我的项目中, 咱们会进行后盾数据库的连贯。所以会频繁的应用数据库的 CRUD 操作,所以咱们能不能抽取公共局部,并造成一个工具类呢?咱们来试试。

  1. CRUD 办法封装
public class CRUDUtils {
/**
    * @Description: 增删改的 sql 封装
    * @Param: [sql: 具体的 sql 语句; params: 字段信息 ( 应用 prepareStatement)]
    * @return: int
    */
public static int update(String sql,Object... params){
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1. 获取连贯,DbUtil 工具类的获取见开端文章。con = DbUtil.getConn();
            //2. 预处理 sql 语句
            ps = con.prepareStatement(sql);
            //3.params.length 获取可变长度的长度,进行?填充
            for (int i = 0; i < params.length; i++) {ps.setObject(i + 1,params[i]);
            }
            /*4. 返回执行后果 (int), 数字是受影响的行数, 如果为 0 示意一行数据都没有影响到, 不代表数据库执行错 */
            return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();
            // 这个就是执行失败返回 0
            return 0;
        }finally {
            try {
                //5. 数据源敞开
                DbUtil.release(con,ps,rs);
            } catch (Exception e) {e.printStackTrace();
            }
        }
        return 0;
    }
    
    /**
    * @Description: 封装查问语句
    * @Param: [sql: 查问的 sql 语句, handler: 接口, 能够指定传入的对象类型, params: 字段信息 ( 应用            * prepareStatement)]
    * @return: T
    */
    public static <T> T query(String sql, IResultSetHandler<T> handler, Object... params) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1. 获取连贯
            con = DbUtil.getConn();
            //2. 执行查问
            ps = con.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {ps.setObject(i + 1,params[i]);
            }
            rs = ps.executeQuery();
            return handler.handle(rs);
        } catch (Exception e) {e.printStackTrace();
        } finally {DbUtil.release(con,ps,rs);
        }
        return null;
    }
}
  1. handler 接口
public interface IResultSetHandler <T>{

    /**
    * @Description: 接口中形象办法, 实现对后果集的解决, 返回所指定的类型
    * @Param: [rs]
    * @return: T
    */
    T handle(ResultSet rs) throws Exception;
}
  1. 接口实现类一,bean
/**
 * @description: IResultSetHandler 的实现类之一, 返回一个 javaBean
 **/
public class BeanHandler<T> implements IResultSetHandler<T> {
    private Class<T> clazz;

    /** 获取传进来的类对象的字节码信息 */
    public BeanHandler(Class<T> clazz) {this.clazz = clazz;}


    @Override
    public T handle(ResultSet rs) throws Exception {
        // 如果查到了货色
        if (rs.next()) {
            // 首先先依据字节码信息创建对象, 等会返回
            T obj = clazz.newInstance();
            // 再拿到类的信息
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
            // 拿到类中的属性形容器
            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
            // 遍历形容器, 进行获取查问后果的对象信息进行封装
            for (PropertyDescriptor pd : pds) {
                // 获取查问后果集的对应字段的信息
                String name = pd.getName();

                Object object = rs.getObject(pd.getName());

                // 通过调用 setter 写进信息
                pd.getWriteMethod().invoke(obj,object);
            }
            return obj;
        }
        // 查不到间接返回 null
        return null;
    }
}
  1. 接口实现类二,beanList
/**
 * @program: Dream01
 * @description: IResultSetHandler 的实现类之一, 返回一个 javaBean 汇合
 * @author: stop.yc
 * @create: 2022-03-29 22:28
 **/
public class BeanListHandle<T> implements IResultSetHandler<List<T>> {
    private Class<T> clazz;

    // 获取以后对象的字节码信息
    public BeanListHandle(Class<T> clazz) {this.clazz = clazz;}

    @Override
    public List<T> handle(ResultSet rs) throws Exception {
        // 通过字节码信息获取类的信息
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
        // 再通过类获取属性形容器, 比方 getter,setter 这些
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        // 类的列表
        List<T>list = new ArrayList<>();
        // 进行遍历
        while(rs.next()) {
            // 通过对象信息创建对象
            T obj = clazz.newInstance();

            for (PropertyDescriptor pd : pds) {
                // 获取对应字段的信息
                Object object = rs.getObject(pd.getName());
                // 获取 setter
                pd.getWriteMethod().invoke(obj,object);
            }
            list.add(obj);
        }
        return list;
    }
}
  1. 主函数测试
public class Main {public static void main(String[] args) {

           String qSql = "select * from `t_user` where `userName`=?";
        String userName = "张三";
        //User 为自定义的类.
        User user = CRUDUtils.query(qSql,new BeanHandler<>(User.class),userName);
        
        String sql = "select * from `t_user` where `gender`=0";
          //List<User> list = CRUDUtils.query(sql,new BeanListHandle<>(User.class));
        
        //update 语句都行, 这里只展现一种
        String updateSql = "isnert into `t_user` (`userName`,`gender`) values (' 李四 ',' 男 ')";
        int ret = CRUDUtils.update(updateSql);
    }
}

文章中工具类地址 数据库工具类

正文完
 0