Spring Boot 实践折腾记(二):切入点,Spring MVC集成Mybatis的经典例子

13 篇文章 0 订阅
10 篇文章 0 订阅

一个人的生活,通常是要自己去努力,就算照搬了别人的生活形态,总有些东西,复制不了。不需要太操心别人的人生,过好自己的人生才是根本。了解世界上很多人的生命状态,可以借鉴、学习,找到适合自己的模式,就好。——萧秋水

开始前…

这章的主题是切入点,找到一个点我们慢慢展开,逐渐深入,没有一上来就讲新的东西的原因是:过去的使用经验同样重要,正是因为有了过去的经验,才会有更新更好的思路出现,新思路帮助我们改进提高。同样有了对比,才能更直观的感受到新的方案是否更快速,是否更好,哪些优缺点有明显的变化。简单不代表容易,只有动手实践,才能真正理解。

所以,这章内容是复习一下如何使用Spring MVC搭建一个常用的基于maven的web项目,并最终集成Mybatis使用MySQL数据库显示数据,而mysql,我采用docker镜像安装,不使用直接安装方式。

Windows
使用boot2docker,下载地址,版本:1.8.0(这个版本为最后版本,该项目后续就迁移到Docker ToolBox了,toolbox我下载了最新的1.11.2尝试,但是就是启动不了虚拟机,暂时不管,并不影响使用)

Linux
直接安装docker使用,详细可见:Ubuntu 16.04安装使用Docker

环境版本

jdk : 1.7.80 //第一章忘记写了,后续统一使用这个jdk版本
tomcat : 6.0.33 //因为父项目里有8.0.33的内嵌版本,用7.0.x版本启动似时校验jar包会报错,或者用8.0.33也可以
mysql : 5.5.45 
Spring MVC : 4.2.6.RELEASE
MyBatis : 3.2.5
mybatis-spring : 1.2.2
tomcat-jdbc : 7.0.52
mysql-connector-java : 5.1.39

docker运行mysql

docker pull mysql:5.5.45
docker run -d -p 3306:3306 mysql:5.5.45 -e MYSQL_ROOT_PASSWORD=123456

建立maven项目

包名: com.hjf.boot.demo.boot_mybatis_mvc

新增pom.xml

    <packaging>war</packaging>

    <properties>
        <jdbc.driver.version>5.1.39</jdbc.driver.version>
        <tomcat-jdbc.version>7.0.52</tomcat-jdbc.version>
        <mybatis.version>3.2.5</mybatis.version>
        <mybatis-spring.version>1.2.2</mybatis-spring.version>
    </properties>

    <dependencies>
         <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>
         <!-- connection pool -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>${tomcat-jdbc.version}</version>
            <scope>runtime</scope>
        </dependency>

        <!-- jdbc driver -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${jdbc.driver.version}</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
        <plugins>
            <!-- compiler插件, 设定JDK版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>

            <!-- war打包插件, 设定war包名称不带版本号 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <warName>mickjoust</warName>
                </configuration>
            </plugin>
        </plugins>
        </pluginManagement>
    </build>

变更为web项目

添加Web支持

首先在src/main/下新建webapp文件夹
idea中然后点击File–>Project Structure–>Modules—>boot-mybatis-mvc增加web项目支持,如图:

这里写图片描述

添加Spring上下文支持

在src/main/resources下新增applicationContext.xml和application.properties文件,并在WEB-INF/下增加spring-mvc.xml的mvc severlet配置文件

// applicationContext.xml

<!-- 使用annotation自动注册bean-->
    <context:component-scan base-package="com.hjf.boot.demo.boot_mybatis_mvc">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>
    <!--<aop:aspectj-autoproxy proxy-target-class="true" />-->

    <!-- 配置读取properties属性文件 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="fileEncoding" value="UTF-8" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="locations">
            <list>
                <value>classpath:/config/app.properties</value>
            </list>
        </property>
    </bean>

    <!-- 分开标示特定的bean  -->
    <import resource="classpath:/spring/app-config.xml" />

    <!-- MyBatis配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
        <property name="typeAliasesPackage" value="com.hjf.boot.demo.boot_mybatis_mvc.domain" />
        <!-- 显式指定Mapper文件位置 -->
        <property name="mapperLocations" value="classpath:/mybatis/*Mapper.xml" />
    </bean>
    <!-- 扫描basePackage下所有定义为 @Mapper 的接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.hjf.boot.demo.boot_mybatis_mvc" />
        <property name="annotationClass" value="com.hjf.boot.demo.boot_mybatis_mvc.dao.Mapper"/>
    </bean>

//profile配置较多,此处省略...
// application.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
jdbc.username=test
jdbc.password=123456
jdbc.pool.maxIdle=2
jdbc.pool.maxActive=5
// spring-mvc.xml

<!-- aop动态代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
             <!--将Jackson2HttpMessageConverter的默认格式化输出设为true -->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="prettyPrint" value="true"/>
            </bean>

        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- Velocity配置 -->
    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/WEB-INF/views/" />
        <property name="velocityProperties">
            <props>
                <prop key="input.encoding">UTF-8</prop>
                <prop key="output.encoding">UTF-8</prop>
                <prop key="contentType">text/html;charset=UTF-8</prop>
            </props>
        </property>
    </bean>

    <!-- Velocity视图解析器 -->
    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
        <property name="contentType" value="text/html;charset=UTF-8" />
        <property name="prefix" value="" />
        <property name="suffix" value=".vm" />
        <property name="order" value="0" />
        <property name="dateToolAttribute" value="dateTool" />
        <property name="numberToolAttribute" value="numberTool" />
        <property name="requestContextAttribute" value="rc" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
        <!--<property name="layoutUrl" value="/page/index.vm" />-->
    </bean>

    <!-- 容器默认的DefaultServletHandler,处理所有静态内容与无RequestMapping处理的URL-->   
    <mvc:default-servlet-handler />

    <!-- 静态资源配置 -->
    <mvc:resources location="/static/" mapping="/static/**" cache-period="864000" />

    <!-- bean -->
    <bean id="loginInterceptor" class="com.hjf.boot.demo.boot_mybatis_mvc.interceptor.LoginInterceptor" />

    <!-- 拦截器配置 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <mvc:exclude-mapping path="/favicon.ico" />
            <mvc:exclude-mapping path="/WEB-INF/views/error/**" />
            <ref bean="loginInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

同样点击File–>Project Structure–>Modules—>boot-mybatis-mvc增加spring支持,如图:

这里写图片描述

添加完spring支持后,velocity的配置使用,这里不做过多解释了,后续在单页应用实战中里专门说明。本文的重点还是,spring mvc和mybatis的配置。

建立静态文件夹

在src/main/webapp/WEB-INF/下新建静态文件夹static,拷贝bootstrap和jquery文件夹(本章只是导入静态文件夹,演示静态路径的配置,后续会对静态文件配置和视图层解析专门做boot的对比)

测试model

public class Info {

    private Long id;
    private String name;
    private Integer age;

    //省略get、set方法
}

自定义注解@Mapper

@Mapper这个注解是从Mybatis的3.4.0开始的,但在之前的版本里,我们如果要使用注解来注入mybatis的接口,要吗在config文件里自定义每个mapper,要吗就要自定义一个注解,并手动注入到mybatis里去:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Component
public @interface Mapper {
    String value() default "";
}

mybatis dao

@Mapper
public interface ShowDao {

    List<Info> findByAge(Integer age);
}

xml mapper

使用xml的方式,在src/main/resources/下新建mybatis/ShowDaoMapper.xml文件

<!-- namespace必须指向Dao接口 -->
<mapper namespace="com.hjf.boot.demo.boot_mybatis_mvc.dao.ShowDao">

    <select id="findByAge" parameterType="int" resultType="Info">
        SELECT
        id,
        name,
        age
        FROM info
        WHERE age = #{age}
    </select>

</mapper>

使用sql插入数据

使用如下sql语句在mysql里建库:test,然后插入测试数据。

CREATE TABLE `info` (
`id`  bigint NOT NULL AUTO_INCREMENT ,
`name`  varchar(255) NULL ,
`age`  int NULL ,
PRIMARY KEY (`id`)
);

INSERT INTO info (name,age) VALUES ('mick','20');
INSERT INTO info (name,age) VALUES ('mick1','20');
INSERT INTO info (name,age) VALUES ('mickjoust1','21');
INSERT INTO info (name,age) VALUES ('joust','22');

启动

查看主页:http://localhost:8080
查看数据库数据:http://localhost:8080/show

小结

本章篇幅配置的东西比较多,文中省略了部分代码,详细代码可在示例中查看。今天配置spring mvc 还是觉得很费事啊,各种配置,各种关联,但,切入点是很有必要的,后续大家用过spring boot后才能知道简化的优势和好处。本章关键点有:自定义注解(其实mybatis 3.4.0后,不需要自己写了,官方已经写了一个了)、spring mvc的servlet配置,spring context的配置,spring mvc的maven依赖,总结发现搭建一个项目,如果不熟悉的话,还是会花费很多时间的,就算有现成,建议大家多动手,自己操作,就会体会个中滋味。本章就此结束,至于什么原理架构,我个人更喜欢最后再去深入探讨,前面章节都会是实战,先行动着再说。


示例地址:boot-mybatis-mvc


page 160 of 366 in chapter 2016

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值