您的位置:首页 > 编程语言 > Java开发

Spring Mybatis Maven 项目搭建(Java配置)

2016-10-11 07:56 525 查看
本文主要介绍 spring mybatis maven 项目的搭建,使用 java 方式配置。本文只贴出主要的代码,完成的代码请参考文末的 GitHub 地址。

实现的功能有:

Maven 管理整个应用的生命周期

spring 处理客户端请求

mybatis 作为持久层框架

alibaba druid 作为数据库连接池

mybatis generator 生成实体和 mapper

velocity 渲染视图

项目整体结构



整体项目结构是按照 maven 默认的结构组织的;

配置放在
org.acherie.demo.config
包下,web 配置放在
org.acherie.demo.web.config
包下;

mybatis generator 配置文件和 mybatis xml 放在
resources
文件夹下;

velocity 的配置放在 web 根目录(
webapp
)下的
WEB-INF/config
文件夹下;

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>

<groupId>org.acherie</groupId>
<artifactId>mybatis</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--  依赖版本  -->
<springframework.version>4.3.2.RELEASE</springframework.version>
<junit.version>4.12</junit.version>
<jackson.version>2.8.2</jackson.version>
<mysql.version>5.1.38</mysql.version>
<mybatis.version>3.4.1</mybatis.version>
<mybatis.spring.version>1.3.0</mybatis.spring.version>
<mapper.version>3.3.6</mapper.version>
<pagehelper.version>4.1.4</pagehelper.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${springframework.version}</version>
</dependency>
<!--spring-json依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>

<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- Mybatis Generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>

<!-- Test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.0.52-beta</version>
<scope>test</scope>
</dependency>

<!-- velocity -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
</dependencies>

<build>
<finalName>web</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>

<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<address>localhost</address>
<port>8080</port>
<path>/${project.artifactId}</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${mapper.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>


Web 应用入口

在 Servlet 2.5,整个 web 应用的入口为
web.xml
文件。因为使用了 Servlet 3.0,所以也就改成了 java 配置,而 java 配置的入口文件在本应用中为
WebInitialize
类。

package org.acherie.demo.config;

import org.acherie.demo.web.config.WebConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

/**
* 配置 Spring 根配置的 classes
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}

/**
* 配置 Spring DispatcherServlet 配置的 classes
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}

@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}


在该配置中,配置了根应用上下文(也就是
ContextLoaderListener
配置的应用上下文)和
DispatcherServlet
的应用上下文和对应的 URL 映射。

根应用上下文(RootConfig)

package org.acherie.demo.config;

import org.springframework.context.annotation.*;
import org.springframework.core.type.filter.RegexPatternTypeFilter;

import java.util.regex.Pattern;

@Configuration
@PropertySource("classpath:config.properties")
@ComponentScan(basePackages = {"org.acherie.demo"}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, value = RootConfig.WebPackage.class)
})
@Import(DataConfig.class)
public class RootConfig {

// 内部类,用来排除 web 相关的包,因为这些包已经在 WebConfig 中导入了
public static class WebPackage extends RegexPatternTypeFilter {
public WebPackage() {
super(Pattern.compile("org\\.acherie\\.web"));
}
}
}


该配置中定义了 spring 扫描的包,排除了 web 方面的包;导入了数据库的配置文件(
DataConfig.class
)。
DataConfig
配置如下:

package org.acherie.demo.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

// @MapperScan 设置 java mapper 扫描的包
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "org.acherie.demo.dao")
public class DataConfig {

@Autowired
public Environment env;

@Bean(initMethod = "init", destroyMethod = "close")
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
// 基本属性 url、user、password
dataSource.setDriverClassName(env.getProperty("jdbc.driverClass"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.password"));

// 配置初始化大小、最小、最大
dataSource.setInitialSize(1);
dataSource.setMinIdle(1);
dataSource.setMaxActive(20);

// 配置获取连接等待超时的时间
dataSource.setMaxWait(60000);

// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
dataSource.setTimeBetweenEvictionRunsMillis(60000);

// 配置一个连接在池中最小生存的时间,单位是毫秒
dataSource.setMinEvictableIdleTimeMillis(300000);

dataSource.setValidationQuery("SELECT 'X'");
dataSource.setTestWhileIdle(true);
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);

// 是否打开PSCache,并且指定每个连接上PSCache的大小
dataSource.setPoolPreparedStatements(false);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);

return dataSource;
}

@Bean
public SqlSessionFactory sqlSessionFactory(ApplicationContext applicationContext) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
// 设置 mapper xml
sessionFactory.setMapperLocations(applicationContext.getResources("classpath:mapper/**/*.xml"));
return sessionFactory.getObject();
}

@Bean
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
}


该配置文件配置了数据源,mybatis 的相关配置,事务管理

下面是数据库的配置文件,也就是
RootConfig.class
引入的那个文件:

# config.properties
# \u6570\u636E\u5E93\u914D\u7F6E
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/world
jdbc.user=root
jdbc.password=root

#c3p0
jdbc.maxPoolSize=50
jdbc.minPoolSize=10
jdbc.maxStatements=100
jdbc.testConnection=true

# \u901A\u7528Mapper\u914D\u7F6E
mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin
mapper.Mapper = tk.mybatis.mapper.common.Mapper

# mybatis generator
drive.class.path=E:/Maven/repository/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar

# 包路径配置
model.package=org.acherie.demo.model.generator
dao.package=org.acherie.demo.dao.generator
xml.mapper.package=org.acherie.demo.dao.generator

target.project=src/main/java
xml.target.project=src/main/resources


Spring MVC 配置

package org.acherie.demo.web.config;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
import org.springframework.web.servlet.view.velocity.VelocityViewResolver;

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

@Configuration
@EnableWebMvc
@ComponentScan("org.acherie.demo.web")
public class WebConfig extends WebMvcConfigurerAdapter {

// 配置 VelocityViewResolver。因为 velocity 从2007年就未更新,所以 spring 从 4.3
// 版本开始不赞成使用 velocity,推荐使用 FreeMarker
@Bean
public ViewResolver viewResolver() {
VelocityViewResolver resolver = new VelocityViewResolver();
resolver.setContentType("text/html;charset=UTF-8");
resolver.setPrefix("/views/");
resolver.setSuffix(".html");
resolver.setToolboxConfigLocation("/WEB-INF/config/velocity-toolbox.xml");
return resolver;
}

// Velocity 的配置
@Bean
public VelocityConfigurer velocityConfigurer(ApplicationContext context) {
VelocityConfigurer velocityConfigurer = new VelocityConfigurer();
velocityConfigurer.setResourceLoaderPath("/");

Map<String, Object> velocityPropertiesMap = new HashMap<>();
velocityPropertiesMap.put("input.encoding", "UTF-8");
velocityPropertiesMap.put("output.encoding", "UTF-8");
velocityConfigurer.setVelocityPropertiesMap(velocityPropertiesMap);

velocityConfigurer.setConfigLocation(context.getResource("/WEB-INF/config/velocity.properties"));
return velocityConfigurer;
}

// 开启默认 Servlet 的支持,可用于处理静态文件
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

// 配置 HttpMessageConverter,可配置多个自定义的 HttpMessageConverter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jacksonConverter());
}

// 配置自定义的 MappingJackson2HttpMessageConverter,用于处理 application/json 类型的 mediaType,
// 并添加了 application/xml 转 json 的支持
@Bean
public MappingJackson2HttpMessageConverter jacksonConverter() {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.APPLICATION_XML);

MappingJackson2HttpMessageConverter converter =
new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(mediaTypes);
return converter;
}
}


这个 java 文件配置了很多东西,具体请参考以前的博文或其他相关的资料。

Velocity 配置文件和 velocity tool 配置 xml:

directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 1

input.encoding=UTF-8
output.encoding=UTF-8
default.contentType=text/html; charset\=UTF-8

#velocimacro.library = webpage/ctcshop/macro.html,webpage/ctcshop/paginate.html,webpage/ctcshop/paginate2.html
#velocimacro.library.autoreload =true


<?xml version="1.0" encoding="UTF-8"?>
<toolbox>
<tool>
<key>date</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.DateTool</class>
<parameter name="format" value="yyyy-MM-dd" />
</tool>
<tool>
<key>number</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.NumberTool</class>
</tool>
<tool>
<key>math</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.MathTool</class>
</tool>
<tool>
<key>esc</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.EscapeTool</class>
</tool>
</toolbox>


运行

使用 maven 的 tomcat插件运行应用,为了每次能使用缩写运行 tomcat,需要在 maven 的
settings.xml
中加入如下内容:

<settings>
...
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
<pluginGroup>org.apache.tomcat.maven</pluginGroup>
</pluginGroups>
...
</settings>


然后使用如下命令启动 tomcat:

tomcat7:run


浏览器输入
http://localhost:8080/mybatis
,出现如下界面:



运行成功。。。

总结

本文并没有把整个项目的代码完整的贴出来,需要查看完整代码的童鞋,可以移步 github 地址。

GitHub:https://github.com/acherie/spring-mybatis-maven

参考

Maven:Welcome to Apache Maven

Mybatis:mybatis - MyBatis 3 | Introduction
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mybatis
相关文章推荐