点击▲关注 “ IT168企业级 ”给公众号置顶
更多精彩 第一时间直达
来自:覃佑桦 | 责编:乐乐
链接:dzone.com/articles/what-java-dao-layer-is-best-for-your-project
本文将带您浏览和比较最受欢迎Java数据库访问框架(DAO层)。假设您正在开发一个Java程序,有许多办法可以让您的应用连上数据库。下面会列举各数据库访问框架的适用场景,相信能够帮您选到适合项目的开发框架。
JDBC:简单数据库查询
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-template工具,像是Spring JDBC template或者Apache DBUtils。例如在处理request时,Spring template可以用一句代码发送带参数的request,完成反序列化数据,关闭连接:
User user = jdbc.qeuryForObject( "SELECT * FROM USERS WHERE ID = ?" ,
1 , User.class);
JOOQ:面Java对象查询
JOOQ提供了一种DSL来解决查询问题。这种语言基于生成的entity对象提供编译时安全(compile-time-safe)查询。JOOQ支持不同的数据库,能够减少模板代码。
UserRecord user =
new
UserRecord();
user.setId(
1
);
user.setName(
"Peter"
);
Result
books1 = DSL.using(configuration)
.selectFrom(USERS)
.where(condition(user))
.fetch();
适用场景:要求JDBC查询保证编译时安全,迁移到不同数据库,自动生成CRUD JDBC API;
不适合:一些高级功能要收费。
MyBatis:带查询功能的简单ORM
ORM(对象关系映射)提供了另一种和数据库打交道的方式,其核心思想是把Java对象(entity)映射到对应的数据库表。MyBatis就是其中一员。
MyBatis是一个轻量级框架,使用JPA provider(非bean结构)完成映射。下面是一个简单的示例查询(不用配置文件):
// Bean映射
public
interface
BlogMapper
{
3
@Select
(
"SELECT * FROM blog WHERE id = #{id}"
)
Blog
selectBlog
(
int
id);
}
// 获取数据
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(
101
);
不适合:不喜欢XML。
Hibernate与Spring Data
二者都支持JPA(Java持久化API),也就是说都支持部署到应用服务器。JPA标准中要求数据库table/column与Java对象(entity)对应。例如,USER表对应的entity如下:
@Data
// 这不是hibernate注解,而是lombok getter/setter
@Entity
@Table
(name =
"USERS"
)
public
class
User
{
@Id
@Column
(name =
"id"
)
private
Integer id;
@Column
(name =
"name"
)
private
String name;
}
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 示例
Query query = session.createQuery(
"FROM Users"
);
List users = query.list();
不适合:不喜欢生成其他Java实体类,不愿意学习新框架,需要掌控底层细节。
Spring Data:新ORM抽象层
Spring Data在JPA entity的基础上提供了丰富的CRUD API以及查询表达式语言。其最大的优势在于只需要2-3行代码可以搞定。生成的API基于函数命名规范。
// 只需要实现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"
)
//自定义表达式
List
findByUserName
(String name);
}
// 查询示例
User johnUser = userRepository.findByName(
"John"
);
User johnUser = userRepository.findById(id);
List
usersIdsWithOVPostfix = userRepository.findByUserName(
"%OV%"
);
总结
下面这张表进行了总结。注意:仅代表作者个人观点,没有做严谨的分析与测试。