基礎概念
ORM 框架
- ORM 框架是一種技術,用於在物件導向的程式語言(如 Java)和關係型資料庫之間建立對映關係。
- ORM 框架允許開發者使用物件導向的方式運算元據庫,而不需要直接編寫 SQL 語句。
JPA
- JPA 是一種 Java 持久化 API 規範,定義了一套標準的 Java 持久化 API。
- JPA 規範為 ORM 框架提供了統一的介面和抽象層,使得開發者可以在不同的 ORM 框架之間輕鬆切換。
JPA 的提出主要是為了整合市面上已有的 ORM 框架,比如說 Hibernate、EclipseLink 等。官方覺得你們搞框架可以,但不要亂搞,得按照我的標準來。
常見框架
JDBC
JDBC (Java Database Connectivity) 是 Java 程式語言中用於訪問和運算元據庫的標準 API。它提供了一組 Java 類和介面,使得 Java 程式可以以統一的方式連線、查詢和更新各種關係型資料庫。
// 1. 載入驅動程式
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 獲取資料庫連線
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "username", "password");
// 3. 建立 Statement 物件
Statement stmt = conn.createStatement();
// 4. 執行 SQL 語句並獲取結果集
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 5. 處理結果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
// 6. 關閉資源
rs.close();
stmt.close();
conn.close();
MyBatis
- MyBatis 是一個持久層框架,建立在JDBC之上,用於簡化資料庫操作。
- MyBatis 透過XML或註解的方式配置SQL語句和結果對映,大幅減少了JDBC樣板程式碼的編寫。
- MyBatis 提供了靈活的SQL語句編寫和結果集對映功能,適合對效能要求較高的場景。
首先,我們定義 User 實體類:
public class User {
private int id;
private String name;
private String email;
// getters and setters
}
然後,我們建立一個 UserMapper 介面,定義運算元據庫的方法:
public interface UserMapper {
List<User> getAllUsers();
User getUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
接下來,我們在 resources/mapper/UserMapper.xml
檔案中定義 SQL 語句:
<?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.demo.mapper.UserMapper">
<select id="getAllUsers" resultType="com.example.demo.entity.User">
SELECT * FROM user
</select>
<select id="getUserById" parameterType="int" resultType="com.example.demo.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.demo.entity.User">
INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="com.example.demo.entity.User">
UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
最後,我們在應用程式中使用 MyBatis 執行 CRUD 操作:
// 建立 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 獲取 SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 查詢所有使用者
List<User> users = mapper.getAllUsers();
// 根據 ID 查詢使用者
User user = mapper.getUserById(1);
// 插入使用者
User newUser = new User("John Doe", "john.doe@example.com");
mapper.insertUser(newUser);
session.commit();
// 更新使用者
user.setName("Jane Doe");
mapper.updateUser(user);
session.commit();
// 刪除使用者
mapper.deleteUser(user.getId());
session.commit();
}
這就是 MyBatis 的基本使用方式。MyBatis 提供了更多高階特性,如動態 SQL、分頁、快取等,可以根據實際需求進一步探索。
Spring Data JPA
Spring Data JPA 是 Spring 提出的,它增加了一個抽象層,用來遮蔽不同 ORM 的框架差異。通常Spring Data JPA 底層的 ORM 框架是 Hibernate。
我們定義 User 實體類:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String email;
// Getters, setters, and constructors
}
在Spring Data JPA中,只需要編寫這樣的介面就可實現資料訪問。不再像我們以往編寫了介面時候還需要自己編寫介面實現類,直接減少了我們的檔案清單。
同時Spring-data-jpa還有一大特性就是透過解析方法名建立查詢。
接下來,我們建立一個 UserRepository 介面,該介面繼承自 JpaRepository 介面:
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
在上例中,我們可以看到函式:
- findByEmail(String email);
實現了按email查詢User實體.現在,我們可以在應用程式中使用 UserRepository 執行 CRUD 操作:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private UserRepository userRepository;
@PostConstruct
public void init() {
// Create a new user
User user = new User("John Doe", "john.doe@example.com");
userRepository.save(user);
// Find a user by email
Optional<User> optionalUser = userRepository.findByEmail("john.doe@example.com");
optionalUser.ifPresent(System.out::println);
// Update the user
user.setName("Jane Doe");
userRepository.save(user);
// Delete the user
userRepository.delete(user);
}
}
參考連結
https://javabetter.cn/springboot/jpa.html#spring-boot-整合-spring-data-jpa