Spring DA有助于编写DAO.当使用iBATIS作为持久性框架并扩展SqlMapClientDaoSupport时,应该为DAO设置SqlMapClient模拟,但我不能这样做.SqlMapClientTemplate不是一个接口,EasyMock不能为它创建一个模拟.
解决方案:不,我不再扩展原始父级.
原文:
有没有办法注释继承的finalsetter方法?我正在扩展一个类,它有一个final我想@Autowire用Spring 的setter .父类来自库,无法修改.
我发现的一种解决方法是编写一个代理方法,但这似乎比必要的工作更多.
public abstract class SqlMapClientDaoSupport ... {
public final void setSqlMapClient(SqlMapClient smc) {
...
}
}
@Component
public class AccountDao extends SqlMapClientDaoSupport {
// all this just to annotate an existing method?
@Autowire
public final void setSqlMapClientWorkaround(SqlMapClient smc) {
super.setSqlMapClient(smc);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑1:以上示例已修改以反映用例:
用例是为Ibatis/Spring实现扩展公共基类的 DAO对象.每个DAO都需要相同的属性集,每个都需要配置为bean.我目前通过单独配置每个来完成此操作applicationContext.xml.
<bean id="accountDAO"
class="com.example.proj.dao.h2.AccountDAOImpl"
p:sqlMapClient-ref="sqlMapClient" />
<bean id="companyDAO"
class="com.example.proj.dao.h2.CompanyDAOImpl"
p:sqlMapClient-ref="sqlMapClient" />
<!-- etc... -->
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用组件扫描来自动发现和自动装配DAO对象,我无法复制/粘贴botch.
<context:component-scan base-package="com.example.proj.dao.h2" />
Run Code Online (Sandbox Code Playgroud)
我没有在注释指南中看到如何注释除声明的属性/成员之外的属性/成员.我希望这是我想念的东西. …
我们在一个项目中使用Oracle,并且也想支持MySQL.他们的SQL方言有多接近?
在没有太多体操的情况下,是否有可能为两者使用相同的SQL源?
细节:
所以你的想法是什么?我们是否需要维护两组不同的iBatis SQL资源文件,每个方言一个,或者是否可以使用一组SQL支持MySQL和Oracle?
最后更新:感谢所有答案,特别是关于Troels Arvin关于差异的页面的指示.令人遗憾的是,标准并不是更好,标准.对我们来说,问题结果是MySQL自动增量与Oracle序列,MySQL LIMIT与Oracle Rowumber(),以及奇数函数或两个.大多数其他一切都应该很容易转移,模拟一些编辑,以确保我们使用SQL-92作为@mjv指出.更大的问题是某些查询可能需要在每个DBMS中进行不同的手动优化.
IBatis.Net DataMapper上是否有积极的开发?他们有.Net 3.5版本吗?我在iBatis Java DataMapper上看到了很多活动,因为他们计划发布带有注释支持的iBatis3.它的.Net对应物的状态是什么?
我正在移植一些旧的iBatis版本2.?代码,我想知道如何更换<isParameterPresent>标签?我已经阅读了MyBatis用户指南,知道你可以做一个<if test="">但我不知道如何引用参数对象?它有一个特殊的名字吗?是否有不同的标签可供使用?
我想知道以下哪个在使用100k +记录执行查询的时间方面表现更好
1)Oracle的分页
SELECT *
FROM (
SELECT id, col1, col2, rownum rn
FROM (
SELECT /*+ first_rows(50) */ id, col1, col2
FROM table1
ORDER BY id DESC
)
WHERE rownum <= 50
)
WHERE rn >= 20;
Run Code Online (Sandbox Code Playgroud)
2)使用MyBatis RowBounds进行分页.
MyBatis RowBounds使用普通的JDBC,在触发select之后,它会跳过前20个记录,然后获取接下来的30个(pagesize).
此外,随着页面数量的增加,MyBatis方法会变慢,因为需要跳过更多行吗?
在中JPA/Hibernate,我们可以编写类型安全的查询并一次累积一个查询谓词。我相信在中没有与之等效的东西MyBatis,但是有没有任何抽象框架(如QueryDSL)在上面提供了一层MyBatis,可以使我们编写类似条件的查询。我想要标准API的基本原因是,我需要构造一个查询,每个查询的谓词都来自单独的逻辑。
问题是标题之一.下面简要说明一下.
我有一个使用iBatis 2的应用程序,我想迁移到最新版本的myBatis(写作的时刻是3.2.0).由于我没有足够的时间来开始和完成工作而不必在该应用程序上执行其他任务,并且考虑到创建分支将需要在最后进行痛苦的合并,我想知道我是否可以介绍myBatis然后见面我的目标逐渐.最终iBatis将完全删除.
我可以在途中遇到一些冲突吗?换句话说,iBatis 2.3和MyBatis 3.2能够共存吗?也许你们中的一些人面临同样的问题.
我正在从SQL Server 2008将数据库移动到Oracle,但无法使MyBatis工作.
给出以下示例:
UserMapper.xml(示例)
<resultMap type="User" id="UserResult">
<id property="userId" column="userId"/>
<result property="firstName" column="firstName"/>
<result property="lastName" column="lastName"/>
</resultMap>
<select id="getUsers" statementType="CALLABLE" resultMap="UserResult">
{CALL GetUsers()}
</select>
Run Code Online (Sandbox Code Playgroud)
UserDAO.java
public interface UserDAO {
public List<User> getUsers();
}
Run Code Online (Sandbox Code Playgroud)
SQL Server过程
CREATE PROCEDURE [dbo].[GetUsers]
AS
BEGIN
SET NOCOUNT ON;
SELECT userId, firstName, lastName
FROM Users
END
Run Code Online (Sandbox Code Playgroud)
...适用于SQL Server 2008.有人可以向我解释如何从UserMapper.xml调用Oracle过程(与上面的SQL Server过程具有相同的名称和列)并使用Oracle游标填充我的User类?
这是我试过的:
<resultMap type="User" id="UserResult">
<id property="userId" column="userId"/>
<result property="firstName" column="firstName"/>
<result property="lastName" column="lastName"/>
</resultMap>
<select id="getUsers" statementType="CALLABLE" resultMap="UserResult">
{CALL GetUsers(#{resultSet,mode=OUT,jdbcType=CURSOR,resultMap=UserResult})}
</select>
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Caused by: …Run Code Online (Sandbox Code Playgroud) MyBatis 在基于XML的定义中具有可重用SQL片段的这一强大功能,例如:
<mapper namespace="com.company.project.dao.someDao">
<sql id="whereDate">
WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
</sql>
<sql id="someOtherSqlFragment">
...
</sql>
<select id="getSomeData"
resultType="SomeClass"
parameterType="DateParam" >
SELECT some_column, another_column
</select>
FROM some_table
<include refid="whereDate"/>
<include refid="otherSqlFragment"/>
</select>
</mapper>
Run Code Online (Sandbox Code Playgroud)
有没有办法在基于注释的查询定义中定义和使用这些片段,还是没有办法解决这个问题?
ibatis ×10
java ×7
mybatis ×6
oracle ×3
annotations ×2
spring ×2
sql ×2
conflict ×1
criteria-api ×1
cursor ×1
datamapper ×1
easymock ×1
ibatis.net ×1
jdbc ×1
mysql ×1
nhibernate ×1
orm ×1
querydsl ×1
xml ×1