zoukankan      html  css  js  c++  java
  • Java通过JDBC封装通用DAO层

    在项目中,我们要不断的和数据库打交道,为了提高数据库操作的执行效率和增加代码的复用性,将重新封装一个Dao层,也就是数据访问层 ,用来访问数据库实现数据的持久化。

    虽然现在有不少数据持久化层的框架,但其配置文件还是比较麻烦的。

    Dao层设计

    Dao层操作通用的步骤:

    • 1.写SQL语句
    • 2.获取连接
    • 3.创建stmt
    • 4.执行sql

    a)更新
    String sql = “delete from temp where id=?””;
    String sql = “insert into temp(id,name) values (?,?)”
    public void update(String sql, Object[] paramValues);

    b)查询
    String sql = “select * from temp”;
    String sql = “select * from temp where id=?”;
    // 传入的什么类型的对象,就封装为什么类型
    // 要求: 列的名称,要与指定类型的对象的属性名称一样
    Public List query (String sql , Object[] paramValues , Class clazz);
    T t; // 对象赋值

    • 5.关闭/异常

    为便于连接数据库,先编写一个工具类

    具体请参考:http://http://www.cnblogs.com/DanielJing/p/6384615.html

    编写BaseDao,自己写的所有的Dao都继承此类

    package testDao2;

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

    import org.apache.commons.beanutils.BeanUtils;

    import com.jdbc.util.JDBCUtil;;
    /**
     * 通用的dao,自己写的所有的dao都继承此类;
     * 此类定义了2个通用的方法:
     *  1. 更新
     *  2. 查询
     */
    public class BaseDao {

        // 初始化参数
        private Connection con;
        private PreparedStatement pstmt;
        private ResultSet rs;


        /**
         * 查询的通用方法
         * @param sql
         * @param paramsValue
         */
        public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){

            try {
                // 返回的集合
                List<T> list = new ArrayList<T>();
                // 对象
                T t = null;

                // 1. 获取连接
                con = JDBCUtil.getConnection();
                // 2. 创建stmt对象
                pstmt = con.prepareStatement(sql);
                // 3. 获取占位符参数的个数, 并设置每个参数的值
                int count = pstmt.getParameterMetaData().getParameterCount();
                if (paramsValue != null && paramsValue.length > 0) {
                    for (int i=0; i<paramsValue.length; i++) {
                        pstmt.setObject(i+1, paramsValue[i]);
                    }
                }
                // 4. 执行查询
                rs = pstmt.executeQuery();
                System.out.println(sql);
                // 5. 获取结果集元数据
                ResultSetMetaData rsmd = rs.getMetaData();
                // ---> 获取列的个数
                int columnCount = rsmd.getColumnCount();

                // 6. 遍历rs
                while (rs.next()) {
                    // 要封装的对象
                    t = clazz.newInstance();

                    // 7. 遍历每一行的每一列, 封装数据
                    for (int i=0; i<columnCount; i++) {
                        // 获取每一列的列名称
                        String columnName = rsmd.getColumnName(i + 1);
                                            // 获取每一列的列名称, 对应的值
                        Object value = rs.getObject(columnName);
                        // 封装: 设置到t对象的属性中  【BeanUtils组件】,需要beanutils jar包支持
                        BeanUtils.copyProperty(t, columnName, value);               
                    }

                    // 把封装完毕的对象,添加到list集合中
                    list.add(t);
                }

                return list;
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                JDBCUtil.close(con, pstmt, rs);
            }
        }



        /**
         * 更新的通用方法
         * @param sql   更新的sql语句(update/insert/delete)
         * @param paramsValue  sql语句中占位符对应的值(如果没有占位符,传入null)
         */
        public void update(String sql,Object[] paramsValue){

            try {
                // 获取连接
                con = JDBCUtil.getConnection();
                // 创建执行命令的stmt对象
                pstmt = con.prepareStatement(sql);
                // 参数元数据: 得到占位符参数的个数
                int count = pstmt.getParameterMetaData().getParameterCount();

                // 设置占位符参数的值
                if (paramsValue != null && paramsValue.length > 0) {
                    // 循环给参数赋值
                    for(int i=0;i<count;i++) {
                        pstmt.setObject(i+1, paramsValue[i]);
                    }
                }
                // 执行更新
                pstmt.executeUpdate();
                System.out.println(sql);
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                JDBCUtil.close(con, pstmt, null);
            }
        }
    }

    编写实际操作的Dao类继承自BaseDao

    package testDao2;

    import java.util.List;

    public class StudentDao extends BaseDao {
         // 删除
        public void delete(int id) {
            String sql = "delete from temp where id=?";
            Object[] paramsValue = {id};
            super.update(sql, paramsValue);
        }

        // 插入
        public void insert(Student student) {
            String sql = "insert into temp (id,name) values (?,?)";
            Object[] paramsValue = {student.getId(),student.getName()};
            super.update(sql, paramsValue);
        }

        // 查询全部
        public List<Student> getAll(){
            String sql = "select * from temp";
            List<Student> list = super.query(sql, null, Student.class);
            return list;
        }

        // 根据条件查询(主键)
        public Student findById(int id){
            String sql = "select * from temp where id=?";
            List<Student> list = super.query(sql, new Object[]{id}, Student.class);
            return  (list!=null&&list.size()>0) ? list.get(0) : null;
        }

        // 修改
        public void update(Student student) {
            String sql = "update temp set name=? where id=?";
            Object[] paramsValue = {student.getName(),student.getId()};
            super.update(sql, paramsValue);
        }
    }

    实体类

    package testDao2;

    public class Student {
        private int id;
        private String 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;
        }
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + "]";
        }
        public Student(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }


        public Student() {//必不可少的无参构造器
            // TODO Auto-generated constructor stub
        }
        
    }

    测试

    package testDao2;

    import java.util.List;

    public class Test {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            StudentDao studentDao = new StudentDao();
            Student student = studentDao.findById(1);
            System.out.println(student);
            List<Student> list = studentDao.getAll();
            System.out.println(list);
            studentDao.delete(1);
            list = studentDao.getAll();
            System.out.println(list);
            studentDao.insert(new Student(1,"yang"));
            list = studentDao.getAll();
            System.out.println(list);
            studentDao.update(new Student(1,"ffffff"));
            list = studentDao.getAll();
            System.out.println(list);
            
        }

    }

  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/DanielJing/p/6387776.html
Copyright © 2011-2022 走看看