上次不知道为什么,把写好的系列文章都搞成一样了。结果,五篇文章,都变成了最后一篇文章。

悲剧,好吧,只好重新写了。

这系列文章写的是SpringMVC-Mybatis-Maven项目整合。说白了,其实就是写一个用maven构造的SpringMVC与Mybatis的demo项目。

既然是Maven项目,首先肯定看看pom.xml。

在看pom.xml之前,请自行构架一个空的maven项目。

然后打开我们的pom.xml文件。

好了。我们先看看所需要的jar包吧。

下面是maven的dependencies的截图,只需要在dependencies里面添加下面包就可以了。

看来,其实所需jar包也并不多。下面一个一个来分析。

junit,就是junit包,测试用的,这个包一般在构建maven项目的时候会自动包含。

spring-webmvc包,这个包,就是SpringMVC的包。似乎里面已经基本包含了SpringMVC所需的jar包了。

mybatis-spring包是mybatis与spring结合的包,因为使用maven来构建的项目,所以会自动把mybatis相关的包也包含进来。

aspectjweaver就是面向方面(面向切面)的包,虽然SpringMVC已经实现了aop面向方面,但是SpringMVC的aop也是基于这个包,所以必须导入。

javax.servlet-api,这个servlet的api,不用说了,你懂的。

mysql-connector-java是mysql的java驱动。

commons-dbcp-all这个是连接池。

cglib就是代理的包,通常aop都是通过代理来实现的。

jstl就是jstl的包,因为项目里面,视图层用的是jstl。

在这里,所需的jar包基本已经包含。

上一章稍微说了SpringMVC-Mybatis-Maven项目整合项目所需要的jar包,但是关是jar包还是不行的。

这章,我们看看项目的基本配置以及控制层吧。

web项目基本配置,首先肯定得看看web.xml。在这里,我这里项目的web.xml是这样子的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE
web-app PUBLIC
 "-//Sun
Microsystems, Inc.//DTD Web Application 2.3//EN"
<web-app>
  <display-name>attg</display-name>
  <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

大概的意思就是配置了org.springframework.web.servlet.DispatcherServlet这个spring自带的servlet来接受所有*.do的请求。

而这个servlet的初始化参数,在classpath下面的xml文件中读取。这样子,项目启动的时候就会读取配置文件,来初始化spring自带servlet,让这个servlet来处理所有.do请求。

好吧,然后我们在resource下面,新建一个spring-servlet.xml,这是初始化住servlet的配置文件。

文件内容是:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml

version
="1.0"

encoding
="UTF-8"?>  
    xsi:schemaLocation="
 
    <aop:aspectj-autoproxy/>
     
    <!--
enable component scanning (beware that this does not enable mapper scanning!)   -->
 
    <context:component-scan

base-package
="me.idashu.attg"

/>
     
    <!--
enable autowire -->
    <context:annotation-config

/>
     
    <!--
启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean

class
="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"

/>
          
    <bean

id
="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property

name
="viewClass"
            value="org.springframework.web.servlet.view.JstlView"

/>
        <property

name
="prefix"

value
="/WEB-INF/jsp/"

/>
        <property

name
="suffix"

value
=".jsp"

/>
    </bean>
          
 </beans>

<aop:aspectj-autoproxy/>就是关于aop的。

<context:component-scan base-package="me.idashu.attg" />配置说明要扫瞄哪些包,因为这里是用全注解的方式配置的。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 配置会是spring自动注入。

<bean id="viewResolver"

class="org.springframework.web.servlet.view.UrlBasedViewResolver">

<property name="viewClass"

value="org.springframework.web.servlet.view.JstlView" />

<property name="prefix" value="/WEB-INF/jsp/" />

<property name="suffix" value=".jsp" />

</bean>

这个viewResolver,就是配置视图层。在这里使用的是jstl的视图。然后视图的前缀是/WEB-INF/jsp/,而且后缀是jsp。

配置这两个文件,SpringMVC就基本配置完,我们只需简单地新建一个controller,就可以处理请求了。

controller里面,要用@Controller注解来告诉系统,这个类是一个controller类。

然后@RequestMapping("/test")注解,就是告诉spring,这个方法,处理host/test.do的请求。

最后方法里面返回了一个“test”,就是调用了test视图。因为配置文件里面视图设置了前后缀,所以这里视图应该是/WEB-INF/jsp/test.jsp。也就是说,要有一个这样子的文件,否则系统会报错。

今天先接着上次项目整合来写。

上次说到了怎么配置控制层。

当我们配好了控制层,接着当然是配置我们的数据层了。

而我们的数据层,就是由我们的Mybatis来构成的。

上一次刚说完怎么来配置controller层,今天来看看怎么配置Mybatis。

Mybatis的配置,写在src下面的applicationContext.xml文件里面。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!--
数据库连接池 -->
    <bean

id
="dataSource"

class
="org.apache.commons.dbcp.BasicDataSource">
        <property

name
="driverClassName"

value
="com.mysql.jdbc.Driver"

/>
        <property

name
="url"

value
="jdbc:mysql://localhost:3306/test"

/>
        <property

name
="username"

value
="root"

/>
        <property

name
="password"

value
=""

/>
    </bean>
 
    <!--
transaction manager, use JtaTransactionManager for global tx -->
    <bean

id
="transactionManager"

class
="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property

name
="dataSource"

ref
="dataSource"

/>
    </bean>
 
    <!--
enable transaction demarcation with annotations -->
    <tx:annotation-driven

/>
 
    <!--
define the SqlSessionFactory -->
    <bean

id
="sqlSessionFactory"

class
="org.mybatis.spring.SqlSessionFactoryBean">
        <property

name
="dataSource"

ref
="dataSource"

/>
        <property

name
="typeAliasesPackage"

value
="me.idashu.attg.domain"

/>
    </bean>
 
    <!--
scan for mappers and let them be autowired -->
    <bean

class
="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property

name
="basePackage"

value
="me.idashu.attg.persistence"

/>
    </bean>

首先配的,当然是我们的数据可连接池。也就是dataSource,这里用的mysql数据库。

接下来下面几行,配置了transaction manager,也就是事务管理器。这里了事务是用注解的方式配置的。

然后sqlSessionFactory,就是我们mybatis的配置,忘记叫了叫什么了。。。me.idashu.attg.domain就是说,我们的domain在这个包的下面。

最后这里:

?
1
2
3
<bean

class
="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property

name
="basePackage"

value
="me.idashu.attg.persistence"

/>
</bean>

就是说,我们的mybatis的mapper,是写在me.idashu.attg.persistence这个包的下面,而且,这些mapper会自动注入。

就这样,mybatis的配置就完成了。

上次说到配置Mybatis,可是,单单是配置Mybatis还是不行的,我们还要用Mybatis来开发。

相信有Mybatis开发经验的人都知道,Mybatis开发时,我们需要编写mapper。

今天我们来看看怎么使用Mybatis。

还记得上次说到,我们的mybatis的mapper是写在me.idashu.attg.persistence这个包下面的,那么,mapper就下载这个下面吧。

下看看我们的接口,我在me.idashu.attg.persistence这个包下面,新建了一个UserMapper接口:

?
1
2
3
4
5
6
7
8
9
public

interface

UserMapper {
     
    void

insertUser(User user);
     
    void

updateUser(User user);
     
    User
getUser(User user);
 
}

这只是个接口,但是我们还要有具体的操作内容,所以,要在同一个包的下面,新建一个UserMapper.xml:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<mapper

namespace
="me.idashu.attg.persistence.UserMapper">
 
    <cache

/>
 
    <insert

id
="insertUser"

parameterType
="User">
        INSERT
INTO
        user
        (
            username,
            password
        )
        VALUES
        (
        #{username},
        #{password}
        )
  </insert>
 
    <update

id
="updateUser"

parameterType
="User">
        update
user set
        username
= #{username},
        password
= #{password}
        WHERE
id = #{id}
  </update>
   
    <select

id
="getUser"

parameterType
="User"

resultType
="User">
        select
* from user where id=#{id}
    </select>
     
</mapper>

这个xml文件,就是上面的那个接口的实现。这样子就可以把我们的mapper写好。

然后我们看看service层。mapper操作数据层,而我们的事务,是service层。下面是service的截图:

在service层的类中,用@Service来说明这个类是一个实体类,方便注入,然后

?
1
2
@Autowired
private

UserMapper userMapper;

就是为了注入刚才上面所写的mybatis的mapper。在下面,我们就可以直接使用接口定义的方法了。

那么@Transactional(rollbackFor=Exception.class)这段代码的作用呢,就是定义了一个事物,这个事务是在update方法里面,如果这个方法抛出异常,那么就会rollback。

如果要在controller层使用我们的service,直接注入就行了。好了,mybatis的配置也说完了。

前面的四篇文章,基本上已经把SpringMVC-Mybatis-Maven项目整合说清楚了,只需按照前面四篇文章来说的那样子配置,基本上都可以把这项目跑起来。

今天说说怎么在这个项目里面使用面向切面(AOP)吧。

其实面向切面的编程可以说是面向对象编程的一种补充吧。这种编程方法,可以解决一些相同的重复的事情。

在src下面新建me.idashu.attg.aop这个包。然后在包下,新建一个ControllerSelectorInterceptor类,写上下面代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Aspect
public

class

ControllerSelectorInterceptor {
     
    @Before("execution(*
me.idashu.attg..*.*Controller.*Do(..,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse))"
)
    public

void

doBefore(JoinPoint jp) {
        Object[]
args = jp.getArgs();
        HttpServletRequest
request = (HttpServletRequest) args[args.length-
2];
        request.setAttribute("aop",
"ok");
        System.out.println("before");
    }
 
     @After("execution(*
me.idashu.attg..*.*Controller.*Do(..,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse))"
)
     public

void

doAfter(JoinPoint jp) { 
        Object[]
args = jp.getArgs();
        HttpServletRequest
request = (HttpServletRequest) args[args.length-
2];
        String
aop = (String) request.getAttribute(
"aop");
        System.out.println("after
"
+aop);
     }
}

这样子,我们就配置好aop了。

@Aspect这个注解,就是说,这个类是一个切面,也就是用来处理相同的事情的一个类。

@Before("execution(* me.idashu.attg..*.*Controller.*Do(..,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse))")这一句的意思就是在执行*Do()方法之前我要执行下面的doBefore方法。其实这里还有一些约束,就是这个*Do()方法,必须在me.idashu.attg这个包或者子包的下面,而且这个方法,在一个名叫*Controller的类里面。同时,这个方法的参数最后两个分别是javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse,也就是我们常用的request和response。

我这里的代码,其实就是说,在执行*Do()方法之前,先执行doBefore()方法。在这方法里面,先获取request,然后再里面放入一个名叫aop的变量。然后再执行完这个方法折后,程序会执行doAfter()方法。先获取request,然后冲request中取出aop变量,这样子我们就可以看到这两个方法有没有正确执行了。

好了,在这里,SpringMVC-Mybatis-Maven项目整合系列终于写完了,虽然水平确实不怎么样。但是希望对有兴趣的童鞋有点参考作用。

项目源码地址:SpringMVC-Mybatis-Maven项目整合源码

SpringMVC-Mybatis-Maven项目整合的更多相关文章

  1. spring springmvc mybatis maven 项目整合示例-导航页面

    spring原理 实践解析-简单的helloworld spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包 spring原理案例-基本项目 ...

  2. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...

  3. IntelliJ IDEA 创建Spring+SpringMVC+mybatis+maven项目

    参考自:https://www.cnblogs.com/hackyo/p/6646051.html 第一步: 创建maven项目 输入项目名和工程id 选择maven 默认就可以了 刚开始时间比较长, ...

  4. springmvc+mybatis+maven项目框架搭建

    项目的目录

  5. SSM Spring+SpringMVC+mybatis+maven+mysql环境搭建

    SSM Spring+SpringMVC+mybatis+maven环境搭建 1.首先右键点击项目区空白处,选择new->other..在弹出框中输入maven,选择Maven Project. ...

  6. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  7. Maven项目整合SSH框架

    ---------------------siwuxie095                                         Maven 项目整合 SSH 框架         创建 ...

  8. Maven项目整合Struts2框架

    -------------------------siwuxie095                                 Maven 项目整合 Struts2 框架         1. ...

  9. spring Boot + MyBatis + Maven 项目,日志开启打印 sql

    在 spring Boot + MyBatis + Maven 项目中,日志开启打印 sql 的最简单方法,就是在文件 application.properties 中新增: logging.leve ...

  10. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构:   1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

随机推荐

  1. C++源码中司空见惯的PIMPL是什么?

    前言: C++源码中司空见惯的PIMPL是什么?用原始指针.std::unique_ptr和std::shared_ptr指向Implementation,会有什么不同?优缺点是什么?读完这篇文章,相 ...

  2. Nuxt3 使用animate.css来实现页面切换过渡效果

    首先,如果两个page分别在不同的layout下,是无法使用pageTransition来实现切换效果的,这时候需要使用layoutTransition来实现切换效果 这里采用npm package的 ...

  3. ES6中的Set数据结构

    Set是ES6新推出的数据结构,Set结构里面的每个元素都是唯一的: 如何创建一个Set? // Set 构造函数接收一个数组进行初始化;如果什么都不传则创建一个空Set; var set = new ...

  4. Angular 18+ 高级教程 – Angular 的局限和 Github Issues

    前言 Angular 绝对有很多缺陷,Issue 非常多,workaround 非常多. 我以前至少有 subscribe 超过 20 个 Issues,几年都没有 right way 处理的. An ...

  5. Spring —— 注解开发(总结)

    XML配置与注解配置对比   

  6. 加入 Flutter Engage,Pick 您的专属 Dash 形象!

    Flutter Engage 活动精彩来袭 对 Flutter 团队的开发者们来说,交流的重要性不言而喻,和您一样,我们也希望开发者们能够在不同的情境下进行互动分享.于是我们为您准备了一场特别的线上活 ...

  7. 【赵渝强老师】Kubernetes的探针

    Kubernetes提供了探针(Probe)对容器的健康性进行检测.实际上我们不仅仅要对容器进行健康检测,还要对容器内布置的应用进行健康性检测. Probe有以下两种类型: livenessProbe ...

  8. 【赵渝强老师】MySQL的闪回

    MySQL DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至 ...

  9. 【赵渝强老师】什么是PL/SQL?

    一.什么是PL/SQL? PL/SQL(Procedure Language/SQL)是oracle在标准的sql语言上的扩展.ql/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许私用条件语 ...

  10. CSharp的lambda表达式的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...