一、创建工程
我们采用的编辑器为idea,使用eclipse、myeclipse的小伙伴,虽然创建的方法不同,但是其中的配置文件是一样的。也可以参照进行配置。
选择框框里的属性,点击next,然后填写工程名,这里我们将其命名为ssm,那么我们的工程就创建好了。
二、导入jar包
我们需要导入的jar包有:
有很多同学不会导入jar包,总是用到那个包了就百度一下各种奇葩的下载,这里我推荐使用maven依赖包,在maven仓库中你可以找到所有你想要的jar包,如下:
选择第一个mybatis点进去,选择相应的版本,我们选择3.2.7
版本选择好了之后点进去,会看见下面的东西,我们复制如下的一段代码
然后在idea打开project中的 project struct,如图所示:
点进去,将我们复制的代码,粘贴即可导入
重复以上步骤将所需要的jar包完全导入。
三、搭建工程目录
我们首先创建如下的工程目录,我会逐一介绍这些目录以及文件的作用
Config:存放spring、springmvc、mybatis等的配置文件
applicationContext.xml:spring的配置文件,用于加载数据源,管理事物、SqlsessionFactory、mapper、service
<?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"
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/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!--加载配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源-->
<property name="dataSource" ref="dataSource"/>
<!--mybatis配置文件-->
<property name="configLocation" value="classpath:SqlmapConfig.xml"/>
</bean>
<!--mapper扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!--事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--通知-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="save" propagation="REQUIRED"/>
<tx:method name="insert" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="find" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* serviceimpl.*.*(..))"/>
</aop:config>
<!--配置service-->
<bean class="serviceimpl.UserServiceImpl" id="userService"/>
</beans>
db.properties:用于存放数据库信息的配置文件,这里要根据你自己的情况进行填写
jdbc.jdbcUrl = jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
jdbc.driverClass = com.mysql.jdbc.Driver
jdbc.user = root
jdbc.password = 168168
log4j.priperties:配置控制台打印日志的配置文件,公共的
# Root logger option
log4j.rootLogger=DEBUG, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
springmvc.xml:springmvc的配置文件,用于配置Handler即Controller以及处理器适配器、处理器映射器、视图解析器
<?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"
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/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!--配置Handler
由于使用了BeanNameUrlHandlerMapping,name配置为url-->
<bean id="itemController" class="controller.ItemController" name="item.action"/>
<!--spring的组件扫描 可以扫描@controller @service @component 很多的注解-->
<context:component-scan base-package="controller"/>
<!--简单的url映射-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/item.action">itemController</prop>
</props>
</property>
</bean>
<!--注解处理器 没有要实现的接口 解析handler方法中的参数 映射器@controller @requestMapping-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置视图解析器,能够解析jsp视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
SqlmapConfig.xml:mybatis的配置文件,用于加载mapper.xml以及一些别名的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!--单个别名的定义-->
<typeAlias type="pojo.user" alias="user"/>
<!--批量别名的定义-->
<package name="pojo" />
</typeAliases>
<!-- 注册xml文件 -->
<mappers>
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
四、从mapper 到 service 再到 controller开发目录
首先我们创建user.java这个属性类,当然这个文件可以使用mybatis逆向工程直接生成,我们这里因为只有一张表,所以不用此方法,如果有时间我会专门写一篇来讨论,逆向工程。user.java如下
package pojo;
import java.util.Date;
public class user {
int id;
String username;
Date birthday;
String address;
public int getId() {
return id;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public void setBirthday(String s) {
}
}
首先,我们创建usermapper.xml:此文件用于编写sql语句的statement
<?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="dao.userMapper">
<select id="findUserById" parameterType="int" resultType="pojo.user">
select * from ssm.user where id = #{id}
</select>
<select id="findUserByName" parameterType="String" resultType="pojo.user">
select * from ssm.user where username like '%${value}%'
</select>
</mapper>
然后我们开发mapper的接口,在dao文件目录下创建userMapper.java的接口,这其中有很多细枝末节的东西我们此次的目的时熟悉整个框架的运作体系,因此不做赘述,userMapper.java文件如下
<?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="dao.userMapper">
<select id="findUserById" parameterType="int" resultType="pojo.user">
select * from ssm.user where id = #{id}
</select>
<select id="findUserByName" parameterType="String" resultType="pojo.user">
select * from ssm.user where username like '%${value}%'
</select>
</mapper>
写到这里我们dao层就开发完毕了,我们可以见一个test文件测试一下,即TestUserMapperImpl.java
package test;
import dao.userMapper;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.user;
import java.util.List;
public class TestUserMapperImpl {
private ApplicationContext applicationContext;
@Before
public void setup() throws Exception{
// 创建spring容器
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void TestfindUserById() throws Exception {
userMapper userMapper = (dao.userMapper) applicationContext.getBean("userMapper");
List<user> user = userMapper.findUserByName("周");
System.out.print(user);
}
}
如果控制台出现user的list,则说明dao层通了
接下来,我们开发service层和controller层,这里面会用到注解开发,这都是在springmvc里配置过的,如果有时间我会专门写的,创建UserService.java接口,其实这文件和usermapper接口时一样的,不过多了一个实现类,和原始的dao开发方式一样
package service;
import pojo.user;
import java.util.List;
public interface UserService {
public user findUserById(int id) throws Exception;
public List<user> findUserByName(String username) throws Exception;
}
紧接着我们编写他的实现类UserServiceImpl.java,为controller层提供数据库资料提供的方法
package serviceimpl;
import org.springframework.beans.factory.annotation.Autowired;
import pojo.user;
import service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
@Autowired
private dao.userMapper userMapper;
@Override
public user findUserById(int id) throws Exception {
return null;
}
@Override
public List<user> findUserByName(String username) throws Exception {
return userMapper.findUserByName(username);
}
}
最后我们开发controller层,用于对url进行解析,得到他的逻辑视图并将我们取得的数据填写进jsp,这里其实就是controller层和前端jsp页面的交互了。
package controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import pojo.user;
import service.UserService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Controller
public class UserController {
// 注入service
@Autowired
private UserService userService;
@RequestMapping("/queryUsers.action")
public ModelAndView queryUsers(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 调用service查询用户列表
List<user> list = userService.findUserByName("周");
// httpServletRequest.setAttribute("user",user);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("list",list);
modelAndView.setViewName("index.jsp");
return modelAndView;
}
}
五、配置web.xml
在web.xml中我们需要配置spring的配置文件的位置、servlet(springmvc)的配置文件的地址以及servletmapping
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--配置文件地址
如果不配置contextConfigLocation,默认查找的配置文件名称classpath下的:servlet名称+“-servlet” 即springmvc-servlet.xml
-->
<param-value>springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
可以配置 / ,此工程所有请求由springmvc处理,此种方式可以实现RESTful方式,需要特殊处理静态文件
还可以配置*.do
不可以配置/* jsp不能由springmvc解析
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
最后我们写一个jsp页面,看能否呈现结果
这里我们直接修改index,jsp为
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: mi
Date: 2018/8/6
Time: 18:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<table width="100%" border="1">
<tr>
<td>学号</td>
<td>姓名</td>
<td>出生日期</td>
</tr>
<c:forEach items="${list}" var="item">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.birthday}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
至此我们整个工程,ssm框架已经完成,我们启动tomcat服务器测试一下吧
ok,没问题,我们输入经过验证的url http://localhost:8081/queryUsers.action
ok,果然将我们查询的数据显示出来了,框架完成!有需要的可以私聊我源码
联系方式QQ:369212851 验证问题:csdn