通常情况下,我们之间调用mapper,spring会为我们注入其实现,很方便,mybatis也提供了一个generator供我们生成bean、dao接口等。但是总有一种感觉叫不爽,感觉除了bean和mapping.xml之外,dao接口有着共性,没有必要每一个都写一遍,共性的东东要提出来。下面就说一下怎么利用面向接口的思想进行提炼!

1、bean接口IModel

  1. package com.jdw.bean;
  2.  
  3. /**
  4. * 所有的bean都要implements该接口
  5. * 至于原因,且往后看!
  6. * @author Administrator
  7. *
  8. */
  9. public interface IModel {
  10.  
  11. }

2、实现IModel接口的Category

  1. package com.jdw.bean;
  2. /**
  3. * 实现了IModel接口的Category Bean
  4. * @author Administrator
  5. *
  6. */
  7. public class Category implements IModel {
  8.  
  9. private Integer cId;
  10.  
  11. private String cName;
  12.  
  13. private Boolean hot;
  14.  
  15. public Integer getCId() {
  16. return cId;
  17. }
  18.  
  19. public void setCId(Integer cId) {
  20. this.cId = cId;
  21. }
  22.  
  23. public String getCName() {
  24. return cName;
  25. }
  26.  
  27. public void setCName(String cName) {
  28. this.cName = cName == null ? null : cName.trim();
  29. }
  30.  
  31. public Boolean getHot() {
  32. return hot;
  33. }
  34.  
  35. public void setHot(Boolean hot) {
  36. this.hot = hot;
  37. }
  38.  
  39. @Override
  40. public String toString() {
  41. return "Category [cId=" + cId + ", cName=" + cName + ", hot=" + hot + "]";
  42. }
  43.  
  44. }

3、dao接口的接口IMapper

  1. package com.jdw.dao;
  2.  
  3. import com.jdw.bean.IModel;
  4.  
  5. /**
  6. * mybatis mapper都要extends该接口
  7. * @author Administrator
  8. *
  9. * @param <M>
  10. */
  11. public interface IMapper<M extends IModel>{
  12.  
  13. int deleteByPrimaryKey(Integer id);
  14.  
  15. int insert(M model);
  16.  
  17. int insertSelective(M model);
  18.  
  19. M selectByPrimaryKey(Integer id);
  20.  
  21. int updateByPrimaryKeySelective(M model);
  22.  
  23. int updateByPrimaryKey(M model);
  24. }

4、继承了IMapper接口的Category接口

  1. package com.jdw.dao;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. import org.apache.ibatis.annotations.Param;
  7.  
  8. import com.jdw.bean.Category;
  9.  
  10. /**
  11. * 继承了IMapper接口的CategoryMapper接口
  12. * 可以看出,现在只需要在这里面写特有的接口了,共性的接口放到IMapper里面了
  13. * @author Administrator
  14. *
  15. */
  16. public interface CategoryMapper extends IMapper<Category> {
  17. public List<Category> selectCategoryByType(@Param("type") String type);
  18.  
  19. public void deleteByIds(String ids);
  20.  
  21. public List<Category> selectCategoryByPage(Map<String, Object> map);
  22. }

5、CategoryMapping.xml不需要什么改动

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.jdw.dao.CategoryMapper">
  4. <resultMap id="BaseResultMap" type="com.jdw.bean.Category">
  5. <!-- WARNING - @mbggenerated This element is automatically generated by
  6. MyBatis Generator, do not modify. -->
  7. <id column="c_id" property="cId" jdbcType="INTEGER" />
  8. <result column="c_name" property="cName" jdbcType="VARCHAR" />
  9. <result column="hot" property="hot" jdbcType="BIT" />
  10. </resultMap>
  11. <sql id="Base_Column_List">
  12. <!-- WARNING - @mbggenerated This element is automatically generated by
  13. MyBatis Generator, do not modify. -->
  14. c_id, c_name, hot
  15. </sql>
  16. <select id="selectByPrimaryKey" resultMap="BaseResultMap"
  17. parameterType="java.lang.Integer">
  18. <!-- WARNING - @mbggenerated This element is automatically generated by
  19. MyBatis Generator, do not modify. -->
  20. select
  21. <include refid="Base_Column_List" />
  22. from category
  23. where c_id = #{cId,jdbcType=INTEGER}
  24. </select>
  25. <select id="selectCategoryByType" resultMap="BaseResultMap"
  26. parameterType="java.lang.String">
  27. <!-- WARNING - @mbggenerated This element is automatically generated by
  28. MyBatis Generator, do not modify. -->
  29. select
  30. <include refid="Base_Column_List" />
  31. from category
  32. where 1 = 1
  33. <if test="type != null and type !=''">
  34. AND c_name = #{type,jdbcType=VARCHAR}
  35. </if>
  36. ORDER BY c_id
  37. </select>
  38. <select id="selectCategoryByPage" resultMap="BaseResultMap"
  39. parameterType="java.util.Map">
  40.  
  41. select
  42. <include refid="Base_Column_List" />
  43. from category
  44. where 1 = 1
  45. <if test="type != null and type !=''">
  46. AND c_name = #{type,jdbcType=VARCHAR}
  47. </if>
  48. ORDER BY c_id
  49. limit #{pageIndex},#{pageSize}
  50. </select>
  51. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
  52. <!-- WARNING - @mbggenerated This element is automatically generated by
  53. MyBatis Generator, do not modify. -->
  54. delete from category
  55. where c_id = #{cId,jdbcType=INTEGER}
  56. </delete>
  57. <insert id="insert" parameterType="com.jdw.bean.Category">
  58. <!-- WARNING - @mbggenerated This element is automatically generated by
  59. MyBatis Generator, do not modify. -->
  60. insert into category (c_id, c_name, hot)
  61. values (#{cId,jdbcType=INTEGER}, #{cName,jdbcType=VARCHAR},
  62. #{hot,jdbcType=BIT})
  63. </insert>
  64. <insert id="insertSelective" parameterType="com.jdw.bean.Category">
  65. <!-- WARNING - @mbggenerated This element is automatically generated by
  66. MyBatis Generator, do not modify. -->
  67. insert into category
  68. <trim prefix="(" suffix=")" suffixOverrides=",">
  69. <if test="cId != null">
  70. c_id,
  71. </if>
  72. <if test="cName != null">
  73. c_name,
  74. </if>
  75. <if test="hot != null">
  76. hot,
  77. </if>
  78. </trim>
  79. <trim prefix="values (" suffix=")" suffixOverrides=",">
  80. <if test="cId != null">
  81. #{cId,jdbcType=INTEGER},
  82. </if>
  83. <if test="cName != null">
  84. #{cName,jdbcType=VARCHAR},
  85. </if>
  86. <if test="hot != null">
  87. #{hot,jdbcType=BIT},
  88. </if>
  89. </trim>
  90. </insert>
  91. <update id="updateByPrimaryKeySelective" parameterType="com.jdw.bean.Category">
  92. <!-- WARNING - @mbggenerated This element is automatically generated by
  93. MyBatis Generator, do not modify. -->
  94. update category
  95. <set>
  96. <if test="cName != null">
  97. c_name = #{cName,jdbcType=VARCHAR},
  98. </if>
  99. <if test="hot != null">
  100. hot = #{hot,jdbcType=BIT},
  101. </if>
  102. </set>
  103. where c_id = #{cId,jdbcType=INTEGER}
  104. </update>
  105. <update id="updateByPrimaryKey" parameterType="com.jdw.bean.Category">
  106. <!-- WARNING - @mbggenerated This element is automatically generated by
  107. MyBatis Generator, do not modify. -->
  108. update category
  109. set c_name = #{cName,jdbcType=VARCHAR},
  110. hot = #{hot,jdbcType=BIT}
  111. where c_id = #{cId,jdbcType=INTEGER}
  112. </update>
  113. </mapper>

6、来点猛料,实现IMapper接口的BaseDaoImpl,注意看其中的T,spring可以Autowired泛型T,这个很巧妙!

  1. package com.jdw.dao.impl;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4.  
  5. import com.jdw.bean.IModel;
  6. import com.jdw.dao.IMapper;
  7.  
  8. /**
  9. * 面向接口+泛型的威力初体验
  10. *
  11. * @author Administrator
  12. *
  13. * @param <T>
  14. * @param <M>
  15. */
  16. public class BaseDaoImpl<T extends IMapper<M>,M extends IModel> implements IMapper<M> {
  17.  
  18. @Autowired
  19. protected T t;
  20.  
  21. @Override
  22. public int deleteByPrimaryKey(Integer id) {
  23. int result = this.t.deleteByPrimaryKey(id);
  24. return result;
  25. }
  26.  
  27. @Override
  28. public int insert(M model) {
  29. int result = this.t.insert(model);
  30. return result;
  31. }
  32.  
  33. @Override
  34. public int insertSelective(M model) {
  35. int result = this.t.insertSelective(model);
  36. return result;
  37. }
  38.  
  39. @Override
  40. public M selectByPrimaryKey(Integer id) {
  41. M m=this.t.selectByPrimaryKey(id);
  42. return m;
  43. }
  44.  
  45. @Override
  46. public int updateByPrimaryKeySelective(M model) {
  47. int result=this.t.updateByPrimaryKeySelective(model);
  48. return result;
  49. }
  50.  
  51. @Override
  52. public int updateByPrimaryKey(M model) {
  53. int result=this.t.updateByPrimaryKey(model);
  54. return result;
  55. }
  56.  
  57. }

7、继承了BaseDaoImpl的CategoryDaoImpl,注意少了很多共性代码,只有特性接口的实现,连spring mapper注入都省了!

  1. package com.jdw.dao.impl;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. import org.springframework.stereotype.Repository;
  7.  
  8. import com.jdw.bean.Category;
  9. import com.jdw.dao.CategoryMapper;
  10. /**
  11. * 继承了BaseDaoImpl的CategoryImpl
  12. * 注意:
  13. * (1)这里只需要实现特有的接口方法
  14. * (2)注意这里的mybatis mapper是根据泛型从BaseDaoImpl继承而来的
  15. * @author Administrator
  16. *
  17. */
  18. @Repository(value = "categoryDao")
  19. public class CategoryDaoImpl extends BaseDaoImpl<CategoryMapper, Category> implements CategoryMapper {
  20.  
  21. @Override
  22. public List<Category> selectCategoryByType(String type) {
  23. List<Category> list = this.t.selectCategoryByType(type);
  24. return list;
  25. }
  26.  
  27. @Override
  28. public void deleteByIds(String ids) {
  29.  
  30. }
  31.  
  32. @Override
  33. public List<Category> selectCategoryByPage(Map<String, Object> map) {
  34. List<Category> list = this.t.selectCategoryByPage(map);
  35. return list;
  36. }
  37.  
  38. }

8、BaseService接口

  1. package com.jdw.service;
  2.  
  3. import com.jdw.bean.IModel;
  4. import com.jdw.dao.IMapper;
  5. import com.jdw.dao.impl.BaseDaoImpl;
  6.  
  7. /**
  8. * 共性的泛型化的Service接口
  9. * @author Administrator
  10. *
  11. * @param <M>
  12. * @param <T>
  13. * @param <D>
  14. */
  15. public interface BaseService<M extends IModel,T extends IMapper<M>, D extends BaseDaoImpl<T,M>> {
  16. int insert(M model);
  17.  
  18. int insertSelective(M model);
  19.  
  20. int updateByPrimaryKeySelective(M model);
  21.  
  22. int updateByPrimaryKey(M model);
  23.  
  24. int deleteByPrimaryKey(int id);
  25.  
  26. M selectByPrimaryKey(int id);
  27. }

9、继承了BaseService接口的CategoryService接口

  1. package com.jdw.service;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. import com.jdw.bean.Category;
  7. import com.jdw.dao.CategoryMapper;
  8. import com.jdw.dao.impl.CategoryDaoImpl;
  9.  
  10. /**
  11. * 继承了BaseService接口的CategoryService接口
  12. * @author Administrator
  13. *
  14. */
  15. public interface CategoryService extends BaseService<Category,CategoryMapper,CategoryDaoImpl> {
  16. public Map<String,Object> query(String type, Integer page, Integer size);
  17. public void deleteByIds(String ids);
  18. public List<Category> getAll(Map<String,Object> map);
  19. }

10、BaseServiceImpl

  1. package com.jdw.service.impl;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4.  
  5. import com.jdw.bean.IModel;
  6. import com.jdw.dao.IMapper;
  7. import com.jdw.dao.impl.BaseDaoImpl;
  8. import com.jdw.service.BaseService;
  9.  
  10. /**
  11. * 泛型化的共性service实现
  12. * @author Administrator
  13. *
  14. * @param <M>
  15. * @param <T>
  16. * @param <D>
  17. */
  18. public class BaseServiceImpl<M extends IModel,T extends IMapper<M>, D extends BaseDaoImpl<T,M>> implements BaseService<M, T, D> {
  19.  
  20. @Autowired
  21. protected D dao;
  22.  
  23. @Override
  24. public int insert(M model) {
  25. int result=dao.insert(model);
  26. return result;
  27. }
  28.  
  29. @Override
  30. public int insertSelective(M model) {
  31. int result=dao.insertSelective(model);
  32. return result;
  33. }
  34.  
  35. @Override
  36. public int updateByPrimaryKeySelective(M model) {
  37. int result=dao.updateByPrimaryKeySelective(model);
  38. return result;
  39. }
  40.  
  41. @Override
  42. public int updateByPrimaryKey(M model) {
  43. int result=dao.updateByPrimaryKey(model);
  44. return result;
  45. }
  46.  
  47. @Override
  48. public int deleteByPrimaryKey(int id) {
  49. int result=dao.deleteByPrimaryKey(id);
  50. return result;
  51. }
  52.  
  53. @Override
  54. public M selectByPrimaryKey(int id) {
  55. M model=dao.selectByPrimaryKey(id);
  56. return model;
  57. }
  58.  
  59. }

11、CategoryServiceImpl,原理同7,不再赘述

  1. package com.jdw.service.impl;
  2.  
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import org.springframework.stereotype.Service;
  8.  
  9. import com.github.pagehelper.PageHelper;
  10. import com.github.pagehelper.PageInfo;
  11. import com.jdw.bean.Category;
  12. import com.jdw.dao.CategoryMapper;
  13. import com.jdw.dao.impl.CategoryDaoImpl;
  14. import com.jdw.service.CategoryService;
  15.  
  16. @Service("categoryService")
  17. public class CategoryServicImpl extends BaseServiceImpl<Category, CategoryMapper, CategoryDaoImpl>
  18. implements CategoryService {
  19.  
  20. @Override
  21. public void deleteByIds(String ids) {
  22.  
  23. }
  24.  
  25. @Override
  26. public Map<String, Object> query(String type, Integer pageNo, Integer pageSize) {
  27. pageNo = pageNo == null ? 1 : pageNo;
  28. pageSize = pageSize == null ? 10 : pageSize;
  29. PageHelper.startPage(pageNo, pageSize);
  30. List<Category> list = this.dao.selectCategoryByType(type);
  31. for (Category c : list) {
  32. System.out.println(c);
  33. }
  34. // 用PageInfo对结果进行包装
  35. PageInfo<Category> page = new PageInfo<Category>(list);
  36.  
  37. // 测试PageInfo全部属性
  38. /*
  39. * System.out.println(page.getPageNum());
  40. * System.out.println(page.getPageSize());
  41. * System.out.println(page.getStartRow());
  42. * System.out.println(page.getEndRow());
  43. * System.out.println(page.getTotal());
  44. * System.out.println(page.getPages());
  45. * System.out.println(page.getFirstPage());
  46. * System.out.println(page.getLastPage());
  47. * System.out.println(page.isHasPreviousPage());
  48. * System.out.println(page.isHasNextPage());
  49. */
  50. Map<String, Object> map = new HashMap<String, Object>();
  51. map.put("total", page.getTotal());
  52. map.put("rows", page.getList());
  53. return map;
  54. }
  55.  
  56. @Override
  57. public List<Category> getAll(Map<String, Object> map) {
  58.  
  59. return this.dao.selectCategoryByPage(map);
  60. }
  61.  
  62. }

12、总结说明

  有的人觉的这么写好麻烦啊,又是接口,又是泛型,还是基类的。他们觉得直接Service里面用mapper就行了,又简单又方便,想用哪个mapper就注入哪个mapper。想法有多好,耦合就有多高!

  面向接口会让各模块之间的耦合程度很低,比如哪天你不想用mybatis了,只需要修改dao层的实现就可以了,service层不需要动!如果你service里有mybatis注入代码呢?如果service没有接口的话,controller估计也要改了,跟重做没有什么区别,也许更麻烦,面向接口让代码更规范,重用度更高。一句话,面向接口是各种设计模式的基础。

  泛型让代码更简练,让共性成为共性,让特性更加特性,一目了然!

  

springmvc+mybatis如何分层的更多相关文章

  1. 基于Extjs+SpringMVC+MyBatis+Oracle的B/S信息系统简化开发思路

    要在上层简化就得有下层强大的架构作为支撑,通过采用企业级的各种框架,虽然学习成本高一些,但用好了效率也自然高. 数据层简化: 首先所有表都有名称为ID的主键字段.有与表同名的序列作为自增key. 数据 ...

  2. 如何玩转最新的项目的搭配springmvc+mybatis+Redis+Nginx+tomcat+mysql

    上一次完成nginx+tomcat组合搭配,今天我们就说说,这几个软件在项目中充当的角色: 要想完成这几个软件的组合,我们必须知道和熟悉应用这个框架, 一: Nginx:在项目中大多数作为反向代理服务 ...

  3. Maven + SpringMVC + Mybatis

    使用IDEA配置Maven + SpringMVC + Mybatis [一步一步踩坑详细配置完成] PS:初学,想使用Maven配置一个SpringMVC的开发环境,照着网上的各种图文解说,配置了好 ...

  4. SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)【转】

    使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...

  5. 解决springmvc+mybatis+mysql中文乱码问题【转】

    这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...

  6. Maven创建web项目:SpringMVC+Mybatis 【转】

    IDEA14创建Maven管理的SpringMVC+Mybatis,web项目 项目构建步骤 1.File->New->Project 勾选Create from archetype 点击 ...

  7. 基于Spring+SpringMVC+Mybatis的Web系统搭建

    系统搭建的配置大同小异,本文在前人的基础上做了些许的改动,重写数据库,增加依据权限的动态菜单的实现,也增加了后台返回json格式数据的配置,详细参见完整源码. 主要的后端架构:Spring+Sprin ...

  8. IDEA中maven搭建Spring+SpringMVC+mybatis项目

    一.介绍 使用IDEA搭建maven web项目,整合框架Spring+SpringMVC+mybatis 项目结构图:

  9. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(三)

    Spring+SpringMVC MVC呢,现在似乎越来越流行使用SpringMVC框架,我自己用的感觉,是非常好,确实很舒服,配置一开始是麻烦了一点点,但是后续的开发真的是很清爽! SpringMV ...

随机推荐

  1. Android中对手机文件进行读写

    参考张泽华视频 (一)读写手机内存卡中的文件 对手机中的文件进行读写操作,或者新增一个文件时,可直接使用openFileOutput  /  openFileInput 得到文件的输出.输入流. Fi ...

  2. 10 个十分难得的 javascript 开发经验

    Javascript 的很多扩展的特性是的它变得更加的犀利, 同时也给予程序员机会创建更漂亮并且更让用户喜欢的网站. 尽管很多的开发人员都乐于颂扬 javascript,但是仍旧有人看到它的阴暗面. ...

  3. php 程序员的历程

    今天一朋友该找工作了. 问了我好多 我整理了下  希望有些帮助 以下内容纯属个人感觉如果有不恰当的地方请忽略.... 我做的是项目的包工 就是把销售拿下的项目整合后给我们实现功能. --------- ...

  4. 【转】生产环境MySQL Server核心参数的配置

         ⑴ lower_case_table_names              ● 推荐理由                    GNU/Linux 平台,对数据库.表.存储过程等对象名称大小 ...

  5. Equations(hdu 1496 二分查找+各种剪枝)

    Equations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. mysql--help不可用

    1.问题描述: 执行help语句时没有得到相应的返回只是提示检查相关表是不是已经加载: mysql> help contents; Nothing found Please check if ' ...

  7. centos6.4x64安装vncserver

    参考文章:http://blog.csdn.net/mchdba/article/details/43058849 主要是远程安装oracle11g需要用到这个东西: 进入系统依次执行下列命令: #查 ...

  8. 分布式文件系统 Mogilefs 安装步骤

    我这里的环境都是 RHEL 5 的环境. MySQL 数据库 和 tracker 都放到一台服务器上, 为 192.168.2.85 storage server两台, 分别为 192.168.2.9 ...

  9. C# Assembly类_反射

    System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到. 由于这个类实在有太多的字段.属性与方法.实在不想将一个个属性方法从MSDN复制出来然后逐个属性.方法敲 ...

  10. perl return和break

    zjzc01:/root/test# cat a3.pl sub mask { my $n=shift; my $j =100; for ($i = 1;$i <= 5;$i++){ print ...