自学内容网 自学内容网

spring-data-aop 使用EntityManager操作数据库

spring-data-aop 使用EntityManager操作数据库

作为Bean注入

import javax.persistence.EntityManager;

@ Autowired
private EntityManager entityManager;

CURD操作

createQuery 针对JPQL的查询、删除、修改操作

  • 查询

    List customers = entityManager.createQuery("select c from Customer c where c.customerName like '%" + keyboard + "%'", Customer.class).getResultList;
    

    使用JPQL语句时,查询全字段切记不能用*,正确全字段查询如我上方示例

    或者

    String sql = "select c from Customer c where c.customerName = :keyboard";
    TypedQuery query = entityManager.createQuery(sql, Customer.class);
    query.setParameter("keyboard", "jack");//设置JPQL参数
    List resultList = query.getResultList();//获取查询结果
    

    我更推荐使用第二种方式编写代码~

  • 删除 / 修改

    import org.springframework.transaction.annotation.Transactional;
    
    @Transactional
    public void deleteCustomer(String keyboard){
      String sql = "delete from Customer c where c.customerName = :key";// JPQL删除语句
      Query query = entityManager.createQuery(sql);
      query.setParameter("key", keyboard);//设置JPQL参数
      int executed = query.executeUpdate();// 执行删除
    }
    

    修改删除类似,仅把JPQL修改成update语句即可,不需要改其他代码。

总结

使用 entityManager 执行 删除/修改 操作时,必须要在方法上加 @Transactional 事务注解!

createNativeQuery 原生SQL查询

  • 查询

    String sql = "select c.* from customer c where c.customer_name = :key";// 原生SQL
    entityManager.createNativeQuery(sql, Customer.class);
    Query query = entityManager.createNativeQuery(querySql, Customer.class);
    query.setParameter("key", "jack");//设置JPQL参数
    List resultList = query.getResultList();
    
  • 增加(不推荐使用)

    @Transactional
    public void updateCustomer(String name){
      String updateSql = "insert into customer(age,name) values (:age,:name)";
      Query query = entityManager.createNativeQuery(updateSql, Customer.class);
      query.setParameter("age", 20);
      query.setParameter("name", name);
      int executed = query.executeUpdate();
    }
    
  • 删除/修改

    @Transactional
    public void updateCustomer(String customerName){
      String updateSql = "update customer c set c.customer_age = :age where c.customer_name = :key";
      Query query = entityManager.createNativeQuery(updateSql, Customer.class);
      query.setParameter("age", 20);
      query.setParameter("key", customerName);
      int executed = query.executeUpdate();
    }
    

    删除修改类似,仅把SQL修改成delete语句即可,不需要改其他代码。

find 按主键查询一条数据

第一个参数是类,第二个参数是主键值

Customer customer = (Customer) entityManager.find(Customer, 103);

persist 将对象作为一条数据写入表

@Transactional
public void saveCustomer(String name){
    Customer customer = new Customer(null,name,18);
    entityManager.persist(customer);
}

在 spring-data-jpa 中,使用 persist 方法本身并不会自动启动或提交事务。persist 方法只是将实体标记为新建状态,准备持久化到数据库。为了让这些更改生效并实际写入数据库,你需要在一个事务的上下文中调用 persist 方法。因此,通常建议在使用 persist 方法时结合 @Transactional 注解,以确保操作的原子性和一致性

拓展

使用 entityManager 查询自定义的结果集

  • 使用 createQuery 查询

    // 我定义了一个不是entity的类,仅查询customer表中的姓名和年纪字段,不查id
    String sql = "select new com.train.dto.CustomerDTO(c.customerName,c.customerAge) from Customer c where c.customerName = :key";
    entityManager.createQuery(sql, CustomerDTO.class);
    query.setParameter("key", "jack");//设置JPQL参数
    List resultList = query.getResultList();
    
  • 使用 createNativeQuery 查询

    String sql = "select c.* from Customer c where c.customer_name = :key";
    Query query = entityManager.createNativeQuery(sql);
    query.setParameter("key", "jack");//设置JPQL参数
    List<Object[]> resultList = query.getResultList();
    for (Object[] result : resultList) {
      CustomerDTO dto = new CustomerDTO();
      dto.setAge((Long) result[1]);
      dto.setName((String) result[2]);
    }
    

原文地址:https://blog.csdn.net/qq_35215728/article/details/143503882

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!