1. 数据库建表
create database idcard;
create table usertable
(
id int(11) primary key not null auto_increment,
uname varchar(50) not null,
upwd varchar(32) not null
);
2. 新建maven项目
New Project,只选择左边的Maven和上面的SDK,其他全部不选,next:
输入GroupId和ArtifactId:
完成Finish:
进入主界面如下图所示:
(可以选择右下角自动提示的 Enable Auto-Import,后期就能自动导入maven坐标了)
3. 配置pom.xml
打开pom.xml,填入如下dependencies,亲测这些坐标是相互兼容的,包括了spring、spring mvc、mybatis、mysql、servlet、junit、log4j等:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
最终External Libraries能看到导入的包即可:
如果不能自动导入,就点击右边的Maven、再点击左边这个像是刷新样式的reimport按钮:
4. 为项目增加web支持
右键ssm项目,选择Add Framework Support:
选择Web Application,然后OK:
这样就增加了web文件夹和web.xml,到此项目目录如下:
5. 创建实体类
右键java文件夹,在这个目录下写java代码。
新建MyUser类,前面的model.是为了建包,这样一步就能建包和建类:
填写如下代码:
package model;
public class MyUser {
private int id;
private String uname;
private String upwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
- 小技巧,填写完三个属性之后,右键空白区域,选择generate自动生成Getter和Setter:
6. 创建po
刚才建立的实体类是针对代码逻辑的,再新建po包下的MyUserTable,对应于数据库表单:
package po;
public class MyUserTable {
private int id;
private String uname;
private String upwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
7. 创建dao
新建dao包,新建接口UserMapper,用于MyBatis的代理开发:
package dao;
import model.MyUser;
public interface UserMapper {
void register(MyUser myUser);
}
在resource目录下新建mapper目录,mapper目录下新建UserMapper.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserMapper">
<select id="register" parameterType="myUser">
insert into usertable (id, uname, upwd) values (null, #{uname}, ${upwd})
</select>
</mapper>
namespace填写UserMapper的路径,id对应于UserMapper中的方法名。
此时UserMapper类与UseMapper.xml配置文件产生了关联。
注:这里的myUser是别名,后续将配置实体类的别名。
8. 新建jdbs.properties
在resources目录下新建jdbs.properties,填入如下内容:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/idcard?characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456
注:useSSL=false是为了解决“Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure”错误,如没遇到可忽略。
9. 配置sqlMapConfig.xml
在resources目录下新建sqlMapConfig.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>
<properties resource="jdbc.properties"></properties>
<typeAliases>
<package name="model"/>
<package name="po"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
typeAliases就是前文提到的别名,package属性将包下的所有类都创建别名,无需包路径即可访问。
这个文件主要是配置mapper映射文件,让前面配置的mapper映射与数据库产生关联。
10. 创建service
新建service包,新建接口UserService:
package service;
import model.MyUser;
public interface UserService {
void register(MyUser myUser);
}
新建接口UserService的实现:
package service;
import dao.UserMapper;
import model.MyUser;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
@Service
public class UserServiceImpl implements UserService {
@Override
public void register(MyUser myUser) {
try {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.register(myUser);
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里引入了sqlMapConfig.xml实现了数据库和UserMapper.xml的关联,还引入了UserMapper.class实现了dao和数据库的关联。
因此,service已能够操作数据库。
小技巧:implements之后爆红,按住alt+enter可以选择implement methods自动生成@Override:
11. 配置applicationContext.xml
在resources目录下新建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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/>
</beans>
ssm中的spring只负责service和dao,controller交由spring mvc控制。
12. 创建controller
新建controller包,创建UserController类:
package controller;
import model.MyUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import service.UserService;
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/register")
@ResponseBody
public String test() {
System.out.println("get a request: register");
MyUser myUser = new MyUser();
myUser.setId(1);
myUser.setUname("tom");
myUser.setUpwd("123");
userService.register(myUser);
return "register success";
}
}
模拟接受到register空请求之后,让service控制dao。
13. 配置springmvc.xml
在resources目录下新建springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="controller"/>
<mvc:annotation-driven></mvc:annotation-driven>
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
14. 配置web.xml
配置web/WEB-INF目录下的web.xml,填入如下内容:
<?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>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
web.xml集成了applicationContext.xml和springmvc.xml,统一了全部的配置内容。
当前,项目目录结构如下:
15. 配置tomcat
点击右上角的Add Configuration:
点击左上角的加号+,选择Tomcat Server、Local:
先配置Server下的Application server:
选择本地下载好的tomcat根目录:
进入Deployment,如下操作所示:
点击加号按钮、选择Artifact,点击修改按钮、全选Available Elements并右键Put into Default Locations:
这样在WEB-INF/lib中能看到一开始导入的maven坐标:
16. 启动项目
点击绿色三角形的启动按钮:
浏览器默认跳转到 localhost:8080/ssm_war_exploded,显示的是web/index.jsp。
只需在链接后面新增/register即可访问controller中的RequestMapping:
查看数据库内容,已新增了一条,是controller模拟的myUser类的属性:
17. 小结
tomcat去启动web.xml的配置,再通过web.xml去启动applicationContext.xml和springmvc.xml的配置。
其中,applicationContext.xml控制了service和dao,而service又能使用dao和mybatis映射去操作数据库;springmvc.xml控制了controller,实现用户外部访问。
因此,ssm打通了用户到service、再到数据库的全过程。