对于我开发的一些应用程序(然后继续忘记),我一直在编写纯SQL,主要用于MySQL.虽然我在SQLAlchemy中使用了python中的ORM ,但我并没有坚持使用它们.通常是文件或复杂性(从我的观点来看)阻碍了我.
我看是这样的:使用ORM来实现可移植性,如果它只是使用一种类型的数据库则使用普通SQL.在开发需要数据库支持的应用程序时,我真的在寻找何时使用ORM或SQL的建议.
考虑到这一点,使用轻量级包装来处理数据库不一致与使用ORM相比会好得多.
如果我使用像JPA2这样的ORM - 我的实体映射到我的数据库,我还应该使用DAO吗?这似乎是一个更多的开销.
例如,我需要维护三个额外的包:
一个指定我的域对象(几乎映射我的Entity对象):
public class Employee {
private String firstName;
private String lastName;
...
// Getters and setters
}
Run Code Online (Sandbox Code Playgroud)一个包含指定我的DAO方法的接口
public interface EmployeeDAO {
public void addEmployee(Employee employee);
public Employee getEmployeeById(long id);
...
}
Run Code Online (Sandbox Code Playgroud)一个包含实现我的DAO的会话bean
public EmployeeJpaDAO implements EmployeeDAO {
interface method implementations here
....
private method that transform my Employee entity into my Employee domain object
}
Run Code Online (Sandbox Code Playgroud)现在,每次我需要执行新的CRUD操作时,需要添加许多额外的行李.
但是,从DAO中看到的好处是:
您可以使用DAO的内存实现来对服务层进行单元测试.这意味着您不需要访问数据库来测试业务逻辑,并且可以确保您的对象始终包含属性的相同值
它将业务逻辑与数据库访问逻辑分开
不涉及实现DAO的选项是在服务层中使用实体对象和EntityManager:
@Stateless
public class EmployeeEjb {
@PersistenceContext(unitName = "employee")
private EntityManager manager;
public Employee getEmployeeById(long id) …Run Code Online (Sandbox Code Playgroud) 我在网站上使用JPA.在探索了保存数据的选项后,我找到了2种方法.第一种方法是使用javax.persistence.EntityManager的实现.我使用LocalContainerEntityManagerFactoryBean来实例化EntityManager的实例.一旦我获得了EntityManager的实例,我就可以用它来保存实体.例如,
entityManager.merge(someEntity);
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用org.springframework.data.repository.CrudRepository的实例.一,我获得了一个CrudRepository的实例,我可以用它来保存一个实体.例如,
aCrudRepository.save(someEntity);
Run Code Online (Sandbox Code Playgroud)
使用EntityManager和CrudRepository将实体持久化到数据库之间有什么区别?这两种方法(实体管理器与crud存储库)有什么好处或坏处?
我有点害怕问这个问题,因为它可能会开始一场宗教战争,所以我想要清楚地知道我在寻找什么.我正在寻找一个理由,为什么你会或者已经或者已经跳过了某种方式以及将项目添加到我的列表中.我正在寻找大票,大爆炸物品.此外,产品特定的项目,如果它们真的相关,也许.此时我正在尝试评估ORM与手动而不是产品A与产品B.
ORM优势
- Quick to code and low maintenance (in some/most scenarios) - Additional features for "free" (no developer effort)
手工编码优势
- More Efficient (at runtime, maybe not at dev time?) - Less layers of complexity - Most ORMS seem to struggle with being retricted to sprocs only
为了充分披露,我真的不喜欢"某事"对我的数据库执行代码的想法,我无法直接修改,如果我认为合适,但我可以看到ORM的潜在大量开发时间优势.
它也许值得注意我在.Net世界
[编辑](使用ORM或普通SQL的问题?似乎回答了许多问题并强调了关于性能的观点)
所以,稍微改变我的问题
有没有在早期阶段使用ORM构建应用程序,然后逐渐用手动编码的DAL替换?这种方法的缺陷是什么?
[进一步编辑 - 现在解决问题的核心]让一个网站能够对我的数据库执行任何SQL是可怕的.如果通过sprocs进行所有访问,我的数据库将保持良好,安全,舒适的隔离.使用专门的sprocs删除了很多(如果不是全部)SQL注入攻击向量.对此有何评论?
我正在尝试将 Spring Data JPA 与 MyBatis 一起使用。由于 MyBatis 没有 Vendor Adapter,这里有什么替代方案?
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.abc.xyz.domain"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
当我尝试初始化我的应用程序时,出现以下异常。
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No PersistenceProvider specified in EntityManagerFactory configuration, and chosen PersistenceUnitInfo does not specify a provider class name either
Run Code Online (Sandbox Code Playgroud)
谢谢
java ×2
orm ×2
architecture ×1
dao ×1
data-access ×1
java-ee ×1
jpa ×1
jpa-2.0 ×1
mybatis ×1
spring ×1
spring-data ×1
sql ×1