目录
- Dao层的作用
- Dao层的特点
- [与 Service 层和 Controller 层的关系](#与 Service 层和 Controller 层的关系)
- 实例介绍
-
- MenuDao
- OperatorLogDao
- RoleDao
- UserDao
- 四个文件的共同点
-
- 引用的包
- 使用`@Repository`注解
- 继承`JpaRepository`接口
- 接口的实体类的主键类型
- [使用 @Query()注解](#使用 @Query()注解)
Dao层的作用
- 负责与数据库进行交互,主要负责数据的查询和更新。
- Dao层用于封装数据库访问的细节,为上层业务逻辑提供数据操作服务。
Dao层的特点
- Dao 层是独立的,与 Service 层和 Controller 层无直接关系,便于维护和扩展。
- 使用面向接口编程,提高代码的灵活性和可扩展性。
- Dao层通常指的是数据访问对象(Data Access Object)层,它通常是一个接口,而不是一个类。
- 使用接口而不是类,可以实现松耦合 ,方便替换不同的数据库实现。
与 Service 层和 Controller 层的关系
- Dao 层位于 Service 层和 Controller 层之间,负责数据的查询和更新。
- Service 层调用 Dao 层的方法,进行数据的操作。
- Controller 层负责处理 HTTP 请求,调用 Service 层的方法,最终返回给前端页面。
实例介绍
MenuDao
java
package hanshuhuan.test.dao.admin;
import hanshuhuan.test.entity.admin.Menu;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface MenuDao extends JpaRepository<Menu, Long> {
//从`Menu`表中选择所有`id`等于`:id`的记录
@Query("select m from Menu m where m.id = :id")
//它接收一个`Long`类型的参数`id`
//使用上面定义的查询语句来查找`Menu`表中`id`等于`:id`的记录
//如果找到了这样的记录,就返回这个记录;如果没有找到,就返回一个空的`Menu`对象
Menu find(@Param("id")Long id);
}
OperatorLogDao
java
package hanshuhuan.test.dao.admin;
import java.util.List;
import hanshuhuan.test.entity.admin.OperaterLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface OperatorLogDao extends JpaRepository<OperaterLog, Long> {
@Query("select ol from OperaterLog ol where id =:aaid")
OperaterLog find(@Param("aaid")Long id);
@Query(value="select * from hansh_operator_logs order by creat_time desc limit 0,:size",nativeQuery=true)
List<OperaterLog> findLastestLog(@Param("size")int size);
}
RoleDao
java
package hanshuhuan.test.dao.admin;
import hanshuhuan.test.entity.admin.Role;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface RoleDao extends JpaRepository<Role, Long> {
@Query("select r from Role r where r.id = :id")
Role find(@Param("id")Long id);
}
UserDao
java
package hanshuhuan.test.dao.admin;
import hanshuhuan.test.entity.admin.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserDao extends JpaRepository<User, Long>{
public User findByUsername(String username);
@Query("select u from User u where id = :id")
public User find(@Param("id")Long id);
}
四个文件的共同点
引用的包
- 都有一个相应的实体【MenuDao-Menu】【OperatorLogDao-OperatorLog】【RoleDao-Role】【UserDao-User】。
使用@Repository
注解
@Repository
注解在Spring框架中用于标记数据访问层(DAL)的类,当使用这个注解时,Spring会自动将这些类注册为Bean,并在需要时自动注入到其他Bean中【通过使用Spring Boot的Bean,开发者可以更轻松地管理和配置应用程序的组件】。在相应的DAO类上使用@Repository
注解,Spring会自动管理这些类的生命周期,并在需要时自动注入到其他需要使用这些DAO类的类中。
继承JpaRepository
接口
JpaRepository
是一个用于简化数据库操作的接口,它提供了基本的增删查改方法。
接口的实体类的主键类型
- 均为
Long
,<>
表示泛型参数的类型,这个泛型参数的作用是限制该接口的方法只能操作主键类型为Long
的实体类,以确保方法的返回值和参数类型的一致性。
使用 @Query()注解
-
@Query() 是一个用于在 Spring Data JPA中定义查询方法的注解。它可以用于自定义基于实体类的查询方法,允许在方法上定义一些元数据来描述查询,例如查询名称、查询类型、查询条件等。
-
使用 @Query() 的语法如下:
@Query(query = "SELECT * FROM entity WHERE id = :id", nativeQuery = true)
List<Entity> findById(@Param("id") Long id);
其中,query 属性用于指定查询语句,可以包含占位符来表示参数值。如果需要使用 nativeQuery 属性,则必须将 nativeQuery 属性设置为 true,并且查询语句必须使用 JPQL 或 SQL 方言。