优化 Java 的 DAO(Data Access Object)查询,通常可以从SQL 本身、DAO 设计、框架使用、缓存与架构几个层面入手。下面按“由浅入深”的方式给出常见且实用的方法。
❌ 不推荐:
SELECT * FROM user;
✅ 推荐:
SELECT id, name, email FROM user;
减少 IO 和网络传输。
WHERE、JOIN、ORDER BY 字段建索引LIKE '%xxx'❌ 不推荐一次性查全表:
SELECT * FROM order;
✅ 使用分页:
SELECT * FROM order LIMIT 10 OFFSET 20;
典型问题:
List<User> users = userDao.findAll();
for (User u : users) {
u.setOrders(orderDao.findByUserId(u.getId()));
}
✅ 优化方式:
JOIN 或 IN 查询<collection> 嵌套查询JOIN FETCHString sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setLong(1, id);
❌ 单条插入:
for (User u : list) {
userDao.insert(u);
}
✅ 批量插入:
userDao.batchInsert(list);
或 JDBC:
ps.addBatch();
ps.executeBatch();
resultMap 避免重复映射<sql> + <include> 复用 SQLselect *,明确字段@Query("select new com.xxx.UserDTO(u.id, u.name) from User u")
FetchType.EAGEREntityManager 的批量操作User user = cache.get(id);
if (user == null) {
user = userDao.findById(id);
cache.put(id, user);
}
@Transactional(readOnly = true)
有助于数据库优化和连接复用。
❌ 原始 DAO:
List<User> users = userDao.findAll();
for (User u : users) {
u.setRole(roleDao.findByUserId(u.getId()));
}
✅ 优化后:
SELECT u.id, u.name, r.role_name
FROM user u
LEFT JOIN role r ON u.id = r.user_id
WHERE u.status = 1
LIMIT 20;
DAO 查询优化的核心:少查、快查、不重复查、不查无用数据。
如果你愿意,可以贴一段你的 DAO 代码或 SQL,我可以帮你做具体优化分析。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。