A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gh112233 中级黑马   /  2013-11-16 20:00  /  1962 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class GenericDaoImpl<T extends Serializable, ID extends Serializable>            
                implements IGenericDao<T, ID> {                                                

        // 创建三个属性:属性用于接收T传入的类对象 属性用于获取datasource 属性用于创建QueryRunner                          
        private Class<T> persistentClass;                                                   
        private BasicDataSource dataSource;                                                
        private QueryRunner queryRunner;                                                   

        // 创建该类的构造方法,同时在构造方法中实例化datasource对象,获取T泛型                                          
        @SuppressWarnings({ "unchecked", "static-access" })                                 
        public GenericDaoImpl() {                                                           
                // 使用reflect反射机制实现自动获取泛型参数所要操作的实体类                                             
                this.persistentClass = (Class<T>) ((ParameterizedType) (this.getClass()         
                                .getGenericSuperclass())).getActualTypeArguments()[0];                  
                // 获取DataSourceProvider提供的DataSource对象                                          
                this.dataSource = DataSourceProvider.getInstance().getDataSource();            
        }                                                                                   

        @Override                                                                           
        public int insert(T entity) {                                                      
                // TODO Auto-generated method stub                                             
                // 步骤1:使用reflect获取操作的实体类名称                                                      
                String className = this.persistentClass.getSimpleName();                        
                // 步骤2:将步骤1获取的类名称小写化转化成数据表的名称(Oracle区分大小写)                                      
                String tableName = className.toLowerCase();                                    
                // 步骤3:使用reflect获取传入的实体类中已经声明过的属性数组                                             
                Field[] properties = this.persistentClass.getDeclaredFields();                  
                // 步骤4:创建一个StringBuilder对象构建SQL基础语句                                             
                StringBuilder strSQL = new StringBuilder("insert into " + tableName            
                                + " values(");                                                         
                // 创建一个空参数数组                                                                    
                Object[] params = new Object[properties.length];                                
                // 步骤5:使用for循环遍历类中的属性数组                                                         
                for (int i = 0; i < properties.length; i++) {                                   
                        // 判断当前循环到的属性类型是否为日期类型                                                      
                        if (properties[i].getType().toString()                                      
                                        .equals("class java.util.Date")) {                                 
                                strSQL.append("to_date(?, 'yyyy-MM-dd'), ");                           
                        } else {                                                                    
                                strSQL.append("?, ");                                                   
                        }                                                                           
                        // 使用反射获取属性的名称                                                              
                        String propertyName = properties[i].getName();                              
                        // 思考:如果出现相同字母如何处理                                                         
                        String methodName = "get"                                                   
                                        + propertyName.replaceFirst(propertyName.charAt(0) + "",            
                                                        ((char) (propertyName.charAt(0) - 32)) + "");               

                        try {                                                                       
                                // 使用反射获取指定方法并返回值                                                      
                                Object propertyValue = this.persistentClass.getDeclaredMethod(         
                                                methodName).invoke(entity);                                    
                                // 将获取到的属性值装载到参数数组中                                                     
                                if (propertyValue instanceof java.util.Date) {                          
                                        params[i] = new SimpleDateFormat("yyyy-MM-dd")                     
                                                        .format(propertyValue);                                    
                                } else {                                                               
                                        params[i] = propertyValue;                                          
                                }                                                                       
                        } catch (IllegalArgumentException e) {                                      
                                // TODO Auto-generated catch block                                      
                                e.printStackTrace();                                                   
                        } catch (SecurityException e) {                                             
                                // TODO Auto-generated catch block                                      
                                e.printStackTrace();                                                   
                        } catch (IllegalAccessException e) {                                       
                                // TODO Auto-generated catch block                                      
                                e.printStackTrace();                                                   
                        } catch (InvocationTargetException e) {                                    
                                // TODO Auto-generated catch block                                      
                                e.printStackTrace();                                                   
                        } catch (NoSuchMethodException e) {                                         
                                // TODO Auto-generated catch block                                      
                                e.printStackTrace();                                                   
                        }                                                                           

                }                                                                              
                // 步骤6:截取最终循环产生的SQL语句                                                           
                strSQL = strSQL.delete(strSQL.length() - 2, strSQL.length());                  
                // 步骤7:补充SQL语句的结束括号                                                            
                strSQL.append(")");                                                            
                System.out.println("SQL:> " + strSQL.toString());                              
                for (int i = 0; i < params.length; i++) {                                       
                        System.out.print(params[i] + " ");                                          
                }                                                                              

                // 实例化QueryRunner对象                                                            
                this.queryRunner = new QueryRunner(dataSource);                                 
                try {                                                                           
                        return this.queryRunner.update(strSQL.toString(), params);                  
                } catch (SQLException e) {                                                      
                        // TODO Auto-generated catch block                                          
                        e.printStackTrace();                                                        
                        return -1;                                                                  
                }                                                                              
        }           
}
用的是数据库连接池啊。相当于JDBC连接数据库                                                                        

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
枫儿 + 1 + 2 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马