使用Jpa进行CRUD
添加数据
使用EntityManager对象的persist
方法实现插入。EntityManagerFactory对象应该是单例存在。
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaManager {
private EntityManagerFactory entityManagerFactory;
@Before
public void init(){
entityManagerFactory = Persistence.createEntityManagerFactory("myJpa");
}
@Test
public void addCustomer(){
//创建entityManager对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//创建customer对象
Customer customer = new Customer();
customer.setCustName("大王");
customer.setCustAddress("浙江兰溪");
customer.setCustLevel("vip");
//插入数据
entityManager.persist(customer);
//提交事务
transaction.commit();
//关闭连接
entityManager.close();
}
}
删除数据
步骤:
1)获得EntityManager对象
2)开启事务
3)先从数据库中查询一个Customer对象(不能自己定义一个customer对象,需要一个持久态的对象)
4)使用entityManger对象remove
方法删除。参数就是Customer对象。
5)提交事务
6)关闭连接
Hibernate中对象的状态:
- 瞬时态:直接new的对象就是瞬时态。
- 持久态:把数据插入到数据库之后就是持久态。
- 游离态:把数据库和对象直接的关系断开之后。
@Test
public void deleteCustomer(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//先查询一个customer对象
//find方法:根据主键查询
//参数一:返回结果的数据类型
//参数二:主键的值
Customer customer = entityManager.find(Customer.class, 94l);
//删除
entityManager.remove(customer);
transaction.commit();
entityManager.close();
}
修改数据
步骤:
1)获得EntityManager对象
2)开启事务
3)根据id查询一个Customer对象
4)修改对象的属性。
5)把修改结果使用merge
方法,保存到数据库
6)提交事务
7)关闭连接
@Test
public void updateCustomer(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//查询customer对象
Customer customer = entityManager.find(Customer.class, 95l);
//修改属性
customer.setCustLevel("svip");
customer.setCustIndustry("教育");
//保存到数据库
entityManager.merge(customer);
transaction.commit();
entityManager.close();
}
查询数据
根据id查询
find
:根据id查询
步骤:
1、创建一个EntityManager对象
2、使用find方法根据id查询
3、打印结果
4、关闭连接
及时加载:find方法执行之后sql语句以及执行。
@Test
public void findById(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
Customer customer = entityManager.find(Customer.class, 95l);
System.out.println(customer);
entityManager.close();
}
getReference
:根据id查询
延迟加载 / 懒加载:
执行getReference方法之后sql并没有执行。当访问对象的属性时才执行查询。
@Test
public void findById(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
Customer customer = entityManager.getReference(Customer.class, 95l);
System.out.println(customer);
entityManager.close();
}
使用jpql查询
相当于是sql语句的一个变种。
一、查询全部
- sql:
SELECT * FROM cst_customer
- jpql:
from Customer
from语句中使用表名应该换成实体类的类名。
使用方法:
1)创建一个EntityManager对象
2)使用EntityManager创建一个Query对象,基于jpql创建。
3)使用query对象执行查询。
4)打印结果
5)关闭连接
@Test
public void findAll(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
//创建query,参数就是jpql
Query query = entityManager.createQuery("from Customer");
List<Customer> customerList = query.getResultList();
for (Customer customer : customerList) {
System.out.println(customer);
}
entityManager.close();
}
二、查询全部带分页
需要使用query
对象的方法设置分页信息。
起始的行号:setFistResult
每页的行数:setMaxResult
@Test
public void findAllWithPage(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
//创建query对象
Query query = entityManager.createQuery("from Customer");
//设置分页信息
query.setFirstResult(0);
query.setMaxResults(5);
//执行查询
List<Customer> customerList = query.getResultList();
//打印结果
for (Customer customer : customerList) {
System.out.println(customer);
}
entityManager.close();
}
三、带条件的查询
根据id查询:
- sql:
select * from cst_customer where cust_id = ?
- jpql:
from Customer where custId = ?
注意:设置的索引1可能会在idea中报错,不用管他,可以直接执行
@Test
public void findById3(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createQuery("from Customer where custId = ?");
//设置查询条件
//设置参数,索引从1开始
query.setParameter(1,95l);
Customer customer = (Customer) query.getSingleResult();
System.out.println(customer);
entityManager.close();
}
根据客户名称模糊查询:
- sql:
select * from cst_customer where cust_name like '%王%'
- jpql:
from Customer where custName like ?
@Test
public void findByName(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createQuery("from Customer where custName like ?");
//设置参数
query.setParameter((int) 1,"%王%");
//执行查询
List<Customer> customerList = query.getResultList();
for (Customer customer : customerList) {
System.out.println(customer);
}
entityManager.close();
}
jpql相当于sql语句,只是把表名替换成实体类的类名,字段名换成实体类的属性名。
四、查询带排序
- sql:
SELECT * from cst_customer ORDER BY cust_id desc
- jpql:
from Customer order by custId desc
@Test
public void findAllWithOrder(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createQuery("from Customer order by custId desc");
List<Customer> customerList = query.getResultList();
for (Customer customer : customerList) {
System.out.println(customer);
}
entityManager.close();
}
五、聚合查询
- sql:
SELECT COUNT(*) from cst_customer
- jpql:
select count(*) from Customer
注意:count得到的是长整型
@Test
public void testCount(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createQuery("select count(*) from Customer");
Long count = (Long) query.getSingleResult();
System.out.println(count);
entityManager.close();
}