对于我们的新产品重新设计,我们正在从Java中选择最佳框架.考虑到模型的数据库不可知方法,我们正在研究Struts + Spring与iBATIS或Hibernate之间的选择.请提供最好的建议,因为两者都提供持久性.
我们正在规划一个大型企业应用程序.在经历了J2EE的痛苦之后,我们将重点放在评估hibernate上.
看起来新的Java EE API更简单.我还读了一些关于Hibernate和iBatis的好东西.我们的团队对任何框架都缺乏经验.
我想确定5个主要的比较点
如果您要管理一个由具有J2EE经验的约6位开发人员组成的团队,您将使用哪种ORM工具?为什么?
iBatis和myBatis有什么区别?我在哪里可以找到一个完美的例子?请建议.我通过谷歌找不到这个问题的链接.
我们只想使用MyBatis的注释; 我们真的想避免使用xml.我们正在尝试使用"IN"子句:
@Select("SELECT * FROM blog WHERE id IN (#{ids})")
List<Blog> selectBlogs(int[] ids);
Run Code Online (Sandbox Code Playgroud)
MyBatis似乎无法选择整数数组并将其放入生成的查询中.它似乎"软弱地失败",我们没有得到任何结果.
看起来我们可以使用XML映射来实现这一点,但我们真的想避免这种情况.是否有正确的注释语法?
我想使用spring mvc @modelAttribute在我的Jsp页面中显示类别列表.
在我的mapper.xml文件中
<select id="selectAllCategories" resultMap="BaseResultMap">
select id, name from categories
</select>
Run Code Online (Sandbox Code Playgroud)
在我的Mapper.java类中,我有方法
List<Map<String, String>> selectAllCategories();
Run Code Online (Sandbox Code Playgroud)
我想要一个像这样的方法:
Map<Integer, String>`selectAllCategories();
Run Code Online (Sandbox Code Playgroud)
而不是List<Map<>>,这可能吗?
我正在使用iBATIS在MSSQL Server上调用存储过程,输入参数是放在地图上的POJO上的属性:
Map<String, Object> saveMap = new HashMap<String, Object>();
saveMap.put("obj", myArticle);
update("save", saveMap);
Run Code Online (Sandbox Code Playgroud)
所有参数都正确设置为过程的输入,因此没有任何错误.但其中一个参数是输出参数,我期望它被设置回POJO,而是"obj.new"=false由iBATIS将一个额外的映射放到地图上.这是映射的简化版本,显示了基本思想:
<procedure id="save">
{<include refid="Core.returned_value" />
CALL SPRC_ARTICLE_NAME_SAVE (
<include refid = "Core.common_fields" />
@pArticle_id = #obj.art_id#
, @pArtname = #obj.artname#
, @pNewArticleName_flg = #obj.new,mode=INOUT#
)}
</procedure>
Run Code Online (Sandbox Code Playgroud)
调用该过程后,我在Map中传递给iBATIS的两个映射:
"obj"=POJO"obj.new"=False现在我看到iBatis文档说"当执行存储过程时 - iBATIS将为OUTPUT参数创建对象",所以它是有道理的.但我的问题是,有没有办法指示iBATIS在调用过程后将布尔值放回到POJO?我宁愿不做额外的工作,从地图中获取价值并将其设置为我自己的POJO.
//Uhlén
我想将我的几个SQL Map XML文件使用的sql片段放在一个单独的文件中.目前,<sql>具有这些片段的元素与其他元素一起位于其中一个元素中<select>,这使得它们很难找到.
我是否可以使用仅定义几个<sql>元素的映射器,而不是用于生成接口的实现?这个映射器的正确名称空间是什么?
这是包含framents的SQL Map文件:
<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)
我想分开这样的元素:
第一个Sql Map文件:
<mapper namespace="com.company.project.dao.???">
<sql id="whereDate">
WHERE date(`time`) BETWEEN #{startDate} AND #{endDate}
</sql>
<sql id="someOtherSqlFragment">
...
</sql>
</mapper>
Run Code Online (Sandbox Code Playgroud)
第二个Sql Map文件:
<mapper namespace="com.company.project.dao.someDao">
<select id="getSomeData"
resultType="SomeClass"
parameterType="DateParam" >
SELECT some_column, another_column
</select>
FROM some_table
<include refid="whereDate"/> …Run Code Online (Sandbox Code Playgroud) 让我们说在我的sql语句中我想做:
WHERE numberOfCookies >= 10
Run Code Online (Sandbox Code Playgroud)
我如何在iBatis中执行此操作?
有什么方法可以获得iBatis的执行查询吗?我想重用UNION查询的查询.
例如:
<sqlMap namespace="userSQLMap">
<select id="getUser" resultClass="UserPackage.User">
SELECT username,
password
FROM table
WHERE id=#value#
</select>
</sqlMap>
Run Code Online (Sandbox Code Playgroud)
当我执行查询时
int id = 1
List<User> userList = queryDAO.executeForObjectList("userSQLMap.getUser",id)
Run Code Online (Sandbox Code Playgroud)
我想得到 SELECT username, password FROM table WHERE id=1
有什么方法可以得到查询吗?
谢谢.
我对使用感到困惑$ vs #.我没有找到任何指南.我把他们当作
name = #{name},name like '%${word}%',order by name ${orderAs},where name = #{word}
有时,这些都是做工精细,但在有些时候,参数不包括或给我的错误,如
org.apache.ibatis.reflection.ReflectionException:名为'name'的属性没有getter .......
那么,我想知道何时使用$或#?
ibatis ×10
java ×7
mybatis ×5
hibernate ×2
orm ×2
sql ×2
annotations ×1
frameworks ×1
java-ee ×1
persistence ×1
spring-mvc ×1