创建新的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.properties
或application.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对数据库模式的操作,如上述提及的update
、create
、create-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的开发流程,实际开发中还可能涉及到事务管理、分页查询、自定义类型处理器、二级缓存等相关配置和功能实现。
评论