在Java Web开发领域,JPA(Java Persistence API)和Thymeleaf是两个非常流行的技术栈组件,它们分别用于数据持久化和视图渲染。将JPA与Thymeleaf结合使用,可以构建出既高效又易于维护的Web应用程序。以下是对这一组合使用的总结:
1. 数据持久化标准
- JPA是Java EE 5标准的一部分,它提供了一种将Java对象映射到关系数据库中的表的标准方式。这意呀着开发者可以使用纯Java对象(POJOs)来操作数据库,而无需编写大量的SQL语句。
2. ORM(对象关系映射)
- JPA通过ORM技术,实现了Java对象与数据库表之间的映射。开发者可以定义实体类(Entity)来映射数据库表,并通过JPA提供的API进行CRUD(创建、读取、更新、删除)操作。
3. 灵活性
- JPA支持多种实现,如Hibernate、EclipseLink等,这为开发者提供了选择最适合项目需求的实现方案的灵活性。
4. 简化开发
- JPA减少了数据库交互的复杂性,使得开发者可以更加专注于业务逻辑的实现。同时,它也支持事务管理、缓存等高级特性,进一步提升了开发效率。
-
1. 数据持久化标准
- JPA是Java EE 5标准的一部分,它提供了一种将Java对象映射到关系数据库中的表的标准方式。这意呀着开发者可以使用纯Java对象(POJOs)来操作数据库,而无需编写大量的SQL语句。
-
2. ORM(对象关系映射)
- JPA通过ORM技术,实现了Java对象与数据库表之间的映射。开发者可以定义实体类(Entity)来映射数据库表,并通过JPA提供的API进行CRUD(创建、读取、更新、删除)操作。
-
3. 灵活性
- JPA支持多种实现,如Hibernate、EclipseLink等,这为开发者提供了选择最适合项目需求的实现方案的灵活性。
-
4. 简化开发
- JPA减少了数据库交互的复杂性,使得开发者可以更加专注于业务逻辑的实现。同时,它也支持事务管理、缓存等高级特性,进一步提升了开发效率。
-
Thymeleaf 总结
1. 模板引擎
- Thymeleaf是一个现代的服务器端Java模板引擎,用于Web和独立环境。它主要用于处理Web视图层,将模型数据渲染到HTML页面中。
-
2. 易于集成
- Thymeleaf可以轻松地与Spring MVC等框架集成,为开发者提供了一种声明式地将模型数据绑定到视图模板的方法。
-
3. 安全性
- Thymeleaf在处理HTML时,能够自然地防止XSS攻击,因为它会对模板中的数据进行转义处理。这使得开发者在构建安全的Web应用时更加放心。
-
4. 灵活性
- Thymeleaf支持多种模板模式(如HTML5、XML、JavaScript、纯文本等),并且提供了丰富的表达式语言,使得开发者可以灵活地控制模板的渲染过程。
-
5. 易于维护
- Thymeleaf的模板代码清晰易懂,易于维护。它鼓励开发者编写结构良好的HTML代码,并通过Thymeleaf的特定属性来添加动态内容。
构建项目
1.创建项目
2.修改pox.xml文件,添加其他依赖及设置:
<dependencies>
<!-- 引入SpringBoot的Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>6.3.3</version>
</dependency>
<!-- 引入JSTL标签库依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 引入MyBatis-Plus支持(不需要再引入MyBatis包) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.7</version>
</dependency>
<!-- 引入Druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
<!-- <!– 引入MyBatis-Plus动态数据源支持 –> -->
<!-- <dependency> -->
<!-- <groupId>com.baomidou</groupId> -->
<!-- <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> -->
<!-- <version>4.1.2</version> -->
<!-- </dependency> -->
<!-- 引入MySQL驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 引入Lombok完成实体类自动Getter/Setter -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 引入Slf4j日志依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- 引入SpringBoot测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 配置处理依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 配置热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- thymeleaf依赖布局 -->
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
</dependencies>
2.配置文件
spring:
datasource:
#使用Druid作为数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///crm?useUnicode=true&characterEncoding=utf-8
username: root
password: liuyuhan
7.2 模型开发
模型包括entity、repository、service
7.2.1 entity
实体类包括User、Role,使用注解配置映射,且配置好关联关系
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
private Long usrId;
private String usrName;
private String usrPassword;
@TableField("usr_role_id")
private Long usrRoleId;
@TableField(exist = false)
private Role role;
private Integer usrFlag;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_role")
@JsonIgnoreProperties(value = {"hibernateLazyInitializer","handler"})
public class Role implements Serializable {
@TableId(type = IdType.AUTO)
private Long roleId;
private String roleName;
private String roleDesc;
private Long roleFlag;
// @OneToMany(targetEntity = User.class,fetch = FetchType.LAZY,cascade = CascadeType.REMOVE,mappedBy = "role")
// private Set<User> users = new HashSet<User>();
// @JsonIgnore
// private Set<User> users = new HashSet<>();
}
7.2.2 repository
repository 只需要提供实体相应的接口,继承JpaRepository接口即可,如果有特殊的操作,则可适当添加对应的方法。
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
public List<User> findByUsrNameAndUsrPassword(String usrName,String usrPassword);
}
public interface RoleRepository extends JpaRepository<Role,Long> {
}
UserRepository除继承JpaRepository外,还继承了JpaSpecificationExecutor,用于复杂查询,具体操作在service中实现,另提供了按用户名和密码进行查询的方法。
7.2.3 service
service层咱们分别开发UserService和RoleService
public interface UserService extends IService<User> {
/**
* 用户登录
* @param usrName
* @param usrPassword
* @return
*/
User login(String usrName, String usrPassword);
int addUser(User user);
int deleteUser(Long usrId);
int updateUser(User user);
User getUser(Long usrId);
/**
* 根据用户名和角色ID分页查询用户数据
* @param usrName
* @param roleId
* @param page
* @return
*/
Page<User> findPage(String usrName, Long roleId, Page<User> page);
/**
* 新增
* @param user
*/
void saveUser(User user);
/**
* 检查用户名是否存在
* @param usrName
* @return
*/
User checkUserName(String usrName);
/**
* 删除
* @param usrId
* @return
*/
int delUser(Long usrId);
}
public interface RoleService extends IService<Role> {
List<Role> findAllRoles();
}