springmvc+mybatis整合SSM案例教程

最近一段时间在学习ssm框架,搭建成功的框架没几个,不是jar错误就是配置文件内容写错,总结了几点经验,在这里跟大家分享一下:

1、jar尽量要统一;(spring使用jar尽量都是同一版本的,其它的也是一样)

2、XML配置文件,要仔细编码,很多的错误都是xml引起的,它不像是代码片段可调试,一旦报错,需要我们仔细排查了


下面说下今天的主题:SSM框架。(在文章最后我会把源码放上去,需要的朋友可以做个参考)

先预览下项目


1、导入所需jar包

aopalliance-1.0.jar
aspectjweaver-1.7.1.jar
commons-logging-1.1.3.jar
commons-pool-1.6.jar
json-lib-2.4-jdk15.jar
junit-4.8.2.jar
mybatis-3.4.1.jar
mybatis-spring-1.3.0.jar
ojdbc14.jar
spring-aop-4.3.5.RELEASE.jar
spring-aspects-4.3.5.RELEASE.jar
spring-beans-4.3.5.RELEASE.jar
spring-context-4.3.5.RELEASE.jar
spring-context-support-4.3.5.RELEASE.jar
spring-core-4.3.5.RELEASE.jar
spring-expression-4.3.5.RELEASE.jar
spring-jdbc-4.3.5.RELEASE.jar
spring-tx-4.3.5.RELEASE.jar
spring-web-4.3.5.RELEASE.jar
spring-webmvc-4.3.5.RELEASE.jar


这里的jar可分为及部分:

1)、spring所需的jar(这里我使用的是4.3.5版本的)

2)、使用spring所需jar

3)、mybatis所需jar

4)、连接数据所需jar

5)、Junit所需jar

大致可分为这五部分


2编写web.xml文件

这里的web.xml所需配置并不多,包括两部分

1)、Springmvc的核心控制器:DispatcherServlet

2)、 防止post请求乱码:CharacterEncodingFilter

完整的配置如下:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- springmvc前端控制器 -->
  <servlet>
  	<servlet-name>SpringMVC</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:applicationContext.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>SpringMVC</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <!-- 解决中文乱码 -->
  <filter>
  	<filter-name>encodingFilter</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>encodingFilter</filter-name>
  	<url-pattern>*.do</url-pattern>
  </filter-mapping>
</web-app>


3、编写applicationContext.xml文件

具体说明都在注释里面applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
					http://www.springframework.org/schema/beans 
					http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
                	http://www.springframework.org/schema/context  
                	http://www.springframework.org/schema/context/spring-context-3.2.xsd  
                    http://www.springframework.org/schema/tx 
                    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
                    http://www.springframework.org/schema/mvc 
                    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                    http://www.springframework.org/schema/aop 
                    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"
	default-autowire="byName">
	
	
	<!-- 配置DataSource数据源 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@192.168.6.25:1521:orcl"/>
		<property name="username" value="scott"/>
		<property name="password" value="tiger"/>
	</bean>
	
	<!--配置工厂, 创建SqlSessionFactoryBean,同时指定数据源 
		ref="dataSource" :指定的是数据源中的id
	-->
	<bean id="sqlSessionFactory"  class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="mapperLocations" value="classpath:cn/ssm/entity/empMapper.xml"></property>
	</bean>
	
	<!-- 配置MapperScannerConfigurer 
		value="sqlSessionFactory"指定的是Session工厂的id
	-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
		<property name="basePackage" value="cn.ssm.dao"></property>
	</bean>
	
	
	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.ssm"/>
	
	<!-- 开启RequestMapping 注解 -->
	<mvc:annotation-driven />
	
	<!-- 处理请求转发 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/emp/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
</beans>


4、实体类

emp实体类:

package cn.ssm.entity;

import java.sql.Date;

public class Emp {
	private Integer empno;
	private String ename;
	private String job;
	private Integer mgr;
	private Date hiredate;
	private Double sal;
	private Double comm;
	private Integer deptno;

	public Integer getEmpno() {
		return empno;
	}

	public void setEmpno(Integer empno) {
		this.empno = empno;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public Integer getMgr() {
		return mgr;
	}

	public void setMgr(Integer mgr) {
		this.mgr = mgr;
	}

	public Date getHiredate() {
		return hiredate;
	}

	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}

	public Double getSal() {
		return sal;
	}

	public void setSal(Double sal) {
		this.sal = sal;
	}

	public Double getComm() {
		return comm;
	}

	public void setComm(Double comm) {
		this.comm = comm;
	}

	public Integer getDeptno() {
		return deptno;
	}

	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}

}

Condition实体类

package cn.ssm.entity;

import java.util.List;

public class Condition {
	private Integer deptno;
	private Double salary;
	private List<Integer> empnos;

	public Integer getDeptno() {
		return deptno;
	}

	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}

	public Double getSalary() {
		return salary;
	}

	public void setSalary(Double salary) {
		this.salary = salary;
	}

	public List<Integer> getEmpnos() {
		return empnos;
	}

	public void setEmpnos(List<Integer> empnos) {
		this.empnos = empnos;
	}

}


5、编写Dao接口

package cn.ssm.dao;

import java.util.List;
import cn.ssm.entity.Condition;
import cn.ssm.entity.Emp;

public interface EmpDao {
	public List<Emp> findAll(); // 查询全部

	public List<Emp> findByDept(Condition cond); // 根据部门查询

	public List<Emp> findBySalary(Condition cond); // 大于当前工资

	public List<Emp> findByDeptAndSalary(Condition cond); // 查询当前部门下,大于当前收入的员工

	public void update(Emp emp);// 更新员工信息

	public List<Emp> findByDeptAndSalary2(Condition cond); // 查询当前部门下,大于当前收入的员工

	public void update2(Emp emp);// 更新员工信息

	public List<Emp> findById(Condition cond); // 根据id查询
}


6、编写实体类映射mapper.xml文件  (与实体类在同一目录下,从applicationContext.xml文件中可看出)

empMapper.xml

<?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="cn.ssm.dao.EmpDao">

	<!-- 查询全部的员工 -->
  <select id="findAll" resultType="cn.ssm.entity.Emp">
  	select * from t_emp
  </select>
  
  <!-- if的用法 -->
  <select id="findByDept" resultType="cn.ssm.entity.Emp" parameterType="cn.ssm.entity.Condition">
  	select * from t_emp
  		<if test="deptno !=null">
  			where deptno = #{deptno}
  		</if>
  </select>
  
  <!-- chose的用法 -->
  <select id="findBySalary" resultType="cn.ssm.entity.Emp" parameterType="cn.ssm.entity.Condition">
  	select * from t_emp
  	<choose>
  		<when test="salary>3000">
  			where sal>#{salary}
  		</when>
  		<otherwise>
  			where sal>3000
  		</otherwise>
  	</choose>
  </select>
  
  <!-- where -->
  <!-- 查询当前部门下,大于当前收入的员工-->
  <select id="findByDeptAndSalary" resultType="cn.ssm.entity.Emp" parameterType="cn.ssm.entity.Condition">
  	select * from t_emp
  	<where>
  		<if test="deptno !=null">
  			and deptno=#{deptno}
  		</if>
  		<if test="salary!=null">
  			and sal>#{salary}
  		</if>
  	</where>
  </select>
  
  <!-- update -->
  <!-- 更新员工信息 -->
  <update id="update"  parameterType="cn.ssm.entity.Condition">
  		update t_emp
  		<set>
  			<if test="ename!=null">
  				ename=#{ename}
  			</if>
  			<if test="job!=null">
  				job=#{job}
  			</if>
  		</set>
  		where empno=#{empno}
  </update>
  
  <!-- 使用trim代替where -->
  <!-- 查询 -->
  <select id="findByDeptAndSalary2" resultType="cn.ssm.entity.Emp" parameterType="cn.ssm.entity.Condition">
  	select * from t_emp
  		<trim prefix="where" prefixOverrides="and" >
  			<if test="deptno!=null">
  				and deptno=#{deptno}
  			</if>
  			<if test="salary !=null">
  				and sal>#{salary}
  			</if>
  		</trim>
  </select>
  <!-- 使用trim代替set -->
  <!-- 更新 -->  
  <update id="update2">
  	update t_emp
  		<trim prefix="set" prefixOverrides="," > 
  			<if test="ename!=null">
  				ename=#{ename},
  			</if>
  			<if test="job!=null">
  				job=#{job},
  			</if>
  		</trim>
  		where empno=#{empno}
  </update>
  
  <!-- 根据id查询 -->
  <select id="findById" resultType="cn.ssm.entity.Emp" parameterType="cn.ssm.entity.Condition">
  	select * from t_emp where empno in
  		<foreach collection="empnos" open="(" close=")" separator="," item="id">
  			#{id}	
  		</foreach>
  </select>
</mapper>

7、编写Junti测试文件

package cn.ssm.test;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ssm.dao.EmpDao;
import cn.ssm.entity.Condition;
import cn.ssm.entity.Emp;



public class TestEmp {
	
	
	/**
	 *   查询全部
	 */
	 @Test
	public void test() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = ctx.getBean(EmpDao.class);
		List<Emp> list = dao.findAll();
		for (Emp e : list) {
			System.out.println(e.getEmpno() + " " + e.getEname() + " "
					+ e.getJob());
		}
	}
	
	/**
	 * 根据部门查询
	 */
	 @Test
	public void Testfind() {

		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = ctx.getBean(EmpDao.class);

		Condition condition = new Condition();
		condition.setDeptno(10);
		List<Emp> list = dao.findByDept(condition);
		for (Emp emp : list) {
			System.out.println(emp.getEname() + " " + emp.getJob());
		}
	}

	/**
	 * 查询大于当前收入的员工
	 */
	 @Test
	public void testfindbysalary() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = ctx.getBean(EmpDao.class);
		Condition condition = new Condition();
		condition.setSalary(4000.0);
		List<Emp> list = dao.findBySalary(condition);
		for (Emp emp : list) {
			System.out.println(emp.getDeptno() + " " + emp.getJob() + " "
					+ emp.getMgr());
		}

	}

	/**
	 * 查询当前部门下,大于当前收入的员工
	 */
	public void testfindByDeptAndSalary() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = context.getBean(EmpDao.class);
		Condition condition = new Condition();

		condition.setDeptno(20);
		condition.setSalary(2000.0);
		List<Emp> list = dao.findByDeptAndSalary(condition);
		for (Emp emp : list) {
			System.out.println(emp.getEname() + " " + emp.getEname());
		}
	}

	/**
	 * 查询当前部门下,大于当前收入的员工
	 */
	@Test
	public void testfindByDeptAndSalary2() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = context.getBean(EmpDao.class);
		Condition condition = new Condition();

		condition.setDeptno(20);
		condition.setSalary(2000.0);
		List<Emp> list = dao.findByDeptAndSalary(condition);
		for (Emp emp : list) {
			System.out.println(emp.getEname() + " " + emp.getEname());
		}
	}

	/**
	 * 更新员工信息
	 */
	public void testupdate() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = context.getBean(EmpDao.class);
		Emp emp = new Emp();
		emp.setEmpno(14);
		emp.setEname("Tom");
		dao.update(emp);

	}

	/**
	 * 更新员工信息
	 */
	public void testupdate2() {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = context.getBean(EmpDao.class);
		Emp emp = new Emp();
		emp.setEmpno(14);
		emp.setEname("Tom");
		dao.update(emp);
	}

	/**
	 * 根据id查询
	 */
	@Test
	public void testFindById() {
		ApplicationContext axt = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		EmpDao dao = axt.getBean(EmpDao.class);
		List<Integer> ids = new ArrayList<Integer>();
		ids.add(3);
		ids.add(10);
		Condition cond = new Condition();
		cond.setEmpnos(ids);
		List<Emp> list = dao.findById(cond);
		for (Emp emp : list) {
			System.out.println(emp.getEname() + " " + emp.getDeptno());
		}

	}
}


8、编写Controller进行测试

package cn.ssm.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.ssm.dao.EmpDao;
import cn.ssm.entity.Emp;


@Controller
public class EmpController {
	@Resource
	private EmpDao empDao;
	public void setEmpDao(EmpDao empDao) {
		this.empDao = empDao;
	}

	@RequestMapping("/findEmp.do")
	public String find(Model model) {
		List<Emp> list = empDao.findAll();
		model.addAttribute("emps", list);
		return "emp_list";
	}
}

9、编写jsp页面

根据applicationContext.xml中的配置,我们在WEB-INF中建立emp文件夹,然后建立emp_list.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'emp_list.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  <body style="text-align: center;">
  	<table width="80%" border="1" cellpadding="2" cellspacing="0">
  			<tr>
  				<th>EMPNO</th>
  				<th>ENAME</th>
				<th>JOB</th>
  				<th>MGR</th>
  				<th>HIREDATE</th>
  				<th>SAL</th>
  				<th>COMM</th>
  				<th>DEPTNO</th>
  			</tr>
  			<c:forEach items="${emps}" var="emp">
  				<tr>
  					<td>${emp.empno}</td>
  					<td>${emp.ename}</td>
  					<td>${emp.job}</td>
  					<td>${emp.mgr}</td>
  					<td>${emp.hiredate}</td>
  					<td>${emp.sal}</td>
  					<td>${emp.comm}</td>
  					<td>${emp.deptno}</td>
  				</tr>
  				
  			</c:forEach>
 </table>
  </body>
  
</html>

10、测试

在浏览器中输入:http://localhost:8080/SSMDemo/findEmp.do即可


11、源码下载:SSMDemo

(项目预览图中有个db.properties没有用到,

<!-- 读取属性文件 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:db.properties"></property>
	</bean>
	
	<!-- 配置DataSource数据源 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
		<property name="driverClassName" value="${driverClassName}"/>
		<property name="url" value="${url}"/>
		<property name="username" value="${username}"/>
		<property name="password" value="${password}"/>
	</bean>

把applicationContext.xml修改成这样就可以了。两种方式都可以,有问题可以在文章末尾处浏览,大家一起学习


  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值