JDBC DAO

使用 DAO模式 来对数据库做增删改查操作

DAO模式可以大概分为三个层:1.DAO层 2.服务层 3.表现层
1)表现层 :相当于客户端用来查看,提交信息的角色
2)服务层 :是表现层和DAO层的纽带,其实也没干什么事就是通知消息的角色
3)DAO :真正要做事的角色(对数据库的某些操作)

public void update(String sql, Object...objects){
    Connection conn = null;
    PreparedStatement preparedStatement = null;
    
    try {
        conn = TestJDBC.getConnection();
        preparedStatement = conn.prepareStatement(sql);
        
        for(int i=0; i<objects.length; i++){
            preparedStatement.setObject(i+1, objects[i]);
        }
        
        preparedStatement.executeUpdate();
    } catch (Exception e){
        e.printStackTrace();
    } {
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

public <T> T get(Class<T> clazz, String sql, Object...objects){
    //1.建立连接
    Connection conn = null;
    
    //2.获取PreparedStatement
    PreparedStatement preparedStatement = null;
    
    try {
        conn = TestJDBC.getConnection();
        preparedStatement = conn.prepareStatement(sql);
        
        //3.赋值
        for (int i = 0; i<objects.length; i++){
            preparedStatement.setObject(i+1, objects[i]);
        }
        
        //4.执行,并使用ResultSet接受
        ResultSet re = preparedStatement.executeQuery();
        
        
        if(re.next()){
            //5.创建clazz对象
            T t = clazz.newInstance();
            
            //6、获取ResultSetMetaData,并放入对象
            ResultSetMetaData rsmd = re.getMetaData();
            for(int i=0; i<rsmd.getColumnCount(); i++){
                String columnLable = rsmd.getColumnLabel(i+1);
                Object columnValue = re.getObject(i+1);
                
                //为对象属性赋值
                Field field = clazz.getDeclaredField(columnLable);
                field.setAccessible(true);
                field.set(t, columnValue);
                
            }
            return t;
        } else {
            return null;
        }
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (preparedStatement != null){
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return null;
}

}

元数据 (DatabaseMetaData && ResultSetMetaData)

  • 提供数据库,返回结果的元数据对象
  • 利用反射技术,可以写出通用的方法

获取自动插入时生成的主键值

    PreparedStatement st = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );

    st.executeUpdate();
    ResultSet rs = st.getGeneratedKeys();  //得到插入行的主键
    if(rs.next())
        System.out.println(rs.getObject(1));

推荐阅读更多精彩内容