博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
玩转 SSH(六):SpringMVC + MyBatis 架构搭建(注解版)
阅读量:6198 次
发布时间:2019-06-21

本文共 23351 字,大约阅读时间需要 77 分钟。

一、创建 SSMVCAnnoDemo 项目

点击菜单,选择“File -> New Project” 创建新项目。选择使用 archetype 中的 maven-webapp 模版创建。

输入对应的项目坐标GroupId 和 ArtifactId

之后在项目名称中填入项目名称,这里我填的 ProjectName 和上文的 ArtifactId 相同,都是 SSMVCAnnoDemo。

点击确定后,等待 Maven 帮我们构建好项目的目录结构。当控制台显示 BUILD SUCCESS 就表示初始化完成了。

初始化完成后的目录结构是这样的:

在 main 目录下创建 java 目录并将其设置为源码目录:

之后创建 com.chanshuyi.action 等包,创建完成后的目录结构如下:

二、导入依赖的包和插件

设置 POM.XML 配置文件中的全局属性:

UTF-8
2.3.24
4.1.6.RELEASE
3.8.1
1.2

依次引入 MyBatis、Spring、SpringMVC、MySQL、Druid、JUnit、Log4J 等的依赖 Jar 包:

org.mybatis
mybatis
3.1.1
org.mybatis
mybatis-spring
1.1.1
org.springframework
spring-webmvc
${springframework.version}
org.springframework
spring-core
${springframework.version}
org.springframework
spring-tx
${springframework.version}
org.springframework
spring-orm
${springframework.version}
org.springframework
spring-jdbc
${springframework.version}
org.springframework
spring-web
${springframework.version}
org.springframework
spring-context
${springframework.version}
org.springframework
spring-beans
${springframework.version}
commons-logging
commons-logging
${commonsLogging.version}
org.aspectj
aspectjweaver
1.8.5
javax.servlet
jstl
1.2
taglibs
standard
1.1.2
javax.servlet
javax.servlet-api
3.0.1
provided
mysql
mysql-connector-java
5.1.21
com.alibaba
druid
1.0.6
junit
junit
${junit.version}
test
org.slf4j
slf4j-api
1.7.6
org.slf4j
slf4j-log4j12
1.7.6

之后导入 Tomcat 启动插件,我们将通过 Maven 方式启动 Tomcat,这样就不必在本地配置一个 Tomcat 服务器。

org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
5050
/
UTF-8
mgr
tomcat7

配置完成后的 POM.XML 是这样的:

4.0.0
com.chanshuyi.SSMVCAnnoDemo
SSMVCAnnoDemo
war
1.0-SNAPSHOT
SSMVCAnnoDemo Maven Webapp
http://maven.apache.org
UTF-8
2.3.24
4.1.6.RELEASE
3.8.1
1.2
org.mybatis
mybatis
3.1.1
org.mybatis
mybatis-spring
1.1.1
org.springframework
spring-webmvc
${springframework.version}
org.springframework
spring-core
${springframework.version}
org.springframework
spring-tx
${springframework.version}
org.springframework
spring-orm
${springframework.version}
org.springframework
spring-jdbc
${springframework.version}
org.springframework
spring-web
${springframework.version}
org.springframework
spring-context
${springframework.version}
org.springframework
spring-beans
${springframework.version}
commons-logging
commons-logging
${commonsLogging.version}
org.aspectj
aspectjweaver
1.8.5
javax.servlet
jstl
1.2
taglibs
standard
1.1.2
javax.servlet
javax.servlet-api
3.0.1
provided
mysql
mysql-connector-java
5.1.21
com.alibaba
druid
1.0.6
junit
junit
${junit.version}
test
org.slf4j
slf4j-api
1.7.6
org.slf4j
slf4j-log4j12
1.7.6
SSMVCAnnoDemo
org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
5050
/
UTF-8
mgr
tomcat7
pom.xml

三、开发模型层(MyBatis)

创建 SpringMVC 配置文件 resources/spring-servlet.xml 

创建 spring-mybatis.xml 文件,配置一个只读的数据源以及一个只写的数据源

创建 jdbc.properties 配置文件

############################  MySQL/Oracle/SQLServer Database Configuratioin Info ################################ MySQL Master DB Infojdbc.master.dialet=org.hibernate.dialect.MySQLDialectjdbc.master.driverClassName=com.mysql.jdbc.Driverjdbc.master.url=jdbc:mysql://127.0.0.1:3306/SSMDemojdbc.master.username=rootjdbc.master.password=sa# MySQL Slave DB Infojdbc.slave.dialet=org.hibernate.dialect.MySQLDialectjdbc.slave.driverClassName=com.mysql.jdbc.Driverjdbc.slave.url=jdbc:mysql://localhost:3306/SSMDemojdbc.slave.username=rootjdbc.slave.password=sa############################## Connection Pool Configuration Info ############################################### MySQL Master DB Settingjdbc.master.initialSize = 10jdbc.master.minIdle = 0jdbc.master.maxActive = 30# MySQL Slave DB Settingjdbc.slave.initialSize = 10jdbc.slave.minIdle = 0jdbc.slave.maxActive = 30

在本地 MySQL 数据库创建一个 SSMDemo 数据库,执行下面的语句创建 user 表并插入一条测试数据。

CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `username` varchar(45) DEFAULT NULL,  `password` varchar(45) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES ('1', 'admin', 'password');

创建 mybatis-config.xml 文件,并配置需要扫描包路径

下载 (密码:c1dy),这是MyBatis 官方的 MyBatis Generator,我们使用它将数据库表转化成 model、mapper 以及 SqlProvider 文件。

下载文件解压放到 resources 目录下。进入 resources/mbg 目录,双击运行 generate.bat,程序自动将配置文件 resources/mbgconfig.xml 中配置的表格映射成相对应的文件。

四、开发视图层(Spring)

创建 resources/log4j.properties 文件,提供日志记录。

#Console Loglog4j.rootLogger=info, console, file# Write to Consolelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Threshold=INFOlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n# Write to Filelog4j.appender.file=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.file.File=${catalina.home}app/log/log.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n

在 com.chanshuyi.dao.mapper.UserMapper 类中增加 getUserListByMapSql 接口:

/** * 根据参数构造SQL进行查询 * @param param * @return */@SelectProvider(type = UserSqlProvider.class, method = "getUserListByMapSql")List
getUserListByMapSql(@Param("param") Map
param);

在 UserSqlProvider 类增加对上面接口 SQL 的实现:

/** * 获取查询SQL * @param param * @return */public String getUserListByMapSql(Map
param) { StringBuilder builder = new StringBuilder(); Map
realParam = (Map
)param.get("param"); //add select part builder.append(" select * from user where 1 = 1 "); //add condition part String conditionStr = ""; if(!StringUtil.isNullOrEmpty(realParam)){ conditionStr = getQueryCondition(realParam); if(!StringUtil.isNullOrEmpty(conditionStr)){ builder.append(conditionStr); } } return new String(builder);}public String getQueryCondition(Map
param){ StringBuilder builder = new StringBuilder(); //if param is null or empty, return empty String if(param == null || param.size() < 1){ return ""; } for(String key : param.keySet()){ String value = param.get(key); if(value != null && !value.isEmpty()){ builder.append(" and " + key + " = '" + value + "'"); } } return new String(builder);}

上面用到了 StringUtil.java,我们在 com.chanshuyi.util 中导入它:

package com.mszz.util;import java.util.Collection;import java.util.Map;/** * 字符串工具类 * @author chenxinquan * */public class StringUtil {    /**     * 判断对象或对象数组中每一个对象是否为空: 对象为null,字符序列长度为0,集合类、Map为empty     * @author zl     * @param obj     * @return     */    public static boolean isNullOrEmpty(Object obj) {        if (obj == null)            return true;        if (obj instanceof CharSequence)            return ((CharSequence) obj).length() == 0;        if (obj instanceof Collection)            return ((Collection) obj).isEmpty();        if (obj instanceof Map)            return ((Map) obj).isEmpty();        if (obj instanceof Object[]) {            Object[] object = (Object[]) obj;            if (object.length == 0) {                return true;            }            boolean empty = true;            for (int i = 0; i < object.length; i++) {                if (!isNullOrEmpty(object[i])) {                    empty = false;                    break;                }            }            return empty;        }        return false;    }}StringUtil.java
View Code

创建 com.chanshuyi.dao.impl.BaseDao.java 类,提供基本的数据库读写对象,并用注解方式将 SqlSession 注入。

package com.chanshuyi.dao.impl;import org.apache.ibatis.session.SqlSession;import org.springframework.beans.factory.annotation.Autowired;/** * 所有Service的基类,用来注入sqlSession */public class BaseDao {    /**     * 可写的sqlSession     */    @Autowired    protected SqlSession writableSQLSession;    /**     * 只读的sqlSession     */    @Autowired    protected SqlSession readonlySQLSession;}

创建DAO层接口 IUserDao.java:

package com.chanshuyi.dao;import com.chanshuyi.model.User;import java.util.List;import java.util.Map;/** * Created by chanshuyi on 2015/12/26. */public interface IUserDao {    User getUserById(int userId);    /**     *     * @param param Map中的key要与数据库表中的字段名相同     * @return     */    User getUserByMapSql(Map
param); List
getUserListByMapSql(Map
param);}

创建 UserDaoImpl.java 继承 BaseDao.java、实现 IUserDao 接口,并用 @Repository 创建名称为 userDao 的对象。

package com.chanshuyi.dao.impl;import com.chanshuyi.dao.IUserDao;import com.chanshuyi.dao.mapper.UserMapper;import com.chanshuyi.model.User;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Repository;import java.util.List;import java.util.Map;/** * Created by Administrator on 2015/12/26. */@Repository("userDao")public class UserDaoImpl extends BaseDao implements IUserDao {    private static Log logger = LogFactory.getLog(UserDaoImpl.class);    @Override    public User getUserById(int userId) {        UserMapper mapper = readonlySQLSession.getMapper(UserMapper.class);        return mapper.selectByPrimaryKey(userId);    }    /**     *     * @param param     * @return     */    @Override    public User getUserByMapSql(Map
param) { logger.info("getUserByMapSql 根据动态参数查询用户对象"); return getUserListByMapSql(param).size() > 0 ? getUserListByMapSql(param).get(0) : null; } /** * get**MapSql()类的方法只能用于各参数的等于查询 * 例如:select * from user where username = 1 and password = 3 (正确) * select * from user where username in (1,2,3) (错误,无法实现) * @param param * @return */ @Override public List
getUserListByMapSql(Map
param) { logger.info("getUserListByMapSql 根据动态参数查询用户对象列表"); UserMapper mapper = readonlySQLSession.getMapper(UserMapper.class); return mapper.getUserListByMapSql(param); }}

创建 IUserService.java 和 UserServiceImpl.java。在 UserServiceImpl 中添加 @Service 注解创建名称为 userService 的对象,并将 userDao 对象注入。

package com.mszz.service;import com.mszz.model.User;import java.util.List;import java.util.Map;/** * Created by chanshuyi on 2015/12/26. */public interface IUserService {    User getUserById(int userId);    /**     *     * @param param Map中的key要与数据库表中的字段名相同     * @return     */    User getUserByMapSql(Map
param); List
getUserListByMapSql(Map
param);}
package com.chanshuyi.service.impl;import com.chanshuyi.dao.IUserDao;import com.chanshuyi.model.User;import com.chanshuyi.service.IUserService;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;import java.util.Map;/** * Created by Administrator on 2015/6/18. */@Service("userService")public class UserServiceImpl implements IUserService {    private static Log logger = LogFactory.getLog(UserServiceImpl.class);    @Autowired    IUserDao userDao;    @Override    public User getUserById(int userId) {        return userDao.getUserById(userId);    }    @Override    public User getUserByMapSql(Map
param) { return userDao.getUserByMapSql(param); } @Override public List
getUserListByMapSql(Map
param) { return userDao.getUserListByMapSql(param); }}

五、开发控制层(Struts)

创建 com.chanshuyi.action.UserController 类

package com.chanshuyi.controller;import com.chanshuyi.service.IUserService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;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.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;import java.util.HashMap;import java.util.Map;/** * Created by Administrator on 2015/6/18. */@Controller("userAction")@RequestMapping(value="/login")public class UserController{    private static Logger logger = LoggerFactory.getLogger(UserController.class);    private String message;    private String username;    private String password;    @Autowired    private IUserService userService;    @Autowired    private HttpServletRequest request;    @RequestMapping("")    public String login(@RequestParam(value = "username", required = false) String username,            @RequestParam(value = "password", required = false) String password){        try{            Map
param = new HashMap
(); param.put("username", username); param.put("password", password); if(userService.getUserByMapSql(param) != null){ message = "登录成功!"; logger.info(message); }else{ message = "登录失败!"; logger.info(message); } }catch(Exception e){ logger.warn(e.getMessage()); e.printStackTrace(); } request.setAttribute("message", message); return "index"; // 转到webapp/index.jsp页面 } /******** set/get ********/ public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}

创建 webapp/index.jsp 文件

<%@page language="java" pageEncoding="UTF-8"%><%@ page contentType="text/html;charset=utf-8" %><%@ page isELIgnored="false"%>    

Hello World!

<%-- 通过Struts传递参数,数据传递方式必须选择post,否则编码错误! --%>

${message}

Username:
Password:

修改 web.xml 文件,加载 SpringMVC 处理器

Archetype Created Web Application
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
spring
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:/spring-servlet.xml
1
spring
/

六、启动项目测试

为工程配置 Maven 命令 “tomcat7:run” 

点击启动项目

打开浏览器输入: 

输入 admin/password,点击 Login 按钮

提示登录成功,说明项目已经成功部署好。

与 Spring 框架项目对比

因为我们一般用 SpringMVC 的时候都是用注解的形式,所以SpringMVC 框架的项目都是注解形式,没有 XML 配置文件方式。下面我们来对比一下用 SpringMVC 和用 Spring + Struts 的实现区别。

1、使用 SpringMVC 框架时需要配置与 Spring 不同的 web.xml 配置,并且读取的根配置文件不再是 applicationContext.xml,而是 servletName-servlet.xml(servletName 表示的是配置在 web.xml 中的servlet 名称)。

2、因为使用了 SpringMVC,所以不再需要 Struts 来接收用户请求,而是直接通过 @RequestMapping 注解的方式在 Controller 类上进行注解映射,也就少了 struts.xml 这个配置文件。而一般情况下用 SpringMVC 的项目更习惯于将 Action 写成 Controller。

 

链接: 密码:vrm5

转载于:https://www.cnblogs.com/chanshuyi/p/5160120.html

你可能感兴趣的文章
Python学习之路11——面向对象
查看>>
json转sql
查看>>
拷贝构造函数
查看>>
多线程基础——线程启动
查看>>
C语言位运算(一)(转)
查看>>
基于云计算感应器的智能盆栽监测系统
查看>>
【405】算法时间复杂度和空间复杂度的计算
查看>>
MYSQL 加密的 3 类方法
查看>>
favicon.ico 404
查看>>
探秘Java中String、StringBuilder以及StringBuffer
查看>>
ActivityGroup中EditText无法删除的问题
查看>>
android 修改系统的dialog样式
查看>>
Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
查看>>
Codeforces Round #306 (Div. 2) A B C
查看>>
面向对象设计:共性VS个性-------继承的粒度和聚合的粒度以及类的重构
查看>>
计算机操作系统总结
查看>>
ubuntu 12.04下访问windows共享文件夹
查看>>
2017-3-13 SQL server 表连接
查看>>
2017-9-3 时间字符串格式化(转)
查看>>
2017-6-2 Linq 高级查询 (分页和组合查)、集合取交集
查看>>