黑马程序员技术交流社区

标题: 基础时候反射最好理解透彻,迟早会用 [打印本页]

作者: hejinzhong    时间: 2014-9-8 11:14
标题: 基础时候反射最好理解透彻,迟早会用

  1. class TestDemo{
  2.        
  3.         /**
  4.          * 测试DML工具类,DML和DQL
  5.          */
  6.         @Test
  7.         public void test01(){
  8.                 //建立工具类对象,提供相应参数传递过去
  9.                 QueryRunnerDemo myQuery = new QueryRunnerDemo(JdbcUtils.getDatasource());
  10.                 //只要是DML都可以使用update函数,进行数据库中数据的更行(增,删,改)
  11.                 String sql ="insert into t_user(id,username,password) values(?,?,?)";
  12.                 Object[] params = {"u008","张三","saner"};
  13.                 int x = myQuery.update(sql, params);
  14.         }
  15.        
  16.         /**
  17.          * 这个只是单一的查询,并没有是查询大量,因为目前已经有现成工具类
  18.          * 这个只是理解
  19.          */
  20.         @Test
  21.         public void test02(){
  22.                 QueryRunnerDemo myQuery = new QueryRunnerDemo(JdbcUtils.getDatasource());
  23.                 String sql = "select * from t_user where id = ?";
  24.                 Object[] params = {"u008"};
  25.                 //将查询到的数据封装后返回
  26.                 Use user = (Use) myQuery.query(sql, new MyRsHandler(Use.class), params);
  27.         }
  28. }



  29. class QueryRunnerDemo {

  30.         private static DataSource dataSource = null;

  31.         // 在建立工具的时候传进来一个数据源
  32.         QueryRunnerDemo(DataSource datasource) {
  33.                 this.dataSource = datasource;
  34.         }

  35.         /*
  36.          * DML操作:增,删,改 他们的操作都是一样的,只是传递的参数不同
  37.          */
  38.         public int update(String sql, Object... params) {
  39.                 Connection conn = null;
  40.                 PreparedStatement ps = null;
  41.                 try {
  42.                         conn = dataSource.getConnection();
  43.                         ps = conn.prepareStatement(sql);
  44.                         if (params != null) {
  45.                                 for (int i = 0; i < params.length; i++) {
  46.                                         ps.setObject(i + 1, params[i]);
  47.                                 }
  48.                         }
  49.                         return ps.executeUpdate();

  50.                 } catch (SQLException e) {
  51.                         throw new RuntimeException("添加不成功");
  52.                 } finally {
  53.                         closeRes(conn, ps, null);
  54.                 }
  55.         }

  56.         public Object query(String sql, MyRsHandler myHandler, Object... params) {

  57.                 Connection conn = null;
  58.                 PreparedStatement ps = null;
  59.                 ResultSet rs = null;
  60.                 try {

  61.                         conn = dataSource.getConnection();
  62.                         ps = conn.prepareStatement(sql);
  63.                         if (params != null) {
  64.                                 for (int i = 0; i < params.length; i++) {
  65.                                         ps.setObject(i + 1, params[i]);
  66.                                 }
  67.                         }
  68.                         rs = ps.executeQuery();

  69.                         return myHandler.handler(rs);

  70.                 } catch (Exception e) {
  71.                         throw new RuntimeException("查询不成功");
  72.                 } finally {
  73.                         closeRes(conn, ps, rs);
  74.                 }
  75.         }

  76.         /*
  77.          * 使用完毕释放资源,注意从低到高一次处理。
  78.          * 并在释放之前判断是否为null 而且每个资源的释放都可能抛出异常,
  79.          * 注意利用finally嵌套
  80.          */
  81.         private static void closeRes(Connection conn, Statement st, ResultSet rs) {
  82.                 try {
  83.                         if (rs != null) {
  84.                                 rs.close();
  85.                         }
  86.                 } catch (Exception e) {
  87.                         throw new RuntimeException(e);
  88.                 } finally {
  89.                         try {
  90.                                 if (st != null) {
  91.                                         st.close();
  92.                                 }
  93.                         } catch (Exception e) {
  94.                                 throw new RuntimeException(e);
  95.                         } finally {
  96.                                 try {
  97.                                         if (conn != null) {
  98.                                                 conn.close();
  99.                                         }
  100.                                 } catch (Exception e) {
  101.                                         throw new RuntimeException(e);
  102.                                 }
  103.                         }
  104.                 }
  105.         }
  106. }

  107. class MyRsHandler {

  108.         private Class beanClass;

  109.         public MyRsHandler(Class beanClass) {
  110.                 this.beanClass = beanClass;
  111.         }

  112.         public Object handler(ResultSet rs) {
  113.                
  114.                 /**
  115.                  *这里封装数据,首先利用反射创建一个JavaBean的对象
  116.                  *然后根据结果集的元数据中获取数据库中查询到的数据
  117.                  * 最后利用内省将数据封装到建立的对象中
  118.                  */
  119.                
  120.                 try {
  121.                         if (rs.next()) {
  122.                                 Object bean = beanClass.newInstance();                //反射
  123.                                 ResultSetMetaData rsmd = rs.getMetaData();        //获取元数据
  124.                                 int col = rsmd.getColumnCount();
  125.                                 /*
  126.                                  * 元数据即:列数=值 的形式封装数据库中的内容
  127.                                  */
  128.                                
  129.                                 for (int i = 0; i < col; i++) {
  130.                                         String colname = rsmd.getColumnName(i + 1);
  131.                                         Object value = rs.getObject(colname);
  132.                                        
  133.                                         //利用工具类根据内省封装数据
  134.                                         BeanUtils.setProperty(bean, colname, value);
  135.                                 }
  136.                                 return bean;
  137.                         }
  138.                         return null;
  139.                 } catch (Exception e) {
  140.                         throw new RuntimeException("封装数据出错");
  141.                 }
  142.         }
  143. }


  144. class JdbcUtils{
  145.        
  146.         /*
  147.          * 这里主要是提供获取数据源和获取连接的两个方法
  148.          * 利用C3P0提供一个连接池,这个连接池是datasource的子类
  149.          *
  150.          * 这里的配置文件通过c3p0-config.xml文件进行配置
  151.          */
  152.         private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
  153.        
  154.         public static ComboPooledDataSource getDatasource(){
  155.                 return dataSource;
  156.         }
  157.         public static Connection getConnection() throws Exception{
  158.                 return dataSource.getConnection();
  159.         }
  160. }

  161. /**
  162. * 提供一个JavaBean来封装数据
  163. */

  164. public class Use {
  165.        
  166.         private String id;
  167.         private String username;
  168.         private String password;
  169.         public String getId() {
  170.                 return id;
  171.         }
  172.         public void setId(String id) {
  173.                 this.id = id;
  174.         }
  175.         public String getUsername() {
  176.                 return username;
  177.         }
  178.         public void setUsername(String username) {
  179.                 this.username = username;
  180.         }
  181.         public String getPassword() {
  182.                 return password;
  183.         }
  184.         public void setPassword(String password) {
  185.                 this.password = password;
  186.         }
  187.         @Override
  188.         public String toString() {
  189.                 return "User [id=" + id + ", username=" + username + ", password="
  190.                                 + password + "]";
  191.         }
  192. }
复制代码


作者: 格子、    时间: 2014-9-8 12:55
这些都是基础中的基础
作者: ☆枫の云    时间: 2014-9-8 18:09
是啊,框架就用的是反射,感谢楼主分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2