JAVA資料庫

Ho1d_F0rward發表於2024-08-17

基礎概念

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

相關文章