前言:常用的ORM框架有哪些
JdbcTemplate
JdbcTemplate 是Spring框架提供的一个JDBC抽象库,旨在简化传统的JDBC操作,避免了繁琐的JDBC代码和数据库资源的手动处理。通过JdbcTemplate,开发者可以更加专注于业务逻辑而不是数据库的连接管理和资源释放。
核心特点:
- 简化数据库交互:自动处理连接的开启和关闭,减少了重复的数据库连接代码。
- 异常处理 :提供了一个统一的异常处理机制,将SQL异常转换为
DataAccessException
,方便异常管理。 - 灵活的查询和更新操作:支持直接执行SQL查询和更新操作,以及调用存储过程。
- 回调机制 :通过
RowMapper
和ResultSetExtractor
等回调接口,可以将数据库结果集映射到Java对象或集合。
使用场景:适用于需要直接使用SQL进行数据操作的场景,特别是在需要细粒度控制SQL执行和结果映射时。
Spring Data JPA
Spring Data JPA 是对JPA(Java Persistence API)的进一步封装和整合,目的是简化JPA的使用和提高开发效率。Spring Data JPA通过提供repository抽象层,使得数据库操作更加简单。
核心特点:
- 简化数据访问层(DAO)代码 :通过扩展
JpaRepository
接口,自动实现了一系列标准的数据访问方法,如保存、删除、查询等。 - 查询方法名解析:支持通过解析方法名自动生成查询,无需编写查询语句。
- 查询注解 :通过
@Query
注解,可以自定义JPQL(Java Persistence Query Language)或原生SQL查询。 - 事务管理:整合了Spring的声明式事务管理。
使用场景:适用于JPA项目,特别是对于域驱动设计(DDD)和需要快速开发的应用程序。
MyBatis
MyBatis 是一个半ORM(对象关系映射)框架,提供了对象与数据库之间的映射,同时保留了编写原生SQL的能力。它避免了JDBC代码的繁琐和手动设置参数、获取结果集的过程,同时提供了更多的控制权和灵活性。
核心特点:
- 灵活的SQL编写:支持完全的SQL编写,使得开发者可以利用数据库的特性,如窗口函数、CTE(公用表表达式)等。
- 动态SQL:支持动态SQL语句的构建,根据条件拼接不同的SQL片段。
- 映射器(Mapper)XML文件:通过XML文件或注解定义SQL语句和映射规则。
- 延迟加载:支持关联对象的延迟加载。
使用场景:适用于那些需要高度控制SQL语句,或数据库设计复杂、需要优化数据库查询性能的项目。
本文重点:学会三种方式的CRUD操作
第一步:引入pom依赖
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot Starter for Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Spring Boot Starter for JdbcTemplate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
第二步:配置数据库属性
spring.datasource.url=jdbc:mysql://xxxx:3306/nextJava?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# JPA特有配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
# MyBatis特有配置
mybatis.mapper-locations=classpath:mappers/*.xml
第三步:代码实现
-
使用JdbcTemplate
@Repository
public class UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;// 增 public int save(User user) { return jdbcTemplate.update("INSERT INTO user(name, email) VALUES(?, ?)", user.getName(), user.getEmail()); } // 删 public int deleteById(Long id) { return jdbcTemplate.update("DELETE FROM user WHERE id = ?", id); } // 改 public int update(User user) { return jdbcTemplate.update("UPDATE user SET name = ?, email = ? WHERE id = ?", user.getName(), user.getEmail(), user.getId()); } // 查 public User findById(Long id) { return jdbcTemplate.queryForObject("SELECT * FROM user WHERE id = ?", new Object[]{id}, (rs, rowNum) -> new User( rs.getLong("id"), rs.getString("name"), rs.getString("email") )); }
}
2、使用Spring Data JPA
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Constructors, Getters and Setters
}
使用Spring Data JPA,只需要定义接口,继承JpaRepository即可自动拥有增删改查功能:
public interface UserRepository extends JpaRepository<User, Long> {
}
3、使用Mybatis
在src/main/resources/mappers目录下创建MyBatis的映射文件UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<insert id="save" parameterType="com.example.model.User">
INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>
<delete id="deleteById" parameterType="long">
DELETE FROM user WHERE id = #{id}
</delete>
<update id="update" parameterType="com.example.model.User">
UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<select id="findById" parameterType="long" resultType="com.example.model.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
以及Mapper类
@Mapper
public interface UserMapper {
void save(User user);
void deleteById(Long id);
void update(User user);
User findById(Long id);
}
对应表创建语句为:
CREATE TABLE IF NOT EXISTS `User` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
结束语
无论是使用JdbcTemplate来直接操作数据库,还是利用Spring Data JPA和MyBatis这样的ORM框架来简化数据持久层的开发,Spring Boot都以其"约定优于配置"的理念,让开发者能够集中精力于业务逻辑的实现,而不是纠结于繁琐的配置和底层实现细节。下一节我们来学习一下事务管理