中文JAVA技術平等自由協作創造

          Java專題文章博客和開源

          常用鏈接

          統計

          最新評論

          JAVA操作數據庫的模板方法

           關于用操作數據庫模板方法如下代碼:
          [java]
          jdbc.properties
          url=jdbc:mysql://localhost:3306/cfms
          user=root
          password=123456
          driverClass=com.mysql.jdbc.Driver
          package cn.edu.hactcm.base.utils;
          import java.io.InputStream;
          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.util.Properties;
          /**
          [java] view plaincopyprint?
          * CFMS :Computer files management system
          * version :1.0 2013-2-19 上午08:44:27
          *
          * 操作JDBC的工具類
          */
          public class JdbcUtils {
          private JdbcUtils() {
          }
          private static String url;
          private static String user;
          private static String password;
          /*
          * 靜態代碼塊
          */
          static {
          try {
          // 讀取配置文件,通過類加載器的方式讀取屬性文件
          InputStream in = JdbcUtils.class.getClassLoader()
          .getResourceAsStream("jdbc.properties");
          Properties prop = new Properties();
          prop.load(in);
          url = prop.getProperty("url");
          user = prop.getProperty("user");
          password = prop.getProperty("password");
          // 注冊驅動
          String driverClass = prop.getProperty("driverClass");
          Class.forName(driverClass);
          in.close();
          in = null;
          } catch (Exception e) {
          throw new ExceptionInInitializerError(e);
          }
          }
          /**
          * @return 獲取與指定數據庫的連接
          * @throws SQLException
          */
          public static Connection getConnection() throws SQLException {
          // url,user,password可以直接使用是因為上面定義成靜態的了。
          Connection connection = DriverManager
          .getConnection(url, user, password);
          return connection;
          }
          /**
          * @param rs :結果集
          * @param stmt:在程序中將使用PrepareStatement,其中Statement是其父類
          * @param conn:數據庫連接
          */
          public static void release(ResultSet rs, Statement stmt, Connection conn) {
          // 判斷結果集是否為空,如果不為空,關閉清空
          if (rs != null) {
          try {
          rs.close();
          } catch (SQLException e) {
          e.printStackTrace();
          }
          rs = null;
          }
          // 判斷聲明是否為空,如果不為空,關閉清空
          if (stmt != null) {
          try {
          stmt.close();
          } catch (SQLException e) {
          e.printStackTrace();
          }
          stmt = null;
          }
          // 判斷連接是否為空,如果不為空,關閉清空
          if (conn != null) {
          try {
          conn.close();
          } catch (SQLException e) {
          e.printStackTrace();
          }
          conn = null;
          }
          }
          }
          package cn.edu.hactcm.base.dao;
          import java.sql.ResultSet;
          /**
          * CFMS :Computer files management system
          * version :1.0 2013-2-19 上午10:02:31
          */
          public interface ResultSetHandler {
          //處理結果集的方法
          public Object handle(ResultSet rs);
          }
          /**
          *
          */
          package cn.edu.hactcm.base.dao.impl;
          import java.sql.ResultSet;
          import java.sql.ResultSetMetaData;
          import cn.edu.hactcm.base.dao.ResultSetHandler;
          /**
          * CFMS :Computer files management system
          * version :1.0 2013-2-19 上午10:38:37
          *
          * 取出第一行的所有記錄存入一個Object數組
          */
          @SuppressWarnings( { "unchecked", "unused" })
          public class ArrayHandler implements ResultSetHandler {
          private Class clazz;
          public ArrayHandler(Class clazz) {
          this.clazz = clazz;
          }
          public Object handle(ResultSet rs) {
          try {
          if (rs.next()) {
          // 指向了第一行的記錄
          // 獲得元數據
          ResultSetMetaData metaData = rs.getMetaData();
          // 獲得用于查詢的sql中的字段列數
          int count = metaData.getColumnCount();
          // 創建數組

          Object[] arr = new Object[count];
          // 迭代所有列的值,存入數組
          for (int i = 1; i <= count; i++) {
          Object value = rs.getObject(i); // 獲得指定列的值
          arr[i - 1] = value;
          }
          return arr;
          }
          return null;
          } catch (Exception e) {
          throw new RuntimeException(e);
          }
          }
          }
          /**
          *
          */
          package cn.edu.hactcm.base.dao.impl;
          import java.lang.reflect.Field;
          import java.sql.ResultSet;
          import java.sql.ResultSetMetaData;
          import cn.edu.hactcm.base.dao.ResultSetHandler;
          /**
          * CFMS :Computer files management system
          * version :1.0 2013-2-19 上午10:38:37
          *
          * 此助手類用于取得結果集中的第一條記錄
          */
          @SuppressWarnings("unchecked")
          public class BeanHandler implements ResultSetHandler {
          private Class clazz;
          public BeanHandler(Class clazz) {
          this.clazz = clazz;
          }
          public Object handle(ResultSet rs) {
          // 不知道有幾列數據,不知道列名,不知道封裝到什么樣的bean
          // 表的列明和javabean的字段名一致
          try {
          if(rs.next()) {
          // 創建bean
          Object bean = clazz.newInstance();
          // 封裝數據
          // 獲得結果集的元數據
          ResultSetMetaData metaData = rs.getMetaData();
          int count = metaData.getColumnCount();
          // 迭代取每一列的數據
          for(int i=1; i<=count; i++) {
          // 獲得列名 username
          String columnName = metaData.getColumnName(i);
          // 獲得數據 ddd
          Object value = rs.getObject(columnName);
          // 根據列名反射出映射的屬性 username
          Field field = clazz.getDeclaredField(columnName);
          // 為屬性賦值
          field.setAccessible(true);
          field.set(bean, value);
          }
          return bean;
          }
          return null;
          } catch (Exception e) {
          throw new RuntimeException(e);
          }
          }
          }
          package cn.edu.hactcm.base.dao.impl;
          import java.lang.reflect.Field;
          import java.sql.ResultSet;
          import java.sql.ResultSetMetaData;
          import java.util.ArrayList;
          import java.util.List;
          import cn.edu.hactcm.base.dao.ResultSetHandler;
          /**
          * CFMS :Computer files management system
          * version :1.0 2013-2-19 上午10:07:19
          *
          * 此助手類用于取得結果集中的記錄的list列表集合,集合中的每個元素是數據庫中的一條記錄 www.wx-jr.com
          */
          @SuppressWarnings("unchecked")
          public class BeanListHandler implements ResultSetHandler {
          private Class clazz;
          public BeanListHandler(Class clazz) {
          this.clazz = clazz;
          }
          public Object handle(ResultSet rs) {
          try {
          // 取出結果集所有的記錄,封裝到bean,存入list返回
          List list = new ArrayList();
          while (rs.next()) {
          Object bean = clazz.newInstance();
          // 獲得元數據
          ResultSetMetaData metaData = rs.getMetaData();
          // 獲得列的數量
          int count = metaData.getColumnCount();
          // 遍歷列
          for (int i = 1; i <= count; i++) {
          // 取列名
          String columnName = metaData.getColumnName(i);
          // 取這列的值
          Object value = rs.getObject(columnName);
          // 反射出屬性
          Field field = clazz.getDeclaredField(columnName);
          // 設置屬性
          field.setAccessible(true);
          field.set(bean, value);
          }
          // 加入list
          list.add(bean);
          }
          return list;
          } catch (Exception e) {
          throw new RuntimeException(e);
          }
          }
          }
          package cn.edu.hactcm.base.dao.impl;
          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import cn.edu.hactcm.base.dao.ResultSetHandler;
          import cn.edu.hactcm.base.utils.JdbcUtils;
          public class GenericDaoImpl {
          /**
          * 用于處理公共的insert,update,delete操縱雅思答案
          * @param sql :這里是傳入的sql語句
          * @param params :這里是參數數組
          * @return
          * @throws SQLException
          */
          public static int update(String sql, Object[] params) throws SQLException {
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          try {
          conn = JdbcUtils.getConnection();
          //預編譯sql
          pstmt = conn.prepareStatement(sql);
          //將參數設置進去
          for (int i = 0; i < params.length; i++) {
          pstmt.setObject(i+1, params[i]);
          }
          //發送sql
          int num = pstmt.executeUpdate();
          return num;
          } finally {
          JdbcUtils.release(rs, pstmt, conn);
          }
          }
          /**
          * 用于處理公共"查詢所有"的操作
          * @param sql :查詢參數
          * @param params :出入的id值
          * @param rsh :表示要實現那個結果封裝類
          * @return
          * @throws SQLException
          */
          public static Object query(String sql,Object[] params,ResultSetHandler rsh) throws SQLException{
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          try {
          //獲得連接
          conn = JdbcUtils.getConnection();
          //預編譯sql
          pstmt = conn.prepareStatement(sql);
          //將參數設置進去
          for (int i = 0; params != null && i < params.length; i++) {
          pstmt.setObject(i+1, params[i]);
          }
          //發送sql
          rs = pstmt.executeQuery();
          //不知道別人想如何處理結果集
          //干脆想別人所要一個結果集的處理器
          //為了讓當前代碼繼續,定義一個結果集處理器接口
          //策略模式,規定算法,具體的算法留給將來的調用者實現 www.dakaoedu.com
          Object obj = rsh.handle(rs);
          return obj;
          } finally {
          //釋放資源
          JdbcUtils.release(rs, pstmt, conn);
          }
          }
          }
           

          posted on 2013-08-17 09:50 好不容易 閱讀(297) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 苍梧县| 济南市| 花垣县| 合山市| 金坛市| 固始县| 剑河县| 治多县| 乌拉特前旗| 台山市| 江油市| 林周县| 错那县| 博客| 报价| 大关县| 江孜县| 米易县| 慈利县| 普陀区| 清河县| 临泽县| 望城县| 朝阳市| 林芝县| 阿拉善右旗| 隆回县| 赤城县| 鄢陵县| 马边| 吴川市| 镇原县| 海伦市| 镇巴县| 辽阳县| 龙岩市| 泰和县| 梁山县| 贞丰县| 广元市| 临泽县|