華為技術經理詳解:什麼樣的Java DAO層最適合我們的項目

回顧和比較最流行的java數據庫訪問框架。

有許多方法可以將您的Java應用程序連接到數據庫。這篇文章裏,我將解釋哪個框架最適合我們的項目需求。

獲取數據的最簡單方法是使用java api提供的,也被稱為java數據庫連接(JDBC)。提供的api返回給定sql查詢的結果集:

ResultSet rs = stmt.executeQuery("SELECT id, name FROM Employees");
while(rs.hasNext()){
log.info("Employee id: " rs.getInt("id") " has name: " rs.getString("name"));
}

為了減少大量樣板代碼,建議使用jdbc模板工具,如Spring JDBC模板或Apache DBUtils。例如,在該請求中,Spring模板發送帶有參數的請求、反序列化數據、關閉連接。這一切都發生在一句代碼中:

User user = jdbc.qeuryForObject("SELECT * FROM USERS WHERE ID = ?", 1, User.class);

JOOQ框架提供了一種基於生成實體的語言。使用這種語言,可以創建編譯時安全的查詢。JOOQ可以為許多數據庫生成方言。此外,它還清理樣板代碼,如關閉連接等。

UserRecord user = new UserRecord();
user.setId(1);
user.setName("Peter");
Result books1 = DSL.using(configuration)
  .selectFrom(USERS)
  .where(condition(user))
  .fetch();

對象關係映射或ORM提供了另一種與數據庫通信的方式。其思想是在代碼中創建Java對象(實體)和它們對應的表之間的映射。有代表性的ORM之一是MyBatis框架。

MyBatis是一個輕量級框架,它使用查詢在實體和表之間創建映射(而不是bean結構,就像在JPA提供程序中一樣,比如Hibernate)。因此,這個框架使用查詢並提供ORM特性。在這裏,可以看到一個簡短的示例(沒有配置文件):

// Bean mapping
public interface BlogMapper {
 @Select("SELECT * FROM blog WHERE id = #{id}")
 Blog selectBlog(int id);
}
// Fetching data
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

這兩種技術都支持JPA (Java持久性應用編程接口)。這意味着這兩種解決方案都可以部署到應用服務器上。JPA標準要求表/列和Java對象(實體)之間的映射。例如,用户表可以映射到以下實體:

@Data // this is not hibernate annotation, it's lombok getter/setter generator
@Entity
@Table(name = "USERS")
public class User {
 @Id
 @Column(name = "id")
 private Integer id;  
 @Column(name = "name")
 private String name;
}

這是最流行的ORM框架,具有許多內置特性。它在大約20年前首次發行。Hibernate還支持自定義SQL查詢的HQL語言。

Session session = sessionFactory.openSession();
User oldUser  = (User) session.get(User.class, 1); //get user
User newUser = new User(123,"John");
session.save(developer); //add user
//HQL example
Query query = session.createQuery("FROM Users");
List users = query.list();

在JPA實體之上,Spring數據提供了一個豐富的CRUD API,以及表達式查詢語言。Spring數據的主要優勢在於它只需要2-3行實現。生成的API基於方法命名轉換。

//Implementation, just by extending CrudRepository interface
public interface UserRepository extends CrudRepository<User, Long> {
 User findByName(String name);
 User findById(long id);
 @Query("SELECT u.ID FROM USERS u WHERE like ?1") //custom expression
 List findByUserName(String name);
}
//It's how to use this repository:
User johnUser = userRepository.findByName("John");
User johnUser = userRepository.findById(id);
List usersIdsWithOVPostfix = userRepository.findByUserName("%OV%");

很難給出一個客觀的比較評估,需要每個人根據自己的需求自己選擇。下面,我給出一個比較表格,大家可以參考這個表格結合自己的需求,來選擇自己的DAO層實現。

版權聲明:本文源自 網絡, 於,由 楠木軒 整理發佈,共 2446 字。

轉載請註明: 華為技術經理詳解:什麼樣的Java DAO層最適合我們的項目 - 楠木軒