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://www.cnblogs.com/JarryShu/articles/18527463

浙公网安备 33010602011771号