精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-10
不管是Hibernate 还是ibatis, 整个项目都可以只需一个DAO,
就算是多数据源的情形,经过一定的封装,也是一样只需一个DAO |
|
返回顶楼 | |
发表时间:2011-06-10
没错,MYBATIS的一个好处就是省去了垃圾DAO的编写
|
|
返回顶楼 | |
发表时间:2011-06-10
Dao还是要写的,小项目无所谓,数据量大的项目,到后面分表分库的时候,就看出Dao层的好处了
|
|
返回顶楼 | |
发表时间:2011-06-10
如果考虑维护方便,用Mapper会比较方便一些。要自动生成DAO,LZ可试试这个在线生成器,可找到多个常见持久层技术+Spring+Struts的例子。
|
|
返回顶楼 | |
发表时间:2011-06-10
zhongxuchen 写道 非常荒谬的观念,没有理解分层的意义,其实很多项目中数据库的操作比mybatis还简单,但仍然使用dao,因为service层是业务逻辑,可能调用多个dao来组合业务,如果直接放在service层中,dao的复用就无从谈起
service层一样组装mapper,一样可以复用,没有说取消dao层,其实mapping层就是原来的dao层。 |
|
返回顶楼 | |
发表时间:2011-06-10
walnut.lei 写道 没错,MYBATIS的一个好处就是省去了垃圾DAO的编写
我觉得mybatis好像就是想引导大家这样做。 |
|
返回顶楼 | |
发表时间:2011-06-10
denger 写道 而且,你说的别人改写 mybatis 的源代码。 其实并不是改写,而是扩展,Mybatis提供了很好的 插件扩展机制,通过使用 拦截器方式对 select 进行拦截,然后在sql上连接 limit 或 rownum 之类的,从而实现物理分页。 另外,也不是别人把 hibernate的dialect包copy过来利用 ,而是参考 hibernate 中 dialect分页的思路,达到目的就是当我换不同数据库的时候(如mysql使用limit,oracle使用rownum)只需要修改修改配置中的 dialect ,也就是 mybatis 的拦截器。 而不是把limit 或 rownum之类的写在配置文件中.... public interface ProductMapper { List<Product> selectProducts(Boolean isIndexed, RowBounds pageBounds); } 对于下面的人,也无须考虑SQL分页的问题: productMapper.selectProducts(true, new RowBounds(1, 10)) <select id="selectProducts" resultMap="productMap"> <![CDATA[ select * from tab_product where is_index = #{isIndexed} ]]> </select> 配置全局的 plugin: <plugins> <plugin interceptor="com.xxxx.core.plugin.mybatis.SqlPageInterceptor"> <property name="dialectClass" value="com.xxx.core.plugin.mybatis.MySQLDialect" /> <!-- 如果换成oracle数据库 的,自己定义一个 OracleDialect 即可--> </plugin> </plugins> 拦截器代码就不贴了,in mybatis official.. 这个解决方案确实不错. |
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
发一下我之前的老帖:http://star022.iteye.com/blog/390549
|
|
返回顶楼 | |
发表时间:2011-06-10
star022 写道 发一下我之前的老帖:http://star022.iteye.com/blog/390549
mybatis 与 hibernate 还是有很大区别的,个人认为 mybatis 完全无须泛型dao。 需要数据库操作只需要写一个 mapper interface 定义一个接口方法+配置一段sql 就OK了,已经是很简单了。无须把问题给复杂化了... |
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
squll369 写道 denger 写道 而且,你说的别人改写 mybatis 的源代码。 其实并不是改写,而是扩展,Mybatis提供了很好的 插件扩展机制,通过使用 拦截器方式对 select 进行拦截,然后在sql上连接 limit 或 rownum 之类的,从而实现物理分页。 另外,也不是别人把 hibernate的dialect包copy过来利用 ,而是参考 hibernate 中 dialect分页的思路,达到目的就是当我换不同数据库的时候(如mysql使用limit,oracle使用rownum)只需要修改修改配置中的 dialect ,也就是 mybatis 的拦截器。 而不是把limit 或 rownum之类的写在配置文件中.... public interface ProductMapper { List<Product> selectProducts(Boolean isIndexed, RowBounds pageBounds); } 对于下面的人,也无须考虑SQL分页的问题: productMapper.selectProducts(true, new RowBounds(1, 10)) <select id="selectProducts" resultMap="productMap"> <![CDATA[ select * from tab_product where is_index = #{isIndexed} ]]> </select> 配置全局的 plugin: <plugins> <plugin interceptor="com.xxxx.core.plugin.mybatis.SqlPageInterceptor"> <property name="dialectClass" value="com.xxx.core.plugin.mybatis.MySQLDialect" /> <!-- 如果换成oracle数据库 的,自己定义一个 OracleDialect 即可--> </plugin> </plugins> 拦截器代码就不贴了,in mybatis official.. 这个解决方案确实不错. 看了这个,感觉繁琐了,来说下我去年对ibatis的一个分页改造思路吧,运行时无缝兼容多种数据库: 1.下面的sqlmap配置,其实就是一个分页,也许你会奇怪,没有写rownum 或 limit ,如何做分页呢?继续往下就知道了。 <select id="pageTest" resultMap="AccountResult" parameterClass="Account"> select * from ACCOUNT ac where 1= 1 <dynamic prepend=""> <isNotEmpty prepend="and" property="firstName"> ac.ACC_FIRST_NAME = #firstName# </isNotEmpty> <isNotEmpty prepend="and" property="emailAddress"> ac.ACC_EMAIL like #emailAddress# </isNotEmpty> </dynamic> </select> 2.分页的本质,其实与数据库没有太大的关系,本质是获取一个指定结果集中的“某一段”; 而因数据库的差异,获取该段结果集的方式不一样,oracle通过rownum来获取,而mysql通过limit, 因此在做具体的分页的时候,只要两个条件: 1)。需要那一段结果集,这个可以由运行时上下文获取; 2)。数据库的类型,这个可以由运行时数据库连接conn获取,方式如下: String dataBaseType = conn.getMetaData().getDatabaseProductName().toLowerCase(); 有了1),2)两个条件,后续该怎么做就怎么做吧,就不细说了。。。 |
|
返回顶楼 | |