SpringDataJpa(二):使用jpa进行crud

使用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();

    }

猜你喜欢

转载自blog.csdn.net/Sakuraaaaaaa/article/details/107741935