下面我将详细讲解"Java Hibernate使用方法及整合查询"的完整攻略。
什么是Hibernate
Hibernate是Java语言中一个开放源代码的对象关系映射框架,它对JDBC进行了封装,使Java程序员可以使用面向对象的思维来操作数据库。Hibernate可以自动将Java中的对象和关系数据库之间进行映射,使数据库的表结构和Java中的类结构相同,从而可以实现对象的持久化存储。
Hibernate使用方法
配置Hibernate环境
配置Hibernate环境需要以下三个步骤:
- 引入Hibernate jar 包。可以从https://hibernate.org/orm/releases/下载最新的Hibernate版本,并将其加入项目的依赖中。
- 配置Hibernate.cfg.xml。这是Hibernate的核心配置文件,其中需要配置数据库的连接信息等。示例配置如下:
```xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
```
- 配置HibernateUtil类。这个类负责初始化Hibernate框架,以及获取Session对象。示例代码如下:
```java
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Throwabl ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return sessionFactory.openSession();
}
}
```
实体类定义
在Hibernate中,实体类需要满足以下要求:
- 必须有一个标识属性,通常是id。
- 必须有一个默认的构造函数。
- 属性必须用private修饰。
- 对象需要提供公共的Getter和Setter方法。
下面是一个Java实体类的示例:
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
public Product() {}
// Getter and Setter ...
}
定义DAO层数据访问接口
DAO全称是Data Access Object,它是一个抽象的数据访问接口,用于定义CRUD操作,与数据库进行交互。下面是一个DAO的示例:
public interface ProductDao {
void save(Product product);
void update(Product product);
void delete(Long id);
Product findById(Long id);
List<Product> findAll();
}
定义DAO层数据访问实现类
定义了DAO接口之后,需要编写DAO实现类来实现接口中定义的方法。下面是一个DAO实现类的示例:
public class ProductDaoImpl implements ProductDao {
private Session session;
public ProductDaoImpl(Session session) {
this.session = session;
}
@Override
public void save(Product product) {
session.save(product);
}
@Override
public void update(Product product) {
session.update(product);
}
@Override
public void delete(Long id) {
Product product = session.get(Product.class, id);
session.delete(product);
}
@Override
public Product findById(Long id) {
return session.get(Product.class, id);
}
@Override
public List<Product> findAll() {
return session.createQuery("from Product", Product.class).list();
}
}
整合查询
Hibernate提供了一种灵活的查询方式:Criteria查询,它可以通过对象属性,在不需要写SQL语句的情况下实现复杂查询。下面是一个Criteria查询的示例:
public List<Product> findProductsByNameAndPrice(String name, double price) {
Criteria criteria = session.createCriteria(Product.class);
if (StringUtils.isNotBlank(name)) {
criteria.add(Restrictions.like("name", name + "%"));
}
if (price > 0) {
criteria.add(Restrictions.lt("price", price));
}
return (List<Product>) criteria.list();
}
测试Hibernate
编写完Hibernate相关的代码之后,可以编写单元测试方法来验证Hibernate的正确性。下面是一个单元测试的示例:
public class HibernateTest {
private Session session;
private ProductDao productDao;
@Before
public void setUp() {
session = HibernateUtil.getSession();
productDao = new ProductDaoImpl(session);
}
@After
public void tearDown() {
session.close();
}
@Test
public void addProductTest() {
Product product = new Product();
product.setName("Java入门到精通");
product.setPrice(88.5);
productDao.save(product);
Product result = productDao.findById(product.getId());
Assert.assertEquals(product.getName(), result.getName());
Assert.assertEquals(product.getPrice(), result.getPrice(), 0);
}
// ... Other Test Methods ...
}
示例代码
下面提供两个示例代码:
示例1:新增用户并级联新增订单
public class UserOrderTest {
private Session session;
@Before
public void setUp() {
session = HibernateUtil.getSession();
}
@After
public void tearDown() {
session.close();
}
@Test
public void addUserAndOrderTest() {
// Save User
User user = new User();
user.setName("Ben");
user.setEmail("ben@example.com");
user.setPhone("13912345678");
Order order1 = new Order();
order1.setOrderNo("201808200001");
order1.setAmount(100.0);
order1.setUser(user);
Order order2 = new Order();
order2.setOrderNo("201808200002");
order2.setAmount(200.0);
order2.setUser(user);
session.save(user);
session.save(order1);
session.save(order2);
// Check User and Orders Exist
User resultUser = session.get(User.class, user.getId());
Assert.assertEquals(user.getName(), resultUser.getName());
Assert.assertEquals(user.getEmail(), resultUser.getEmail());
Assert.assertEquals(user.getPhone(), resultUser.getPhone());
Order resultOrder1 = session.get(Order.class, order1.getId());
Assert.assertEquals(order1.getOrderNo(), resultOrder1.getOrderNo());
Assert.assertEquals(order1.getAmount(), resultOrder1.getAmount(), 0);
Assert.assertEquals(order1.getUser().getId(), resultOrder1.getUser().getId());
Order resultOrder2 = session.get(Order.class, order2.getId());
Assert.assertEquals(order2.getOrderNo(), resultOrder2.getOrderNo());
Assert.assertEquals(order2.getAmount(), resultOrder2.getAmount(), 0);
Assert.assertEquals(order2.getUser().getId(), resultOrder2.getUser().getId());
}
}
示例2:动态查询用户信息
public class UserDynamicTest {
private Session session;
@Before
public void setUp() {
session = HibernateUtil.getSession();
}
@After
public void tearDown() {
session.close();
}
@Test
public void findUserTest() {
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.like("name", "Tom"));
criteria.addOrder(Order.asc("id"));
List<User> users = (List<User>) criteria.list();
Assert.assertEquals(2, users.size());
}
}
以上就是"Java Hibernate使用方法及整合查询"的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Hibernate使用方法及整合查询 - Python技术站