前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaEE之MVC框架组合(SpringMVC+Spring4.0+Mybatis3.2)搭建过程详解

JavaEE之MVC框架组合(SpringMVC+Spring4.0+Mybatis3.2)搭建过程详解

作者头像
SmileNicky
发布2019-01-17 15:33:40
7240
发布2019-01-17 15:33:40
举报
文章被收录于专栏:Nicky's blogNicky's blog

很久之前就想写的教程,因为忙着找实习的原因,没有整理出来,首先SSM框架组合(SpringMVC+Spring+Mybatis)和SSH(Spring4.0+Struts2+Hibernate4.0)组合是外面企业里很常用的两种MVC架构,本博客介绍SSM框架组合,这种MVC架构的搭建过程

jar准备的话,可以用maven或者网上下载 SpringMVC需要的jar

这里写图片描述
这里写图片描述

jar作用详解(网上收集): aopaliance.jar 包含了针对面向切面的接口,通常Spring等其它具备动态织入功能的框架依赖此包

spring-aop.jar 这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类和源码级元数据支持。使用基于AOP 的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 外部依赖spring-core, (spring-beans,AOP Alliance, CGLIB,Commons Attributes)。

spring-aspects.jar 提供对AspectJ的支持,以便可以方便的将面向方面的功能集成进IDE中,比如Eclipse AJDT。 外部依赖。

spring-beans.jar 这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。 外部依赖spring-core,(CGLIB)。

spring-context.jar 这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。 外部依赖spring-beans, (spring-aop)。

spring-core.jar 这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 外部依赖Commons Logging, (Log4J)。

spring-expression.jar Spring表达式语言需要的jar

spring-jdbc.jar 这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。 外部依赖spring-beans,spring-dao。

spring-test.jar spring框架对junit框架简单封装的jar

spring-tx.jar 提供对事务的支持,事务的相关处理以及实现类就在这个jar包中

spring-context-support.jar 这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。 外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)

spring-web.jar 这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。 外部依赖spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)。

spring-webmvc.jar 这个jar 文件包含Spring MVC 框架相关的所有类。包括框架的Servlets,Web MVC框架,控制器和视图支持。当然,如果你的应用使用了独立的MVC 框架,则无需这个JAR 文件里的任何类。 外部依赖spring-web, (spring-support,Tiles,iText,POI)。

Mybatis需要的jar,mybatis-spring1.2.1.jar用于spring整合mybatis框架

这里写图片描述
这里写图片描述

jstl需要的jar,主要开发中,SSH框架习惯用Struts2提供的标签,SSM框架习惯用JSTL

这里写图片描述
这里写图片描述

Log4j需要的jar:

这里写图片描述
这里写图片描述

另外加入:aspectjweaver.jar: aspectjweaver.jar是spring集成AspectJ LTW织入器所需包

需要AOP动态代理的需要加入: cglib-nodep.jar

阿里连接池框架加入:druid.jar

权限安全框架Shiro加入:shiro.jar

Json解析需要加入的jar有:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

新建一个resource的资源文件 配置mybatis和spring ok,现在配置XML mybatis.xml:

代码语言:javascript
复制
<?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">
<!-- MyBatis的配置文件 -->
<configuration>

    <settings> 
        <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 -->   
        <setting name="useGeneratedKeys" value="true" /> 
        <setting name="defaultExecutorType" value="REUSE" /> 
    </settings>
<!-- 这些根据项目需要进行配置 -->
    <typeAliases>
        <typeAlias type="com.appms.entity.User" alias="User"/>
        <typeAlias type="com.appms.entity.Role" alias="Role"/>
        <typeAlias type="com.appms.entity.Menu" alias="Menu"/>
        <typeAlias type="com.appms.entity.Member" alias="Member"/>
        <typeAlias type="com.appms.entity.Knowledge" alias="Knowledge"/>
        <typeAlias type="com.appms.entity.Produce" alias="Produce"/>
        <typeAlias type="com.appms.entity.News" alias="News" />
        <typeAlias type="com.appms.entity.GroupClassify" alias="GroupClassify"/>
        <typeAlias type="com.appms.entity.GroupPost" alias="GroupPost"/>
        <typeAlias type="com.appms.entity.Period" alias="Period"/>
        <typeAlias type="com.appms.entity.KLClassify" alias="KLClassify"/>
        <typeAlias type="com.appms.entity.Knowledge" alias="Knowledge"/>
        <typeAlias type="com.appms.entity.Video" alias="Video"/>
        <typeAlias type="com.appms.entity.VideoClassify" alias="VideoClassify"/>
        <typeAlias type="com.appms.entity.Retroaction" alias="Retroaction"/>
        <typeAlias type="com.appms.entity.PageData" alias="pd"/>
        <typeAlias type="com.appms.entity.Page" alias="Page"/>
    </typeAliases>

    <!-- -->
    <plugins>
        <plugin interceptor="com.appms.plugin.PagePlugin">
            <property name="dialect" value="mysql"/>
            <property name="pageSqlId" value=".*listPage.*"/>
        </plugin>
    </plugins>

</configuration>

SpringMVC的配置:

代码语言:javascript
复制
<?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:mvc="http://www.springframework.org/schema/mvc"
    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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/>    
    <mvc:default-servlet-handler/>

    <context:component-scan base-package="com.appms.controller" />

    <!-- 对静态资源文件的访问  restful-->     
    <mvc:resources mapping="/assets/**" location="/,/assets/" />
    <mvc:resources mapping="/admin/**" location="/,/admin/" />
    <mvc:resources mapping="/source/**" location="/,/source/" />
    <mvc:resources mapping="/images/**" location="/,/images/" />
    <mvc:resources mapping="/music/**" location="/,/music/" />
    <mvc:resources mapping="/uploadFile/**" location="/,/uploadFile/" />
    <mvc:resources mapping="/plugins/**" location="/,/plugins/" />
    <mvc:resources mapping="/uploadFiles/**" location="/,/uploadFiles/" /> 

    <!-- 访问拦截 
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**/**"/>
            <bean class="com.appweb.interceptor.LoginHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
      -->  

    <!-- 配置SpringMVC的视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />  

</beans>

Spring的配置:

代码语言:javascript
复制
<?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:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/aop 
                        http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/tx 
                        http://www.springframework.org/schema/tx/spring-tx.xsd">

        <!-- 启用注解 -->
    <context:annotation-config />

    <!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 -->
    <context:component-scan base-package="com.appms">
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                 <value>/WEB-INF/classes/dbconfig.properties</value>  
            </list>  
        </property>  
    </bean> 

    <!-- 阿里 druid数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
         <!-- 数据库基本信息配置 -->
         <property name="url" value="${url}" />  
         <property name="username" value="${username}" />  
         <property name="password" value="${password}" />  
         <property name="driverClassName" value="${driverClassName}" />  
         <property name="filters" value="${filters}" />  
         <!-- 最大并发连接数 -->
         <property name="maxActive" value="${maxActive}" />
         <!-- 初始化连接数量 -->
         <property name="initialSize" value="${initialSize}" />
         <!-- 配置获取连接等待超时的时间 -->
         <property name="maxWait" value="${maxWait}" />
         <!-- 最小空闲连接数 -->
         <property name="minIdle" value="${minIdle}" />  
         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
         <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
         <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />  
         <property name="validationQuery" value="${validationQuery}" />  
         <property name="testWhileIdle" value="${testWhileIdle}" />  
         <property name="testOnBorrow" value="${testOnBorrow}" />  
         <property name="testOnReturn" value="${testOnReturn}" />  
         <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" />
         <!-- 打开removeAbandoned功能 -->
         <property name="removeAbandoned" value="${removeAbandoned}" />
         <!-- 1800秒,也就是30分钟 -->
         <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
         <!-- 关闭abanded连接时输出错误日志 -->   
         <property name="logAbandoned" value="${logAbandoned}" />
    </bean>  

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="delete*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception" />
            <tx:method name="update*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception" />
            <tx:method name="save*" propagation="REQUIRED" read-only="false" 
                       rollback-for="java.lang.Exception" />
        </tx:attributes>
    </tx:advice>

    <aop:aspectj-autoproxy proxy-target-class="true"/>

    <!-- 事物处理 -->
    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.appms.service..*(..))" />
        <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" />
    </aop:config>

    <!-- 配置mybatis -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
        <!-- mapper扫描 -->
        <property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>
    </bean>

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
    </bean>

    <!--  Shiro start  -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="realm" ref="ShiroRealm" />
        </bean>

        <!-- 項目自定义的Realm -->
        <bean id="ShiroRealm" class="com.appms.shiro.ShiroRealm" ></bean>

        <!-- Shiro Filter -->
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <property name="securityManager" ref="securityManager" />

            <property name="loginUrl" value="/" />

            <property name="successUrl" value="/main/index" />

            <property name="unauthorizedUrl" value="/login_toLogin" />

            <property name="filterChainDefinitions">
                <value>
                /source/**                  = anon
                /images/**                  = anon
                /music/**                   = anon
                /uploadFiles/**             = anon
                /plugins/**                 = anon
                /uploadFiles/**             = anon
                /code.do                    = anon
                /login_login                = anon
                /**                         = authc
                </value>
            </property>
        </bean>
    <!--  Shiro end  -->


</beans>

jsbc和log4j的配置

代码语言:javascript
复制
url:jdbc:mysql://127.0.0.1:3306/db_app?autoReconnect=true&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8 
driverClassName:com.mysql.jdbc.Driver
username:root
password:root

filters:stat

maxActive:20
initialSize:1
maxWait:60000
minIdle:10
maxIdle:15

timeBetweenEvictionRunsMillis:60000
minEvictableIdleTimeMillis:300000

validationQuery:SELECT 'x'
testWhileIdle:true
testOnBorrow:false
testOnReturn:false

maxOpenPreparedStatements:20
removeAbandoned:true
removeAbandonedTimeout:1800
logAbandoned:true

log4j配置

代码语言:javascript
复制
### set log levels ### 
log4j.rootLogger = info , Console , D
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=INFO
#output2file
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.D.File = D\:/logs/log.log 
log4j.appender.D.Append = true 
log4j.appender.D.Threshold = INFO \#\# \u8F93\u51FAinfo\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7 
log4j.appender.D.layout = org.apache.log4j.PatternLayout 
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n 

web.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>AppManagerSystem</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/ApplicationContext.xml</param-value>
  </context-param>
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <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>/*</url-pattern>
  </filter-mapping>
  <!-- 连接池 启用Web监控统计功能 -->
  <filter>
    <filter-name>DruidWebStatFilter</filter-name>
    <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
    <init-param>
      <param-name>exclusions</param-name>
      <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>DruidStatView</servlet-name>
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DruidStatView</servlet-name>
    <url-pattern>/druid/*</url-pattern>
  </servlet-mapping>
  <!-- -->
  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.appms.filter.LoginFilter</filter-class>
  </filter>
  <filter>
    <filter-name>startFilter</filter-name>
    <filter-class>com.appms.filter.StartFilter</filter-class>
  </filter>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
  <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>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/ApplicationContext-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>


  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>
            org.springframework.web.filter.DelegatingFilterProxy
        </filter-class>
    <init-param>
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>600</session-timeout>
  </session-config>
</web-app>

现在以Dao代理的方式实习数据获取

代码语言:javascript
复制
package com.appms.dao;

public interface DAO {

    /**
     * 保存对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object save(String str, Object obj) throws Exception;

    /**
     * 修改对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object update(String str, Object obj) throws Exception;

    /**
     * 删除对象 
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object delete(String str, Object obj) throws Exception;

    /**
     * 查找对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object findForObject(String str, Object obj) throws Exception;

    /**
     * 查找对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object findForList(String str, Object obj) throws Exception;

    /**
     * 查找对象封装成Map
     * @param s
     * @param obj
     * @return
     * @throws Exception
     */
    public Object findForMap(String sql, Object obj, String key , String value) throws Exception;

}

DaoSupport.java

代码语言:javascript
复制
package com.appms.dao;

import java.util.List;

import javax.annotation.Resource;

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

@Repository("daoSupport")
public class DaoSupport implements DAO {

    @Resource(name = "sqlSessionTemplate")
    private SqlSessionTemplate sqlSessionTemplate;

    /**
     * 保存对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object save(String str, Object obj) throws Exception {
        return sqlSessionTemplate.insert(str, obj);
    }

    /**
     * 批量更新
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object batchSave(String str, List objs )throws Exception{
        return sqlSessionTemplate.insert(str, objs);
    }

    /**
     * 修改对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object update(String str, Object obj) throws Exception {
        return sqlSessionTemplate.update(str, obj);
    }

    /**
     * 批量更新
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public void batchUpdate(String str, List objs )throws Exception{
        SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
        //批量执行器
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        try{
            if(objs!=null){
                for(int i=0,size=objs.size();i<size;i++){
                    sqlSession.update(str, objs.get(i));
                }
                sqlSession.flushStatements();
                sqlSession.commit();
                sqlSession.clearCache();
            }
        }finally{
            sqlSession.close();
        }
    }

    /**
     * 批量更新
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object batchDelete(String str, List objs )throws Exception{
        return sqlSessionTemplate.delete(str, objs);
    }

    /**
     * 删除对象 
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object delete(String str, Object obj) throws Exception {
        return sqlSessionTemplate.delete(str, obj);
    }

    /**
     * 查找对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object findForObject(String str, Object obj) throws Exception {
        return sqlSessionTemplate.selectOne(str, obj);
    }

    /**
     * 查找对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object findForList(String str, Object obj) throws Exception {
        return sqlSessionTemplate.selectList(str, obj);
    }

    public Object findForMap(String str, Object obj, String key, String value) throws Exception {
        return sqlSessionTemplate.selectMap(str, obj, key);
    }

}

写个实体信息类:

代码语言:javascript
复制
package com.appms.entity;

import java.util.List;

public class Member {

    /**
     * 会员账号
     */
    private String memberID;

    /**
     * 会员密码
     */
    private String password;

    /**
     * 会员级别
     */
    private String rank;

    /**
     * 会员积分
     */
    private int credit;

    /**
     * 会员手机号
     */
    private String phone;

    /**
     * 会员皮肤
     */
    private String imgPath;

    /**
     * 邮箱
     */
    private String email;

    private List<GroupPost> postes;

    private List<Retroaction> retroaction;

    public String getMemberID() {
        return memberID;
    }

    public void setMemberID(String memberID) {
        this.memberID = memberID;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRank() {
        return rank;
    }

    public void setRank(String rank) {
        this.rank = rank;
    }

    public int getCredit() {
        return credit;
    }

    public void setCredit(int credit) {
        this.credit = credit;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getImgPath() {
        return imgPath;
    }

    public void setImgPath(String imgPath) {
        this.imgPath = imgPath;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<GroupPost> getPostes() {
        return postes;
    }

    public void setPostes(List<GroupPost> postes) {
        this.postes = postes;
    }

    public List<Retroaction> getRetroaction() {
        return retroaction;
    }

    public void setRetroaction(List<Retroaction> retroaction) {
        this.retroaction = retroaction;
    }

}

其Mapper代码:

代码语言:javascript
复制
<?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="MemberMapper">

    <resultMap type="Member" id="memberResultMap">
        <id column="memberID" property="memberID"/>
        <result column="password" property="password"/>
        <result column="rank" property="rank"/>
        <result column ="credit" property="credit"/>
        <result column="phone" property="phone"/>
        <result column="imgPath" property="imgPath"/>
        <result column="email" property="email"/>
        <collection property="postes" ofType="GroupPost">
            <id column="postID" property="postID"/>
            <result column="postTitle" property="postTitle"/>
            <result column="postContent" property="postContent"/>
            <result column="likeAmount" property="likeAmount"/>
            <result column="commentAmount" property="commentAmount"/>
            <result column="commitTime" property="commitTime"/>
        </collection>
        <collection property="retroaction" ofType="Retroaction">
            <id column="rID" property="rID" />
            <result column="content" property="content" />
            <result column="commitTime" property="commitTime" />
        </collection>
    </resultMap>

    <!-- 修改 -->
    <update id="editM" parameterType="pd" flushCache="false">
        update tb_members
            set memberID            = #{memberID},
                password            = #{password},
                rank                = #{rank},
                credit              = #{credit},
                phone               = #{phone}
        where
            memberID = #{memberID}
    </update>

    <!-- 通过会员账号获取数据 -->
    <select id="findByMId" parameterType="pd" resultType="pd" useCache="false">
        select
            p.memberID,
            p.password,
            p.rank,
            p.credit,
            p.phone,
            p.imgPath
        from
            tb_members p
        where
            memberID = #{memberID}
    </select>

    <!-- 删除会员信息 -->
    <delete id="deleteM" parameterType="String" flushCache="false">
        delete from tb_members
        where 
        memberID = #{memberID}
    </delete>

    <!-- 批量删除会员信息 -->
    <delete id="deleteAllM" parameterType="String" flushCache="false">
        delete from tb_members
        where memberID in
        <foreach item="item" index="index" collection="array" open="(" separator="," close=")">
            #{item}
        </foreach>
    </delete>

    <!-- 用户信息列表(全部) -->
    <select id="memberListPage" parameterType="page" resultType="pd" useCache="false">
        select m.memberID,
               m.password,
               m.rank,
               m.credit,
               m.phone,
               m.imgPath
        from tb_members m
    </select>

    <!-- 用户信息列表 -->
    <select id="memberList" parameterType="pd" resultType="pd" useCache="false">
        select m.memberID,
               m.password,
               m.rank,
               m.credit,
               m.phone
        from tb_members m
    </select>

    <!-- 按月统计注册用户数量 -->
    <select id="queryCount" parameterType="String" resultType="Long">
        select year(regTime),
               count(*) 
        from tb_member group by year(regTime) 
    </select>

    <!-- 搜索会员信息 -->
    <select id="queryMemberInfo" parameterType="pd" resultType="pd" useCache="false">
        select m.memberID,
               m.password,
               m.rank,
               m.phone,
               m.imgPath
        from tb_members m 
        where m.memberID like "%"#{keyword}"%"
    </select>

</mapper>

写个BaseController:

代码语言:javascript
复制
package com.appms.base;


import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.appms.entity.Page;
import com.appms.entity.PageData;
import com.appms.logger.Logger;
import com.appms.utils.UuidUtil;

public class BaseController {

    protected Logger logger = Logger.getLogger(this.getClass());

    private static final long serialVersionUID = 6357869213649815390L;

    /**
     * 得到PageData
     */
    public PageData getPageData(){
        return new PageData(this.getRequest());
    }

    /**
     * 得到ModelAndView
     */
    public ModelAndView getModelAndView(){
        return new ModelAndView();
    }

    /**
     * 得到request对象
     */
    public HttpServletRequest getRequest() {
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

        return request;
    }

    /**
     * 得到32位的uuid
     * @return
     */
    public String get32UUID(){

        return UuidUtil.get32UUID();
    }

    /**
     * 得到分页列表的信息 
     */
    public Page getPage(){
        return new Page();
    }

    public static void logBefore(Logger logger, String interfaceName){
        logger.info("");
        logger.info("start");
        logger.info(interfaceName);
    }

    public static void logAfter(Logger logger){
        logger.info("end");
        logger.info("");
    }

}

业务层代码Service:

代码语言:javascript
复制
package com.appms.service.member;

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

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.appms.dao.DaoSupport;
import com.appms.entity.Member;
import com.appms.entity.Page;
import com.appms.entity.PageData;

@Service("memberService")
public class MemberService {

    @Resource(name="daoSupport")
    DaoSupport dao;

    /**
     * 通过会员账号获取信息
     */
    public PageData findByUId(PageData pd) throws Exception{
        return (PageData)dao.findForObject("MemberMapper.findByMId", pd);
    }

    /**
     * 修改会员信息
     */
    public void editM(PageData pd)throws Exception{
        dao.update("MemberMapper.editM", pd);
    }

    /**
     * 删除会员信息
     */
    public void deleteM(PageData pd)throws Exception{
        dao.delete("MemberMapper.deleteM", pd);
    }

    /**
     * 批量删除会员信息
     */
    public void deleteAllM(String[] mids)throws Exception{
        dao.delete("MemberMapper.deleteAllM",mids);
    }

    /**
     * 会员信息列表
     */
    public List<PageData> listPdPageM(Page page)throws Exception{
        return (List<PageData>)dao.findForList("MemberMapper.memberListPage", page);
    }

    /**
     * 会员信息列表
     * @param pd
     * @return
     * @throws Exception
     */
    public List<PageData> listM(PageData pd)throws Exception{
        return (List<PageData>)dao.findForList("MemberMapper.memberList", pd);
    }

    public List<Long> getCount()throws Exception{
        return (List<Long>)dao.findForObject("MemberMapper.queryCount", null);
    }


    /**
     * 模糊查询
     * @param pd
     * @return
     * @throws Exception
     */
    public List<PageData> queryM(PageData pd)throws Exception{
        return (List<PageData>)dao.findForList("MemberMapper.queryMemberInfo", pd);
    }

}

Controller层代码:

代码语言:javascript
复制
package com.appms.controller.member;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.appms.base.BaseController;
import com.appms.entity.Page;
import com.appms.entity.PageData;
import com.appms.service.member.MemberService;
import com.appms.utils.AppUtil;
import com.appms.view.ObjectExcelView;

@Controller
@RequestMapping(value="/member")
public class MemberController extends BaseController{

    @Resource(name="memberService")
    private MemberService memberService;

    /**
     * 编辑会员信息
     */
    @RequestMapping(value="/editM",produces="application/json;charset=UTF-8")
    @ResponseBody
    public Object editM()throws Exception{
        Map<String,String> map = new HashMap<String, String>();
        PageData pd = new PageData();
        pd = this.getPageData();
        String KEYDATA[] = pd.get("KEYDATA").toString().split(",");
        pd.put("memberID", KEYDATA[0]);
        pd.put("password", KEYDATA[1]);
        pd.put("rank", KEYDATA[2]);
        pd.put("credit", KEYDATA[3]);
        pd.put("phone", KEYDATA[4]);
        memberService.editM(pd);
        map.put("result", "success");
        return AppUtil.returnObject(new PageData(), map);
    }

    /**
     * 跳转到编辑页面
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/goEditM")
    public ModelAndView goEditM()throws Exception{
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        String ID = pd.getString("memberID");

        if(null != ID&& !"".equals(ID)){
            ID = ID.trim();
            pd.put("memberID", ID);
            pd = memberService.findByUId(pd);
            mv.setViewName("/member/member_edit");  
            mv.addObject("pd",pd);
        }
        return mv;
    }

    /**
     * 是否存在会员信息
     */
    @RequestMapping(value="/hasM")
    @ResponseBody
    public Object hasM() throws Exception{
        return null;
    }

    /**
     * 获取所有的会员信息
     */
    @RequestMapping(value="/listMember")
    public ModelAndView listMemberInfo(Page page)throws Exception{
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        String memberID = pd.getString("memberID");
        if(null != memberID && !"".equals(memberID)){
            memberID = memberID.trim();
            pd.put("memberID", memberID);
        }
        page.setShowCount(5);
        page.setPd(pd);
        mv.addObject("page",page);
        List<PageData> infoList = memberService.listPdPageM(page);
        mv.setViewName("/member/member_list");
        mv.addObject("memberInfoList",infoList);
        mv.addObject("pd", pd);
        return mv;
    }

    /**
     * 模糊查询
     * @return
     * @throws Exception
     */
    @RequestMapping("/queryM")
    public ModelAndView queryM()throws Exception{
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        String keyword = pd.getString("keyword");
        keyword = new String(keyword.getBytes("iso-8859-1"),"UTF-8");
        if(keyword!=null&&!"".equals(keyword)){
            keyword = keyword.trim();
            pd.put("keyword", keyword);
            List<PageData> memberInfo = memberService.queryM(pd);
            mv.setViewName("member/member_list");
            mv.addObject("memberInfoList", memberInfo);
        }
        return mv;
    }

    /**
     * 导出Excel
     * @return
     * @throws Exception
     */
    @RequestMapping("/exportExcel")
    public ModelAndView exportExcel()throws Exception{
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        //检索条件
        Map<String,Object> dataMap = new HashMap<String,Object>();
        List<String> titles = new ArrayList<String>();

        titles.add("用户名");
        titles.add("密码");
        titles.add("级别");
        titles.add("积分");
        titles.add("手机号");

        dataMap.put("titles", titles);

        List<PageData> memberList = memberService.listM(pd);
        List<PageData> varList = new ArrayList<PageData>();
        for(int i=0;i<memberList.size();i++){
            PageData vpd = new PageData();
            vpd.put("var1", memberList.get(i).getString("memberID"));
            vpd.put("var2", memberList.get(i).getString("password"));
            vpd.put("var3", memberList.get(i).getString("rank"));
            vpd.put("var4", memberList.get(i).get("credit").toString());
            vpd.put("var5", memberList.get(i).getString("phone"));
            varList.add(vpd);
        }
        dataMap.put("varList", varList);
        ObjectExcelView erv = new ObjectExcelView();
        mv = new ModelAndView(erv,dataMap);

        return mv;
    }

}

为了代码安全性,将jsp全部放在WEB-INF下面:

这里写图片描述
这里写图片描述

jsp页面代码,用cstl获取数据

代码语言:javascript
复制
<%@page import="com.appms.base.Const"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!doctype html>
<html>
<head>
    <base href="<%=basePath %>">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>${pd.SYSNAME}</title>
  <meta name="description" content="这是一个 index 页面">
  <meta name="keywords" content="index">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <meta name="renderer" content="webkit">
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <link rel="icon" type="image/png" href="assets/i/favicon.png">
  <link rel="apple-touch-icon-precomposed" href="assets/i/app-icon72x72@2x.png">
  <meta name="apple-mobile-web-app-title" content="Amaze UI" />
  <link rel="stylesheet" href="assets/css/amazeui.min.css"/>
  <link rel="stylesheet" href="assets/css/admin.css">
  <script type="text/javascript">window.jQuery || document.write("<script src='source/js/jquery-1.9.1.min.js'>\x3C/script>");</script>
  <script type="text/javascript" src="source/js/jquery.tips.js"></script><!--提示框-->

</head>
<body>
<!--[if lte IE 9]>
<p class="browsehappy">你正在使用<strong>过时</strong>的浏览器,Amaze UI 暂不支持。 请 <a href="http://browsehappy.com/" target="_blank">升级浏览器</a>
  以获得更好的体验!</p>
<![endif]-->

   <!-- 页面顶部¨ -->
   <%@ include file="../admin/head.jsp"%>

<div class="am-cf admin-main">

  <!-- 左侧菜单• -->
  <%@ include file="../admin/left.jsp"%>

  <!-- content start -->
  <div class="admin-content">

    <div class="am-cf am-padding">
      <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg"><a href="main/index">首页</a></strong> / <small>会员管理</small></div>
    </div>

    <div class="am-g">
      <div class="am-u-md-6 am-cf">
        <div class="am-fl am-cf">
          <div class="am-btn-toolbar am-fl">
            <div class="am-btn-group am-btn-group-xs">
              <a class="am-btn am-btn-default" href="member/exportExcel.do" style="background-color: white;"><span class="am-icon-save"></span>导出Excel</a>
            </div>
          </div>
        </div>
      </div>
      <div class="am-u-md-3 am-cf">
        <div class="am-fr">
          <div class="am-input-group am-input-group-sm">
            <input type="text" class="am-form-field" id="keyword"/>
                <span class="am-input-group-btn">
                  <input type="button" class="am-btn am-btn-default" onclick="queryInfo();" value="搜索" />
                </span>
          </div>
        </div>
      </div>
    </div>

    <div class="am-g">
      <div class="am-u-sm-12">
        <form class="am-form">
          <table class="am-table am-table-striped am-table-hover table-main">
            <thead>
              <tr>
                <th>图片</th>
                <th>账号</th>
                <th>密码</th>
                <th>级别</th>
                <th>积分</th>
                <th>手机</th>
                <th>操作</th>
              </tr>
          </thead>
          <tbody>
          <c:choose>
            <c:when test="${not empty memberInfoList}">
            <c:forEach items="${memberInfoList}" var="u" varStatus="vs">
            <tr>
              <td><img src="${pageContext.request.contextPath}${u.imgPath}" width="30px" height="30px" /></td>
              <td>${u.memberID}</td>
              <td>${u.password}</td>
              <td>${u.rank}</td>
              <td>${u.credit}</td>
              <td>${u.phone}</td>
              <td>
                <div class="am-btn-toolbar">
                  <div class="am-btn-group am-btn-group-xs">
                    <a href="member/goEditM.do?memberID=${u.memberID}" style="background-color: white;" class="am-btn am-btn-default am-btn-xs am-text-secondary"><span class="am-icon-pencil-square-o"></span> 编辑</a>
                  </div>
                </div>
              </td>
            </tr>

            </c:forEach>
            </c:when>
            <c:otherwise>
            <tr class="main_info">
                <td colspan="10">没有相关数据</td>
            </tr>
            </c:otherwise>
          </c:choose>
          </tbody>
        </table>
          <div class="am-cf">
  共 15 条记录
  <div class="am-fr">
    <ul class="am-pagination">
      <li class="am-disabled"><a href="#">«</a></li>
      <li><a href="#">1</a></li>
      <li><a href="#">2</a></li>
      <li><a href="#">3</a></li>
      <li><a href="#">4</a></li>
      <li><a href="#">5</a></li>
      <li><a href="#">»</a></li>
    </ul>
  </div>
</div>
          <hr />
          <p>注:.....</p>
        </form>
      </div>

    </div>
  </div>
  <!-- content end -->

</div>

<footer>
  <hr>
  <p class="am-padding-left">© 2017 E创工作室开发. <a href="http://www.mianfeimoban.com/" target="_blank">网站模板</a></p>
</footer>
<script type="text/javascript">
    function queryInfo(){
        var keyword = $("#keyword").val();
        window.location.href="member/queryM.do?keyword="+keyword;
    }
</script>
<!--[if lt IE 9]>
<script src="assets/js/jquery1.11.1.min.js"></script>
<script src="assets/js/modernizr.js"></script>
<script src="assets/js/polyfill/rem.min.js"></script>
<script src="assets/js/polyfill/respond.min.js"></script>
<script src="assets/js/amazeui.legacy.js"></script>
<![endif]-->

<!--[if (gte IE 9)|!(IE)]><!-->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/amazeui.min.js"></script>
<!--<![endif]-->
<script src="assets/js/app.js"></script>
</body>
</html>
这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档