论坛首页 Java企业应用论坛

用了mybatis,我认为不需要再要写DAO

浏览 66457 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-06-10  
不管是Hibernate 还是ibatis, 整个项目都可以只需一个DAO,
就算是多数据源的情形,经过一定的封装,也是一样只需一个DAO
0 请登录后投票
   发表时间:2011-06-10  
没错,MYBATIS的一个好处就是省去了垃圾DAO的编写
0 请登录后投票
   发表时间:2011-06-10  
Dao还是要写的,小项目无所谓,数据量大的项目,到后面分表分库的时候,就看出Dao层的好处了
0 请登录后投票
   发表时间:2011-06-10  

如果考虑维护方便,用Mapper会比较方便一些。要自动生成DAO,LZ可试试这个在线生成器,可找到多个常见持久层技术+Spring+Struts的例子。

 

0 请登录后投票
   发表时间:2011-06-10  
zhongxuchen 写道
非常荒谬的观念,没有理解分层的意义,其实很多项目中数据库的操作比mybatis还简单,但仍然使用dao,因为service层是业务逻辑,可能调用多个dao来组合业务,如果直接放在service层中,dao的复用就无从谈起


service层一样组装mapper,一样可以复用,没有说取消dao层,其实mapping层就是原来的dao层。
0 请登录后投票
   发表时间:2011-06-10  
walnut.lei 写道
没错,MYBATIS的一个好处就是省去了垃圾DAO的编写

我觉得mybatis好像就是想引导大家这样做。
0 请登录后投票
   发表时间: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..



这个解决方案确实不错.
0 请登录后投票
   发表时间:2011-06-10   最后修改:2011-06-10
发一下我之前的老帖:http://star022.iteye.com/blog/390549
0 请登录后投票
   发表时间:2011-06-10  
star022 写道
发一下我之前的老帖:http://star022.iteye.com/blog/390549

mybatis 与 hibernate 还是有很大区别的,个人认为 mybatis 完全无须泛型dao。
需要数据库操作只需要写一个 mapper interface 定义一个接口方法+配置一段sql 就OK了,已经是很简单了。无须把问题给复杂化了...
0 请登录后投票
   发表时间: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)两个条件,后续该怎么做就怎么做吧,就不细说了。。。




0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics