最近段时间正在学习Spring MVC和MyBatis的一些知识。自己也在网络上面找了一些例子来练习。但是都不是很完整。所以,今天,自己也抽空写了个完成的关于Spring MVC + Spring + MyBatis(简称 SSM)的一个CRUD的完整Web 演示例子。如果你也是刚好学习这几个框架的新手,或许我做的这个例子对你刚好有所帮助哦!

[caption id="" align="aligncenter" width="275"]演示工程的目录结构 演示工程的目录结构[/caption]

[caption id="" align="aligncenter" width="550"]添加数据页面 添加数据页面[/caption]

[caption id="" align="aligncenter" width="550"]修改数据的页面 修改数据的页面[/caption]

[caption id="" align="aligncenter" width="550"]查询出的数据列表 查询出的数据列表[/caption]

下面来说下这个演示的小例子。首先,我是使用MyEclipse工具做的这个例子,整合了Sping 3 、Spring MVC 3 、MyBatis框架,演示数据库采用MySQL数据库。例子中主要操作包括对数据的添加(C)、查找(R)、更新(U)、删除(D)。我在这里采用的数据库连接池是来自阿里巴巴的Druid,至于Druid的强大之处,我在这里就不做过多的解释了,有兴趣的朋友们可以去网上谷歌或者百度一下哦!好了下面我就贴上这次这个演示例子的关键代码:

BaseController

package com.bky.controller;

import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.bky.model.Add;
import com.bky.service.BaseService;

@Controller
public class BaseController {

	private BaseService baseService;

	public BaseService getBaseService() {
		return baseService;
	}
	@Autowired
	public void setBaseService(BaseService baseService) {
		this.baseService = baseService;
	}

	@SuppressWarnings("finally")
	@RequestMapping("addInfo")
	public String add(Add add,HttpServletRequest request){
		try {			
			add.setId(UUID.randomUUID().toString());
			System.out.println(add.getId() + ":::::" + add.getTname() + ":::::" + add.getTpwd());
			String str = baseService.addInfo(add);
			System.out.println(str);
			request.setAttribute("InfoMessage", str);
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("InfoMessage", "添加信息失败!具体异常信息:" + e.getMessage());
		} finally {			
			return "result";
		}
	}

	@RequestMapping("getAll")
	public String getAddInfoAll(HttpServletRequest request){
		try {			
			List<Add> list = baseService.getAll();
			System.out.println(list);
			request.setAttribute("addLists", list);
			return "listAll";
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("InfoMessage", "信息载入失败!具体异常信息:" + e.getMessage());
			return "result";
		}
	}

	@SuppressWarnings("finally")
	@RequestMapping("del")
	public String del(String tid,HttpServletRequest request){
		try {			
			String str = baseService.delete(tid);
			request.setAttribute("InfoMessage", str);
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("InfoMessage", "删除信息失败!具体异常信息:" + e.getMessage());
		} finally {			
			return "result";
		}
	}
	@RequestMapping("modify")
	public String modify(String tid,HttpServletRequest request){
		try {			
			Add add = baseService.findById(tid);
			request.setAttribute("add", add);
			return "modify";
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("InfoMessage", "信息载入失败!具体异常信息:" + e.getMessage());
			return "result";
		}
	}
	@SuppressWarnings("finally")
	@RequestMapping("update")
	public String update(Add add,HttpServletRequest request){
		try {			
			String str = baseService.update(add);
			request.setAttribute("InfoMessage", str);
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("InfoMessage", "更新信息失败!具体异常信息:" + e.getMessage());
		} finally {			
			return "result";
		}
	}

}

Service的实现

package com.bky.service.impl;

import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bky.dao.AddMapper;
import com.bky.model.Add;
import com.bky.service.BaseService;

@Service("baseService")
public class BaseServiceImpl implements BaseService {

	private AddMapper addMapper;

	public AddMapper getAddMapper() {
		return addMapper;
	}
	@Autowired
	public void setAddMapper(AddMapper addMapper) {
		this.addMapper = addMapper;
	}

	@Override
	public String addInfo(Add addInfo) {
		if (addMapper.insertSelective(addInfo) == 1) {
			return "添加成功";
		}
		return "添加失败";
	}
	@Override
	public List<Add> getAll() {
		return addMapper.getAll();
	}
	@Override
	public String delete(String id) {
		if (addMapper.deleteByPrimaryKey(id) == 1) {
			return "删除成功";
		}
		return "删除失败";
	}
	@Override
	public Add findById(String id) {
		return addMapper.selectByPrimaryKey(id);
	}
	@Override
	public String update(Add addInfo) {
		if (addMapper.updateByPrimaryKeySelective(addInfo) == 1) {
			return "更新成功";
		}
		return "更新失败";
	}

}

Mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.bky.dao.AddMapper" >
  <resultMap id="BaseResultMap" type="com.bky.model.Add" >
    <id column="id" property="id" jdbcType="VARCHAR" />
    <result column="tname" property="tname" jdbcType="VARCHAR" />
    <result column="tpwd" property="tpwd" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, tname, tpwd
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
    select 
    <include refid="Base_Column_List" />
    from tadd
    where id = #{id,jdbcType=VARCHAR}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
    delete from tadd
    where id = #{id,jdbcType=VARCHAR}
  </delete>
  <insert id="insert" parameterType="com.bky.model.Add" >
    insert into tadd (id, tname, tpwd
      )
    values (#{id,jdbcType=VARCHAR}, #{tname,jdbcType=VARCHAR}, #{tpwd,jdbcType=VARCHAR}
      )
  </insert>
  <insert id="insertSelective" parameterType="com.bky.model.Add" >
    insert into tadd
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="tname != null" >
        tname,
      </if>
      <if test="tpwd != null" >
        tpwd,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="tname != null" >
        #{tname,jdbcType=VARCHAR},
      </if>
      <if test="tpwd != null" >
        #{tpwd,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.bky.model.Add" >
    update tadd
    <set >
      <if test="tname != null" >
        tname = #{tname,jdbcType=VARCHAR},
      </if>
      <if test="tpwd != null" >
        tpwd = #{tpwd,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.bky.model.Add" >
    update tadd
    set tname = #{tname,jdbcType=VARCHAR},
      tpwd = #{tpwd,jdbcType=VARCHAR}
    where id = #{id,jdbcType=VARCHAR}
  </update>

  <select id="getAll" resultMap="BaseResultMap">
  	SELECT * FROM tadd
  </select>
</mapper>

以上就是几个关键位置的代码,我全部贴出来了。至于配置文件什么的,由于时间原因没有贴出。如果大家要是感兴趣的话,可以下载我的这个演示项目包,里面的东西都齐全着,导入到MyEclipse上面直接部署到服务器上面就可以运行。数据库就是里面的那个.sql文件。建个库然后将数据导入就是。哦,对了。导完数据后,记得别忘了到config.properties里面去把数据库的连接信息换成你自己哦!

本次演示例子源码完整下载:http://pan.baidu.com/s/1jDA2q(百度网盘)

假如百度云分享链接失效,请联系站长,我会补上的。

好了。到这里为止,关于 SSM框架整合的一个CRUD的完整Web例子到此就结束了。如果你在阅读代码的时候有什么疑惑或者不懂,欢迎和我探讨哦!

标签: SpringMVC+Spring+MyBatis整合, MyBatis框架整合演示, SpringMVC框架整合演示

已有 117 条评论

  1. 你好

    严重: create connection error
    java.sql.SQLException: Access denied for user ‘root’@’localhost’ (using password: YES)

    提交成功,刷新页面之前你可以

    是怎么回事呢,谢谢

    1. 你好。这个异常时用户名密码错误或者权限配置问题导致的,可以检查下你的数据库用户名和权限是不是正确。

  2. sdf

    严重: create connection error
    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    1. 你好。这个异常时用户名密码错误或者权限配置问题导致的,可以检查下你的数据库用户名和权限是不是正确。

  3. Jody

    Exception thrown from LifecycleProcessor on context close
    java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Mon Oct 22 19:26:28 CST 2018]; root of context hierarchy
    怎么报这个错误

    1. 你好,朋友,已邮件回复你了。

  4. qq:532055389

    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    报这个错,请问楼主如何处理?

    1. 可能是编译问题,不妨换个JDK版本试试看,比如1.6、1.7……

  5. helooworld

    java框架生成,www点javacoder点top,希望各位coder受益

  6. 可可

    百度网盘 下载不了啊!楼主能发到邮箱吗?945246317@qq.com

  7. 哈哈

    :razz: :razz: 不错,帮顶

  8. fish_up

    非常感谢楼主的分享,很有帮助

  9. gh

    求加个Q,有问题就请教你!!!我的Q:154322307

    1. 我的联系方式在 【有关与我】栏目中哟~~~~~

  10. syx

    下载不了

    1. 朋友,你可以多试几次。下载不了可能是因为网络不稳定导致的。试试用云盘客户端下载会好些(说明:不是在打广告)。下载前先将资源保存到你自己的网盘后再去点击下载,这样下载应该就没什么问题了。

  11. 纵然

    :razz: 可以留个联系方式吗。。

    1. 你好。可以的。我的联系方式就是右栏的那些信息哟~
      E-mail:baikeyang@vip.qq.com
      QQ:295273987

  12. 就是请问一下,有没有直接封装一套增删改查的方法,不同的controller都能调用,传参,可以吗,

    1. baikeyang

      朋友,你可以讲的具体点么?“不同的controller都能调用?”比如……
      controller都是可以在传递参数和接受参数的。

  13. 2077

    初学 ssm ,跪求楼组发下源码,谢谢

    1. baikeyang

      朋友,源码在百度网盘上面呢,你可以网盘下载(http://pan.baidu.com/s/1jDA2q)的哟~!如果不能下载的话,可以及时的告知我,以便于更换文件源哦!

  14. 运行不起来 加我扣扣 291571647 谢谢 大神

    1. baikeyang

      你好,你可以根据 菜单【与我有关】 中的联系方式联系我哟!里面有QQ 等 其他联系方式。或者直接给我发邮件,将错误信息 已附件的形式发送给我即可。我收到后会立即给你回复的哟。

  15. chen

    大神,我是新手求指导 QQ 2893087020

    1. baikeyang

      如果需要联系我,可以在【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

  16. 21312

    可以运行,很好 不错 ,只是有个问题要问一下 session拦截器 怎么配置呢

    1. baikeyang

      关于这个问题,你可以自己定义个拦截器用来拦截Session,这个的话,你可以在网上搜索,网上关于这个问题的解决方式 也是很多的。你可以试试哦。

  17. 许愿

    MD,我的评论怎么不回复啊??博主,不公平

    1. baikeyang

      额,这个我前阵子因为工作的事比较忙,所以没有即使回复你的留言。在此对朋友深深的致歉。真的很抱歉了。如果要联系我,可以在【与我有关】栏目中的联系方式 联系到我哦~

  18. 许愿

    数据库怎么连接起来,还是不太熟悉

    1. baikeyang

      连接数据库的 是一个config的配置文件。你可以修改里面的连接地址,把里面的地址改成你自己的地址即可连接数据库。

  19. Mason

    您好啊。。我运行报下面的错。。。如果不麻烦你的话可否加我的qq。.。605616041。。。先谢谢了。。。
    -------------------------------------------------------------
    type Status report

    message /ssm/add.jsp

    description The requested resource is not available.
    ------------------------------------------------------------

    1. baikeyang

      这个,你可以看下 项目中这个JSP是否存在,如果存在,在查看访问路径是否正确。如果还有什么不明白的地方,可以根据【与我有关】栏目中的联系方式 联系到我哦~

  20. wshenyang

    多谢分享!!!!

    1. baikeyang

      不客气。谢谢你的来访~

  21. 程序员

    为什么我参照你的做法做了一个小项目,就报org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myMessageService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void message.service.impl.MyMessageServiceImpl.setMyMessageMapper(message.dao.MyMessageMapper); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [message.dao.MyMessageMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

    1. baikeyang

      这个问题可能是由于你的 Service 的问题。在Service 中 注入 MyMessageMapper的时候报错了。你可以检查下你的注解是否正确。如果有什么不明白的地方,可以根据【与我有关】栏目中的联系方式 联系到我哦,一起学习进步哦~

  22. 好小子

    很好,太感谢了,

    1. baikeyang

      谢谢你的来访~

  23. 好人

    这个如果要增加几个模块需要怎么改配置文件,搞了很久一直报错

    1. baikeyang

      按照我的那个例子,加一个模块就需要响应加相应的Controller 、Service 和 Dao(Dao不是必加项),加完后,配置文件不需要做修改的。那个是只要是你放在指定的目录中 项目一旦启动就会自动去扫描的。

  24. NemoVisky

    老是爆这个错误啊
    java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.(Unknown Source)

    1. baikeyang

      遇到这个问题,你可以试着切换下你的JDK版本试试看。如果根据我说的办法没有解决此问题,可以根据【与我有关】栏目中的联系方式 联系到我哦~

    2. 新人

      我在idea里运行,也是报了一个跟你同样的错

      java.lang.IllegalArgumentException
      at org.springframework.asm.ClassReader.(Unknown Source)

      1. baikeyang

        遇到这个问题,你可以试着切换下你的JDK版本试试看。如果根据我说的办法没有解决此问题,可以根据【与我有关】栏目中的联系方式 联系到我哦~

  25. hh

    楼主威武

    1. baikeyang

      谢谢你的来访~

  26. 泡泡

    你的代码缺少dao的实现部分。

    1. baikeyang

      朋友,这个Dao 的是实现在Mybatis的**Mapper.xml中实现的,Dao接口中的方法必须和**Mapper.xml的方法一一对应才行,这里头的这些就是对接口的实现。具体的一些知识你可以查看Mybatis的一些文档。

  27. 等离子带花奶油蛋糕

    多谢博主,源码写的很清晰

    1. baikeyang

      谢谢你的来访~

  28. bluebang

    你好,刚接触这个,我想知道如果是sql里面的虚拟列该用怎样的方式查呢?很多时候我都是一个sql搞定,里面又是联合又是子查询的。没有通用的查询吗?比如entitiy en=new Entity(sql),en.getStringvlaue("par")这样直接从查询的结果集里面取,能实现吗?老是要映射实体太麻烦,不适合敏捷开发啊。难道是我还不了解,请教。 :shock:

    1. baikeyang

      这个只是一个基本实现增删改查的Demo。如果是需要通用的查询的方法,你可以自己提取一个通用的接口 或者 方法 即可。通常在生产环境中确实是需要很多通用的查询方式来解决此问题的。我在现实开发中就是这么做的。

  29. lcl

    用了代码就应该 说声谢谢 .......感谢 无私的奉献 有容乃大 楼主 加油 :razz: :razz: :razz: :razz:

    1. baikeyang

      不客气~ 谢谢你的来访~

  30. 新手

    大神,我下载了你的代码,原样不懂放大MyEclipse上运行,可是一直在报找不到Cannot find class: BaseResultMap,求指教

    1. baikeyang

      没有找到这个类。将项目Clean后在重新编辑几次就好了。

  31. 石头

    大神我的跑不起来,求指教,QQ:1051279449

    1. baikeyang

      如果需要联系我的话可以根据【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

  32. 小男孩

    609742011,QQ我的,LZ,新手跪求指教

    1. baikeyang

      如果需要联系我的话可以根据【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

  33. Archer

    对惹 我的扣扣是 963920633 。。 谢谢

    1. baikeyang

      如果需要联系我的话可以根据【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

  34. Archer

    :shock: 你好,我是是初学者,代码部署上去之后一直报上下文初始化异常。。 能解决么

    1. baikeyang

      你好,你可以将你的异常信息 已附件形式Email给我哟。

  35. 江南的雨

    楼主,下载下来后没看到那个.sql文件呀,请问放在哪儿呢?

    1. baikeyang

      你好,建个数据库,将sql导入到数据库即可。

  36. 沈宏亮

    我下载了你的例子,很想关闭了这个页面,可是我点了播放音乐,又不想重新找歌听...

    1. baikeyang

      谢谢你的来访~

  37. dsa

    我的一直是404

    1. baikeyang

      你好。可以把你的异常信息以附件的形式Email给我么?我帮你看看是什么问题。

  38. dsa

    :razz:

    1. baikeyang

      谢谢你的来访~

  39. 绝世狂爷

    哎呦,不错哦

    1. baikeyang

      谢谢你的来访~

  40. 绝世狂爷

    :razz:

    1. baikeyang

      谢谢你的来访~

  41. taylor

    272390515@qq.com 发一份吧谢谢

    1. baikeyang

      朋友,源码在百度网盘上面呢,你可以网盘下载(http://pan.baidu.com/s/1jDA2q)的哟~!如果不能下载的话,可以及时的告知我,以便于更换文件源哦!

  42. 天堂鸟

    亲 发我一份吧 QQ:44624860

    1. baikeyang

      朋友,源码在百度网盘上面呢,你可以网盘下载(http://pan.baidu.com/s/1jDA2q)的哟~!如果不能下载的话,可以及时的告知我,以便于更换文件源哦!

  43. tianchunyong

    准备换工作 ,学习一下

    1. baikeyang

      嗯,共同学习,共同进步。谢谢你的来访~

  44. long

    亲 发我一份吧

    1. baikeyang

      朋友,源码在百度网盘上面呢,你可以网盘下载(http://pan.baidu.com/s/1jDA2q)的哟~!如果不能下载的话,可以及时的告知我,以便于更换文件源哦!

  45. 潘潘

    我运行报异常,不知道怎么回事,我是刚接触的新手,求指教,QQ:747177410

    1. baikeyang

      朋友,你可以将你的异常信息以附件形式发送与我。我帮你看看是什么问题。

  46. 谢谢 楼主

    真心表示感谢。

    1. baikeyang

      不客气~谢谢你的来访~

    2. baikeyang

      不客气。谢谢你的来访~

  47. 东霞

    什么时候讲讲原理啥的呀?能运行,可是不明白怎么回事啊。。。。

    1. baikeyang

      朋友,我对这个也不是很深入。如果要想知道他的具体原理,我建议你空的时候可以去阅读下这些框架的源码,对你的理解有很好的帮助哟~

  48. 一朵奇葩

    大神请问代码里面AddMapper接口是如何通过AddMapper.xml实现的啊?这是基于什么原理

    1. baikeyang

      朋友,这个是Mybatis的机制,它的Dao实现就是靠AddMapper中我们写的sql和一些表达式来实现的。至于底层的实现和原理,建议你空的时候可以阅读下源码,主要会对你的理解能起到很好的帮助。

  49. 孙悟饭

    感谢楼主分享,现在正在学ssm ,一般管理系统代码看不懂,您发的代码正适合我 :razz:

    1. baikeyang

      不客气,希望对你能有帮助。谢谢你的来访~

  50. 求源码

    求源码哦

    1. baikeyang

      朋友,源码在百度网盘上面呢,你可以网盘下载(http://pan.baidu.com/s/1jDA2q)的哟~!如果不能下载的话,可以及时的告知我,以便于更换文件源哦!

  51. 冰尘

    大神求救,帮我也发邮箱一份呗,万分感谢,842610411@qq.com,跪求能运行,带数据库的

    1. baikeyang

      朋友,源码在百度网盘上面是有的啊!地址我也写的有。你可以到百度网盘上面去下载的。如果文件不能下载的话,可以及时的告知我,以便于更换文件源哦!

  52. 叶枫

    我现在正要学习一下 springmvc spring mybatis三者的集成,系统楼主能把这个例子能发一份到邮箱 yly130727@163.com 谢谢 :razz:

    1. baikeyang

      朋友,源码在百度网盘上面是有的啊!地址我也写的有。你可以到百度网盘上面去下载的。如果文件不能下载的话,可以及时的告知我,以便于更换文件源哦!

      1. xzl1991

        楼主加我qq 1192373005

        1. baikeyang

          如果需要联系我,可以根据【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

  53. 风之羽翼

    亲 我照着弄,结果springmvc+mybatis框架还是没能起来 你能发一份源码demo给我么 我的是myeclipse8.5 QQ邮箱310983117

    1. baikeyang

      OK ,好的。源码在百度网盘上面是有的啊!地址我也写的有。你可以到百度网盘上面去下载的。如果不能下载的话,可以即使的告知我,以便于更换文件源哦!

  54. Rey

    博主,您好,我运行您的示例,出现了Context配置初始化运行失败,想请教一下。QQ:363610752,谢谢。

    1. baikeyang

      我已经加了你的QQ了。

  55. 阳光demo

    大神,你写的这个例子很好。我初学Spring+SpringMVC,有很多地方不懂,想请教下大神、能不能加qq聊啊?1129919550

    1. java_zhang

      你的QQ号是多少,请加我:290914896

      1. baikeyang

        如果需要联系我的话可以根据【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

    2. baikeyang

      大神?我也是一个刚刚入门SpringMvc的新手,只是分享了一些自己的经验罢了。欢迎共同探讨、分享哦。

      1. 石头

        我的老是跑不起来,不知道怎么了,能加下QQ吗?1051279449

        1. baikeyang

          如果需要联系我的话可以根据【与我有关】栏目中的联系方式 联系到我哦~ 同时,谢谢你的来访~

      2. 番茄

        大神,发一份给我吧,我下载不了

        1. baikeyang

          亲,你发送程序源码附件到你的QQ邮箱,请注意查收。有什么问题,可以直接邮件回复我哦!

添加新评论