برنامه نویسی

معماری بهار سری -6. ماژول JDBC در بهار

معرفی کردن

JDBC (اتصال به پایگاه داده جاوا) API استاندارد برای دسترسی به پایگاه داده در جاوا است. با این حال ، کار با JDBC می تواند خسته کننده و مستعد خطا باشد. در این مقاله ، من “نحوه اجرای یک ماژول JDBC را بررسی می کنم که بر اساس اجرای پروژه کوچک من ، عملیات پایگاه داده را ساده می کند.

اجزای اصلی

ماژول JDBC از چندین مؤلفه اصلی تشکیل شده است:

src/com/yaruyng/jdbc/
├── core/
│   ├── JdbcTemplate.java
│   ├── RowMapper.java
│   ├── ResultSetExtractor.java
│   ├── StatementCallBack.java
│   ├── PreparedStatementCallBack.java
│   └── ArgumentPreparedStatementSetter.java
├── datasource/
└── pool/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

jdbctemplate: کلاس اصلی

در jdbctemplate کلاس مؤلفه اصلی است که عملیات JDBC را ساده می کند:

public class JdbcTemplate {
  private DataSource dataSource;

  public Object query(StatementCallBack stmtCallBack) {
    Connection con = null;
    Statement stmt = null;
    try {
      con = dataSource.getConnection();
      stmt = con.createStatement();
      return stmtCallBack.doInStatement(stmt);
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        stmt.close();
        con.close();
      } catch (SQLException e) {
      }
    }
    return null;
  }

  public Object query(String sql, Object[] args,
                      PreparedStatementCallBack pstmtCallBack) {
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
      con = dataSource.getConnection();
      pstmt = con.prepareStatement(sql);
      ArgumentPreparedStatementSetter setter =
        new ArgumentPreparedStatementSetter(args);
      setter.setValues(pstmt);
      return pstmtCallBack.doInPreparedStatement(pstmt);
    } catch (SQLException e) {
      throw new RuntimeException(e);
    } finally {
      try {
        pstmt.close();
        con.close();
      } catch (SQLException e) {
      }
    }
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ویژگی های کلیدی:

  1. مدیریت منابع
  2. استثناء
  3. پشتیبانی از جمع آوری اتصال
  4. پشتیبانی بیانیه آماده شده

نقشه برداری ردیف

در رنده رابط یک روش انعطاف پذیر برای نقشه برداری ردیف های پایگاه داده به اشیاء فراهم می کند:

public interface RowMapper<T> {
    T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثال استفاده

public class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setName(rs.getString("name"));
        user.setEmail(rs.getString("email"));
        return user;
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

دست زدن به پارامتر

در اظهارات تهیه شده استدلالی دسته کلاس اتصال پارامتر:

public class ArgumentPreparedStatementSetter {
    private final Object[] args;

    public void setValues(PreparedStatement pstmt) throws SQLException {
        if (this.args != null) {
            for (int i = 0; i < this.args.length; i++) {
                Object arg = this.args[i];
                doSetValue(pstmt, i+1, arg);
            }
        }
    }

    private void doSetValue(PreparedStatement pstmt, 
            int parameterPosition, Object argValue) throws SQLException {
        if (argValue instanceof String) {
            pstmt.setString(parameterPosition, (String)argValue);
        }
        else if (argValue instanceof Integer) {
            pstmt.setInt(parameterPosition, (int)argValue);
        }
        else if (argValue instanceof java.util.Date) {
            pstmt.setDate(parameterPosition, 
                new java.sql.Date(((java.util.Date)argValue).getTime()));
        }
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ویژگی ها:

  1. پارامتر ایمن نوع اتصال
  2. پشتیبانی از انواع داده های مشترک
  3. طراحی قابل توسعه

استخراج مجموعه نتیجه

در ResultsetExtractor رابط راهی برای پردازش مجموعه های نتیجه را فراهم می کند:

public interface ResultSetExtractor<T> {
  T extractData(ResultSet rs) throws SQLException;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثال اجرای:

public class RowMapperResultSetExtractor<T> implements ResultSetExtractor<List<T>> {
    private final RowMapper<T> rowMapper;

    public RowMapperResultSetExtractor(RowMapper<T> rowMapper) {
        this.rowMapper = rowMapper;
    }

    @Override
    public List<T> extractData(ResultSet rs) throws SQLException {
        List<T> results = new ArrayList<>();
        int rowNum = 0;
        while (rs.next()) {
            results.add(rowMapper.mapRow(rs, ++rowNum));
        }
        return results;
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثال استفاده

1. پرس و جو ساده

List<User> users = jdbcTemplate.query(
    "SELECT * FROM users WHERE age > ?",
    new Object[]{18},
    new UserRowMapper()
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2. پردازش بیانیه سفارشی

Object result = jdbcTemplate.query(new StatementCallBack() {
    @Override
    public Object doInStatement(Statement stmt) throws SQLException {
        ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM users");
        if (rs.next()) {
            return rs.getInt(1);
        }
        return 0;
    }
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

3. بیانیه آماده شده با پاسخ به تماس

Object result = jdbcTemplate.query(
    "UPDATE users SET name = ? WHERE id = ?",
    new Object[]{"John", 1},
    new PreparedStatementCallBack() {
        @Override
        public Object doInPreparedStatement(PreparedStatement pstmt) 
                throws SQLException {
            return pstmt.executeUpdate();
        }
    }
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ویژگی های کلیدی

1. مدیریت منابع

  • دست زدن به اتصال خودکار
  • پاکسازی
  • دست زدن به استثنا ### 2. نوع ایمنی
  • نقشه برداری ردیف عمومی
  • پارامتر ایمن نوع اتصال
  • تبدیل نوع نتیجه ### 3. انعطاف پذیری
  • پردازش بیانیه سفارشی
  • نقشه برداری ردیف گسترده
  • استخراج نتیجه قابل تنظیم ### 4. رسیدگی به خطا
  • بسته بندی استثنا SQL
  • پاکسازی منابع
  • پشتیبانی معامله

بهترین روشها

1. مدیریت اتصال

  • از استخر اتصال استفاده کنید
  • پاکسازی منابع مناسب
  • مرزهای معامله ### 2. کار با استثناء
  • انواع استثناء سفارشی
  • انتشار خطای مناسب
  • پاکسازی منابع در نهایت بلوک ### 3. بهینه سازی عملکرد
  • ذخیره سازی بیانیه
  • پردازش دسته
  • ترکیب اتصال

چالش ها و راه حل های مشترک

1. نشت منابع

  • از منابع آزمایشی استفاده کنید
  • پاکسازی مناسب در نهایت بلوک ها
  • جمع آوری اتصال ### 2. تبدیل نوع
  • پیاده سازی های نوع را پیاده سازی کنید
  • از عبارات آماده شده استفاده کنید
  • رسیدگی به مقادیر تهی ### 3. مدیریت معاملات
  • ادغام معامله بهار
  • سطح انزوا مناسب
  • دست زدن به

پایان

اجرای ماژول JDBC فراهم می کند:

  • دسترسی به پایگاه داده ساده
  • عملیات ایمن
  • مدیریت منابع
  • خطای دست زدن به کلیدهای کلیدی:
  • درک اصول JDBC
  • الگوهای مدیریت منابع
  • ایمنی را در عملیات پایگاه داده تایپ کنید
  • تکنیک های بهینه سازی عملکرد

این پیاده سازی نحوه ایجاد یک لایه دسترسی به پایگاه داده قوی ضمن حفظ سادگی و انعطاف پذیری را نشان می دهد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا