معماری بهار سری -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) {
}
}
}
}
ویژگی های کلیدی:
- مدیریت منابع
- استثناء
- پشتیبانی از جمع آوری اتصال
- پشتیبانی بیانیه آماده شده
نقشه برداری ردیف
در رنده رابط یک روش انعطاف پذیر برای نقشه برداری ردیف های پایگاه داده به اشیاء فراهم می کند:
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()));
}
}
}
ویژگی ها:
- پارامتر ایمن نوع اتصال
- پشتیبانی از انواع داده های مشترک
- طراحی قابل توسعه
استخراج مجموعه نتیجه
در 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
- الگوهای مدیریت منابع
- ایمنی را در عملیات پایگاه داده تایپ کنید
- تکنیک های بهینه سازی عملکرد
این پیاده سازی نحوه ایجاد یک لایه دسترسی به پایگاه داده قوی ضمن حفظ سادگی و انعطاف پذیری را نشان می دهد.