【Java教程】Hibernate的使用

零 Java教程评论96字数 6104阅读20分20秒阅读模式

【Java教程】Hibernate的使用

创建新的Spring Boot项目

选择Web作为基本依赖(spring-boot-starter-web),同时添加Hibernate和对应的数据库驱动依赖,例如MySQL的连接器(mysql-connector-java)以及MyBatis Spring Boot Starter(spring-boot-starter-data-jpa)。

xml

复制代码
<!-- Maven -->
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-core</artifactId>
 </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
  </dependency>
</dependencies>

解释

配置数据源

Spring Boot默认提供了自动配置功能,只需要在application.propertiesapplication.yml中配置相关的数据库连接信息:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

ini

复制代码
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=mysecretpassword
spring.jpa.hibernate.ddl-auto=update

解释

这里spring.jpa.hibernate.ddl-auto参数用来控制Hibernate对数据库模式的操作,如上述提及的updatecreatecreate-drop等。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

创建实体类

根据数据库表结构创建对应的Java实体类,使用Hibernate注解(如@Entity@Table@Id@GeneratedValue@Column等)描述实体类与数据库表的映射关系。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

less

复制代码
@Data
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false)
    private String username;

  
}

解释

创建Repository接口

利用Spring Data JPA的Repository接口,创建一个继承自JpaRepository或其他相关接口的接口,用于执行数据库操作:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

csharp

复制代码
public interface UserRepository extends JpaRepository<User, Long> {
    // 可以添加自定义的查询方法
    List<User> findByUsername(String username);
}

解释

注入和使用Repository

在服务类中通过@Autowired注解注入Repository,然后就可以调用相应的方法进行数据库的CRUD操作了:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

java

复制代码
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User createUser(User user) {
        return userRepository.save(user);
    }

 // @Transactional 开启事务 或者直接加在UserService类上
 @Transactional(readOnly = false, rollbackFor = Exception.class)
 public void updateUserAndSaveSomethingElse(User user, SomeOtherEntity other) {
     // 更新用户
     userRepository.save(user);

     // 执行其他操作,如果有任何异常发生,整个事务都将回滚
     someOtherRepository.save(other);
 }
    // 其他业务逻辑方法...
}

解释

步骤6:配置Controller

  • 创建一个Controller层,注入UserService

less

复制代码
@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/")
    public User getUser(@RequestParam("id")  Long id) {
        return userService.getUserById(id);
    }
    // ...
}

解释

步骤7:启动和测试

  • 最后,编写主启动类,使用@SpringBootApplication注解启动Spring Boot应用并开启事务。

less

复制代码
@SpringBootApplication
@EnableTransactionManagement
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

解释

其他API使用案例

在Hibernate中,除了实体映射注解之外,还有很多API可用于执行数据库操作和查询。以下是一些常见的API使用案例:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

使用原生SQL查询:

kotlin

复制代码
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository extends JpaRepository<User, Long> {

    // 使用原生SQL查询方法
    @Query(value = "SELECT * FROM Users WHERE username = :username", nativeQuery = true)
    List<User> findByUsernameUsingSql(@Param("username") String username);
}

解释

使用HQL查询:

kotlin

复制代码
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface UserRepository extends JpaRepository<User, Long> {

    // 自定义HQL查询方法
    @Query("FROM User u WHERE u.username = ?1")
    List<User> findByUsernameUsingHql(String username);

    // 使用命名查询(在实体类或orm.xml  “UserMapper.xml” 中定义的HQL查询)
    @Query(name = "User.findByEmail", nativeQuery = false)
    List<User> findByEmail(String email);
}

解释

在上述例子中:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

  • findByUsernameUsingHql 方法使用了HQL查询字符串,通过问号占位符接受参数。
  • findByEmail 方法使用了命名查询,需要在User实体类上或者UserMapper.xml文件中预先定义好这个查询。
  • findByUsernameUsingSql 方法使用了原生SQL查询,并通过@Param注解传递参数,nativeQuery = true表明这是原生SQL而非HQL。

例如,在User.hbm.xml映射文件中定义一个命名查询:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

xml

复制代码
<hibernate-mapping package="com.example.demo.entity">
    <class name="User" table="Users">
        <!-- 省略其他属性和关联映射 -->

        <!-- 定义命名查询 -->
        <query name="User.findByEmail">
            <![CDATA[
                FROM User WHERE email = :email
            ]]>
        </query>
    </class>
</hibernate-mapping>

解释

也可以通过Session对象或EntityManager(如果是使用JPA的话)来执行这个命名查询:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

ini

复制代码
Session session = sessionFactory.getCurrentSession();
Query namedQuery = session.getNamedQuery("User.findByEmail");
namedQuery.setParameter("email", "1099532501@qq.com");
List<User> users = namedQuery.list();

解释

1. SessionFactory和Session的创建与使用:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15979.html

java

复制代码
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            // 创建Configuration对象并加载配置文件
            Configuration configuration = new Configuration().configure();
            // 通过Configuration创建SessionFactory
            sessionFactory = configuration.buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}

// 使用SessionFactory创建Session实例并进行CRUD操作
public void doSomeOperation() {
    Session session = HibernateUtil.getSession();

    try {
        // 开始事务
        session.beginTransaction();

        // 示例保存一个实体
        User user = new User();
        user.setUsername("test");
        session.save(user);

        // 提交事务
        session.getTransaction().commit();
    } catch (Exception e) {
        if (session != null && session.isOpen()) {
            session.getTransaction().rollback();
        }
        e.printStackTrace();
    } finally {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
}

解释

2. HQL查询:

ini

复制代码
public List<User> getUsersByName(String name) {
    Session session = HibernateUtil.getSession();

    try {
        // 创建Query对象
        Query query = session.createQuery("from User where username = :username");
        // 绑定参数
        query.setParameter("username", name);
        
        // 执行查询并获取结果
        List<User> users = query.getResultList();

        return users;
    } finally {
        session.close();
    }
}

解释

3. Criteria API查询:

ini

复制代码
public List<User> getUsersByCriteria(String name) {
    Session session = HibernateUtil.getSession();

    try {
        Criteria criteria = session.createCriteria(User.class);
        criteria.add(Restrictions.eq("username", name));

        return criteria.list();
    } finally {
        session.close();
    }
}

解释

4. Native SQL查询:

ini

复制代码
public List<Object[]> getCustomData() {
    Session session = HibernateUtil.getSession();

    try {
        SQLQuery sqlQuery = session.createSQLQuery("SELECT u.username, COUNT(a.id) FROM User u JOIN Address a ON u.id = a.user_id GROUP BY u.username");

        return sqlQuery.list();
    } finally {
        session.close();
    }
}

解释

启动应用后,可以通过HTTP客户端或浏览器访问配置好的API接口,测试数据库操作是否正常。

以上步骤概述了一个基础的Spring Boot集成Hibernate的开发流程,实际开发中还可能涉及到事务管理、分页查询、自定义类型处理器、二级缓存等相关配置和功能实现。

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/javajc/15979.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论