标签: ibatis

如何对扩展SqlMapClientDaoSupport的DAO进行单元测试

Spring DA有助于编写DAO.当使用iBATIS作为持久性框架并扩展SqlMapClientDaoSupport时,应该为DAO设置SqlMapClient模拟,但我不能这样做.SqlMapClientTemplate不是一个接口,EasyMock不能为它创建一个模拟.

java spring ibatis easymock

5
推荐指数
1
解决办法
4426
查看次数

我可以用@Autowire注释一个继承的最终属性吗?

解决方案:不,我不再扩展原始父级.

原文:
有没有办法注释继承的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)

我没有在注释指南中看到如何注释除声明的属性/成员之外的属性/成员.我希望这是我想念的东西. …

java spring annotations ibatis

5
推荐指数
1
解决办法
4024
查看次数

支持Oracle和MySQL:它们的SQL语法有多相似?

我们在一个项目中使用Oracle,并且也想支持MySQL.他们的SQL方言有多接近?

在没有太多体操的情况下,是否有可能为两者使用相同的SQL源?

细节:

  • 我们正在使用iBatis,一个将SQL语句干净地隔离到资源文件中的持久性管理器.但我们在SQL级别工作,这有其优点(和缺点).
  • 我们宁愿不转向像Hibernate这样的对象关系映射器,它可以完全保护我们免受方言差异的影响.
  • 我们已经努力保持Oracle SQL的通用子集.
  • 没有PL/SQL.
  • 我们不使用存储过程或触发器(但无论如何).
  • 我们使用检查约束,唯一约束和外键约束.
  • 我们使用ON DELETE CASCADE.
  • 我们使用交易(在iBatis API级别完成).
  • 我们在查询中调用了几个Oracle时间戳函数.
  • 我们将使用带有MySQL的InnoDB存储引擎(它支持事务和约束).

所以你的想法是什么?我们是否需要维护两组不同的iBatis SQL资源文件,每个方言一个,或者是否可以使用一组SQL支持MySQL和Oracle?

最后更新:感谢所有答案,特别是关于Troels Arvin关于差异的页面的指示.令人遗憾的是,标准并不是更好,标准.对我们来说,问题结果是MySQL自动增量与Oracle序列,MySQL LIMIT与Oracle Rowumber(),以及奇数函数或两个.大多数其他一切都应该很容易转移,模拟一些编辑,以确保我们使用SQL-92作为@mjv指出.更大的问题是某些查询可能需要在每个DBMS中进行不同的手动优化.

java mysql sql oracle ibatis

5
推荐指数
2
解决办法
9953
查看次数

IBatis.Net DataMapper上是否有积极的开发?

IBatis.Net DataMapper上是否有积极的开发?他们有.Net 3.5版本吗?我在iBatis Java DataMapper上看到了很多活动,因为他们计划发布带有注释支持的iBatis3.它的.Net对应物的状态是什么?

nhibernate orm ibatis datamapper ibatis.net

5
推荐指数
1
解决办法
459
查看次数

什么是MyBatis等同于iBatis <isParameterPresent>标签?

我正在移植一些旧的iBatis版本2.?代码,我想知道如何更换<isParameterPresent>标签?我已经阅读了MyBatis用户指南,知道你可以做一个<if test="">但我不知道如何引用参数对象?它有一个特殊的名字吗?是否有不同的标签可供使用?

java xml ibatis mybatis

5
推荐指数
1
解决办法
1324
查看次数

使用rownum和嵌套子查询的MyBatis RowBounds与Oracle分页查询

我想知道以下哪个在使用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方法会变慢,因为需要跳过更多行吗?

sql oracle ibatis jdbc mybatis

5
推荐指数
1
解决办法
5459
查看次数

是否有与MyBatis中的Criteria API相似的功能,或诸如QueryDSL之类的包装程序通过它提供该功能?

在中JPA/Hibernate,我们可以编写类型安全的查询并一次累积一个查询谓词。我相信在中没有与之等效的东西MyBatis,但是有没有任何抽象框架(如QueryDSL)在上面提供了一层MyBatis,可以使我们编写类似条件的查询。我想要标准API的基本原因是,我需要构造一个查询,每个查询的谓词都来自单独的逻辑。

ibatis criteria-api querydsl mybatis

5
推荐指数
1
解决办法
1812
查看次数

切换到myBatis时,我可以将iBatis和Mybatis保留在同一个应用程序中吗?

问题是标题之一.下面简要说明一下.

我有一个使用iBatis 2的应用程序,我想迁移到最新版本的myBatis(写作的时刻是3.2.0).由于我没有足够的时间来开始和完成工作而不必在该应用程序上执行其他任务,并且考虑到创建分支将需要在最后进行痛苦的合并,我想知道我是否可以介绍myBatis然后见面我的目标逐渐.最终iBatis将完全删除.

我可以在途中遇到一些冲突吗?换句话说,iBatis 2.3和MyBatis 3.2能够共存吗?也许你们中的一些人面临同样的问题.

java conflict ibatis mybatis

5
推荐指数
1
解决办法
729
查看次数

使用MyBatis调用Oracle存储过程

我正在从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)

java oracle ibatis cursor mybatis

5
推荐指数
1
解决办法
4万
查看次数

有没有办法在基于注释的MyBatis/iBatis中重用SQL片段?

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)

有没有办法在基于注释的查询定义中定义和使用这些片段,还是没有办法解决这个问题?

java annotations ibatis mybatis

5
推荐指数
1
解决办法
614
查看次数