JDBC知識學習——DAO編寫

DAO:data Access Object:訪問數據信息的類

操作java類屬性有一個工具包:beanuitls
同時在libraries中加入:commons-beanuitls-1.8.0.jar和commons-logging-1.1.1.jar包
User類如下:

public class User {
    private int id;
    private String name;
    private  String pwd;
    private String sex;
    private String home;
    private String info;
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", sex='" + sex + '\'' +
                ", home='" + home + '\'' +
                ", info='" + info + '\'' +
                '}'+"\n";
    }

    public User() {
    }
    public User(int id, String name, String pwd, String sex, String home, String info) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
        this.sex = sex;
        this.home = home;
        this.info = info;
    }
    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;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getHome() {
        return home;
    }
    public void setHome(String home) {
        this.home = home;
    }
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
}

編寫的ReflectionUtils工具類:

public class ReflectionUtils {
//把屬性名首字符轉爲大寫
   public static String StringUtils(String str) {
       if(str==null||"".equals(str)) {
           return str;
       }
       if(str.length()==1) {
           return str.toUpperCase();
       }else {
           return str.substring(0, 1).toUpperCase()+str.substring(1);
       }
   }
    /**
     * 實例化對象創建方法,該對象可以根據傳入的字符串結構
     *  要進行反射的Class類對象,有Class就可以實例化對象
     */
    public static <T> T setFieldValue(Object object,String fieldName,Object fieldValue) {
        try {//相當於實例化對象
            Object obj = object;
            // BeanUtils.setValue(obj, value);//通過反射設置屬性
            Field field = obj.getClass().getDeclaredField(fieldName);
            Method setMethod = obj.getClass().getDeclaredMethod("set"+StringUtils(fieldName), field.getType());
            setMethod.invoke(obj, fieldValue);
            return (T) obj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

編寫的具體實現DAO的類:

public class DAOTest {
    //insert ,delete,update操作都可以包含其中
    public static void update(String sql, Object... args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = JDBCTools.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCTools.releaseSource(null, preparedStatement, connection);
        }

    }

    //查詢一條記錄返回對應的對象
    public static <T> T get(Class<T> clazz, String sql, Object... args) {
        T entity = null;
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //獲取連接
            connection = JDBCTools.getConnection();
            //獲取preparedStatement對象
            preparedStatement = connection.prepareStatement(sql);
            //填充佔位符
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            //進行查詢
            resultSet = preparedStatement.executeQuery();
            //如果有記錄進行如下操作
            if (resultSet.next()) {
                //創建Map
                Map<String, Object> values = new HashMap<>();
                //得到ResultSetMetaData對象
                ResultSetMetaData rsmd = resultSet.getMetaData();
                int columnCount = rsmd.getColumnCount();
                //獲取別名和值
                for (int i = 0; i < columnCount; i++) {
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    Object column = resultSet.getObject(columnLabel);
                    values.put(columnLabel, column);
                }
                //用反射創建對象
                entity = clazz.newInstance();
                //遍歷map對象用反射填充值
                for (Map.Entry<String, Object> entry : values.entrySet()) {
                    String propertyName = entry.getKey();
                    Object value = entry.getValue();
                    //用自己寫的Utils來傳參數設置屬性
                    //  ReflectionUtils.setFieldValue(entity,propertyName,value);
                    //調用BeanUtils設置屬性
                    BeanUtils.setProperty(entity, propertyName, value);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCTools.releaseSource(resultSet, preparedStatement, connection);
        }

        return entity;
    }
    //查詢多條信息返回list
    public static <T> List<T> getForList(Class<T> clazz, String sql, Object... args) {
        List<T> list = new ArrayList<>();
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //連接得到prepared Statement對象
            connection = JDBCTools.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            //填充佔位符
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i+1,args[i]);
            }
            //創建多個Map對象
            List<Map<String, Object>> values = new ArrayList<>();
            //獲取ResultSet
            resultSet = preparedStatement.executeQuery();
            //獲得MetaData
            ResultSetMetaData rsmd = resultSet.getMetaData();
            Map<String, Object> map = null;
            //循環獲得數據
            while (resultSet.next()) {
                map = new HashMap<>();
                for (int i = 0; i < rsmd.getColumnCount(); i++) {
                    String columnLabel = rsmd.getColumnLabel(i + 1);
                    Object column = resultSet.getObject(i + 1);
                    map.put(columnLabel, column);
                }
                values.add(map);
            }
            //判斷集合中是否存在數據
            T bean = null;
            if (values.size() > 0) {
                for (Map<String, Object> m : values) {
                    bean = clazz.newInstance();
                    for (Map.Entry<String, Object> entry : m.entrySet()) {
                        String propertyName = entry.getKey();
                        Object value = entry.getValue();
                        //創建對象
                        BeanUtils.setProperty(bean, propertyName, value);
                    }
                    //把Object 對象放入list中
                    list.add(bean);
                }
            }
        } catch (Exception e) {
        } finally {
            JDBCTools.releaseSource(resultSet, preparedStatement, connection);
        }
        return list;
    }
    //返回某條記錄某個字段的值或一個統計的值
    public static <E> E getForValue(String sql, Object... args) {
//得到結果集
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //連接得到prepared Statement對象
            connection = JDBCTools.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            //填充佔位符
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            //獲取ResultSet
            resultSet = preparedStatement.executeQuery();
            //
            if(resultSet.next()){
                return (E) resultSet.getObject(1);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCTools.releaseSource(resultSet,preparedStatement,connection);
        }
        return null;
    }
}

具體測試方法:

public class TestDao {
    @Test
    public void testUpdata(){
        String sql="insert into user(name,pwd,sex,home,info) values(?,?,?,?,?)";
        DAOTest.update(sql,"Hew","123456","man","shanghai","test");
    }
    @Test
    public  void testGet(){
        String sql="select id id, name name,pwd pwd, sex sex, " +
                "home home, info info from user where id=?";
        User user=DAOTest.get(User.class,sql,11);
        System.out.println(user);
    }
    @Test
    public void testList(){
        String sql="select id id, name name,pwd pwd, sex sex, home home, info info from user;";
        List<User> user=DAOTest.getForList(User.class,sql);
        System.out.println(user);
    }
    @Test
    public  void testValue(){
        String sql="select pwd from user where id= ?";
        String pwd=DAOTest.getForValue(sql,7);
        System.out.println(pwd);
        sql="select max(id) from user";
        int max=DAOTest.getForValue(sql);
        System.out.println(max);

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章