一个人的生活,通常是要自己去努力,就算照搬了别人的生活形态,总有些东西,复制不了。不需要太操心别人的人生,过好自己的人生才是根本。了解世界上很多人的生命状态,可以借鉴、学习,找到适合自己的模式,就好。——萧秋水
开始前…
这章的主题是切入点,找到一个点我们慢慢展开,逐渐深入,没有一上来就讲新的东西的原因是:过去的使用经验同样重要,正是因为有了过去的经验,才会有更新更好的思路出现,新思路帮助我们改进提高。同样有了对比,才能更直观的感受到新的方案是否更快速,是否更好,哪些优缺点有明显的变化。简单不代表容易,只有动手实践,才能真正理解。
所以,这章内容是复习一下如何使用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