所需技术:spring、mybatis、druid、flyway、logback、nodejs、html、css3 ;
目标:创建一个业务框架,后端采用spring+mybatis,中间层采用node,前端html5,css3等;
工程建成后目录如下:
整合步骤:
1、创建maven工程,添加所有目标依赖;
2、创建spring目录,创建spring基础配置;
3、整合mybatis、durid、flyway;
4、整合logback工具;
5、添加测试类,测试通过,第一阶段完成;
一、创建soyann工程,添加项目依赖(IDEA)
1、创建一个新的工程soyann,添加business模块,目录结构如下;
2、添加所有模块所需要的依赖,补全pom.xml
4.0.0
com.soyann
Business
1.0-SNAPSHOT
war
Business Maven Webapp
http://maven.apache.org
1.2
4.12
1.1.2
5.1.39
1.7.21
1.1.0
3.4.1
1.1.7
4.2.0
1.2.33
4.3.0.RELEASE
5.0.3
3.4
1.2
1.3.0
1.0.3
1.8.6
3.3.1
1.3
1.0
junit
junit
${junit.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
jul-to-slf4j
${slf4j.version}
ch.qos.logback
logback-core
${logback.version}
ch.qos.logback
logback-classic
${logback.version}
org.slf4j
slf4j-api
commons-logging
commons-logging
${commons-logging.version}
org.logback-extensions
logback-ext-spring
0.1.4
org.apache.commons
commons-lang3
${commons-lang3.version}
org.apache.commons
commons-pool2
2.4.2
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.aspectj
aspectjweaver
${aspectj.version}
org.aspectj
aspectjrt
${aspectj.version}
asm
asm
${asm.version}
org.hamcrest
hamcrest-core
${hamcrest.version}
aopalliance
aopalliance
${aopalliance.version}
org.mybatis
mybatis-spring
${mybatis-spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis.generator
mybatis-generator-core
1.3.5
jar
test
org.mybatis.caches
mybatis-ehcache
${mybatis-ehcache.version}
com.github.pagehelper
pagehelper
${pagehelper.version}
org.flywaydb
flyway-core
${flywaydb.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
com.alibaba
fastjson
${fastjson.version}
jstl
jstl
${jstl.version}
taglibs
standard
${taglibs.version}
Business
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.5
mysql
mysql-connector-java
${mysql.version}
true
true
org.apache.maven.plugins
maven-compiler-plugin
1.6
二、创建spring配置项
1、创建spring-applicationContest.xml,作为spring配置的根文件。在添加其它模块前,创建一个根配置,作为各模块的公共配置项;
2、根配置的内容如下,后期随着添加各个模块,将会作相应的改动。
三、整合mybatis,druid,flyway工具
1、druid是阿里巴巴的数据库连接池。flyway为数据库版本管理工具。通过整合mybatis、druid及flyway,可以实现数据库查询后将数据持久化。接下来按顺序一个个文件添加进来。
2、添加spring-flyway.xml文件,配置如下:
这里需要注意的是,
3、添加jdbc.properties文件,配置如下:
#数据库驱动
jdbc.driver=com.mysql.jdbc.Driver
#数据库连接url
jdbc.url=jdbc:mysql://127.0.0.1:3306/soyann?relaxAutoCommit=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false
#数据库连接用户名
jdbc.username=root
#数据库连接密码
jdbc.password=AXUE+dhMhCrtVF1usq8EB7bv4kBhkv6n81KtiG9HRnPEoQjWsPax84mMFAQONb3ireEifDcFFxdRnrZYomc3pA==
#配置数据库密码是否需要解密,这里需要注意druid 1.0.16版本及以上的解密时需要同时配置publicKey,配置方式如下
druid.connectionProperties=config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALBt81XVN/W8vchTvUPwUD6NLk9LpwRRhY/+TQvkvM1hZIpzX1+SB1JLjcWcIwu4AkELau0pyjJ4LfC0LoOA/q0CAwEAAQ==
#配置初始化大小、最小、最大
druid.initialSize=10
#最小连接池数量
druid.minIdle=10
#最大连接池数量
druid.maxActive=50
#获取连接时最大等待时间,单位毫秒
druid.maxWait=5000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒,有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接;2) testWhileIdle的判断依据
druid.timeBetweenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis=300000
#验证语句
druid.validationQuery=SELECT 'x'
#检测连接是否有效的超时时间,单位:秒。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
druid.validationQueryTimeout=5
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
druid.testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
druid.testOnReturn=false
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
druid.testWhileIdle=true
#打开PSCache,并且指定每个连接上PSCache的大小,如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false
druid.poolPreparedStatements=false
druid.maxPoolPreparedStatementPerConnectionSize=100
#定期把监控数据输出到日志中
druid.timeBetweenLogStatsMillis=300000
#配置监控统计拦截的filters
druid.filters=config,stat,slf4j
#使用全局监控
druid.useGlobalDataSourceStat=true
#对于长时间不使用的连接强制关闭,禁用此配置,设置为false
druid.removeAbandoned=false
#超过30分钟开始关闭空闲连接
druid.removeAbandonedTimeout=1800
#将当前关闭动作记录到日志
druid.logAbandoned=true
这里采用了数据库连接密码加密功能,怎样生成连接加密下面再分解。
4、添加实体文件。在Resource根目录下,添加generatorConfig.xml配置,自动生成实体文件,内容如下:
接下来在idea中添加启动命令:
添加此配置的作用是自动生成数据表实体跟mapper文件,无须手写容易出错。运行命令,将生成的实体文件添加到对应目录下:
5、添加spring-mybatis.xml文件
com.soyann.business.*.service.*
com.soyann.business.*.mapper.*
添加文件后,发现还有点问题,spring-flyway.xml及spring-mybatis.xml不能相互调用,且往下。
6、更新spring-applicationContext.xml文件,引用spring-flyway.xml、spring-mybatis.xml、jdbc.properties配置
classpath:jdbc.properties
7、添加web.xml文件,配置数据库连接池等内容:
org.springframework.web.context.request.RequestContextListener
webAppRootKey
Business.root
DruidWebStatFilter
com.alibaba.druid.support.http.WebStatFilter
exclusions
*. js ,*. gif ,*. jpg ,*. png ,*. css ,*. ico ,/ druid /*
DruidWebStatFilter
/*
DruidStatView
com.alibaba.druid.support.http.StatViewServlet
DruidStatView
/druid/*
8、在IDEA工具中引入spring及web文件
四、整合logback工具
1、在resource目录下添加logback.xml,内容如下;
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n
UTF-8
ERROR
ACCEPT
DENY
${FILE_DIR}/%d{yyyy-MM-dd}/${FILE_NAME}_error.log
${maxHistory}
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
WARN
ACCEPT
DENY
${FILE_DIR}/%d{yyyy-MM-dd}/${FILE_NAME}_warn-log.log
${maxHistory}
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
${FILE_DIR}/${FILE_NAME}.log
${FILE_DIR}/${FILE_NAME}.%d{yyyyMMdd}.%i.log
50MB
30
%d{HH:mm:ss} [%thread] %-5level %logger{0} - %msg%n
UTF-8
INFO
${FILE_DIR}/${FILE_NAME}_debug.log
${FILE_DIR}/${FILE_NAME}_debug.%d{yyyyMMdd}.%i.log
50MB
30
%d{HH:mm:ss} [%thread] %-5level %logger{0} - %msg%n
UTF-8
DEBUG
ACCEPT
DENY
0
512
5000
TRACE
ACCEPT
DENY
${FILE_DIR}/%d{yyyy-MM-dd}/${FILE_NAME}_trace-log.log
${maxHistory}
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
2、web.xml中注册logback:
contextConfigLocation
classpath:spring/spring-applicationContext.xml
logbackConfigLocation
classpath:logback.xml
ch.qos.logback.ext.spring.web.LogbackConfigListener
org.springframework.web.context.ContextLoaderListener
到这里,spring+mybatis框架整合基本完成,下面就来测试下这个框架吧。
五、框架测试
1、resource/db/migration添加数据库脚本;这里我用了别人创建好的,不再贴代码;
2、在service目录下添加一个接口及实现类,代码如下:
IUserService.java
package com.soyann.business.user.service;
import com.soyann.business.user.model.UserEntity;
import java.util.List;
/**
* @ProjectName: soyann
* @FileName: com.soyann.business.user.service
* @Description: (do what)
* @Copyright: Copyright(C) 2016-2017 All rights Reserved
* @Company: ShenZhen Information Technology Co.,LTD.
* @Author: dell657 neil
* @Version V1.0
* @Date: 2017/10/28
*
* Modification History:
* Date Author Version Discription
* -----------------------------------------------------------------------------------
* 2017/10/28 neil 1.0 1.0
* Why & What is modified: <修改原因描述>
*/
public interface IUserService {
UserEntity getUserById(int userId);
List getAllUser();
}
UserServiceImpl.java
package com.soyann.business.user.service.impl;
import com.soyann.business.user.mapper.UserMapper;
import com.soyann.business.user.model.UserEntity;
import com.soyann.business.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @ProjectName: soyann
* @FileName: com.soyann.business.user.service.impl
* @Description: (do what)
* @Copyright: Copyright(C) 2016-2017 All rights Reserved
* @Company: ShenZhen Information Technology Co.,LTD.
* @Author: dell657 neil
* @Version V1.0
* @Date: 2017/10/28
*
* Modification History:
* Date Author Version Discription
* -----------------------------------------------------------------------------------
* 2017/10/28 neil 1.0 1.0
* Why & What is modified: <修改原因描述>
*/
@Service("userService")
public class UserServiceImpl implements IUserService {
@Autowired(required=false)
private UserMapper userMapper;
@Override
public UserEntity getUserById(int userId) {
return userMapper.selectByPrimaryKey(userId);
}
@Override
public List getAllUser() {
return userMapper.getAllUser();
}
}
3、在test目录下添加测试类TestMyBatis.java,代码如下:
package com.soyann.business.mybatis;
import com.alibaba.fastjson.JSON;
import com.soyann.business.user.model.UserEntity;
import com.soyann.business.user.service.IUserService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
/**
* @ProjectName: soyann
* @FileName: com.soyann.business.mybatis
* @Description: (do what)
* @Copyright: Copyright(C) 2016-2017 All rights Reserved
* @Company: ShenZhen Information Technology Co.,LTD.
* @Author: neil
* @Version V1.0
* @Date: 2017/10/28
*
* Modification History:
* Date Author Version Discription
* -----------------------------------------------------------------------------------
* 2017/10/28 neil 1.0 1.0
* Why & What is modified: <修改原因描述>
*/
//表示继承了SpringJUnit4ClassRunner类
/*@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/spring-applicationContext.xml"})*/
public class TestMyBatis {
private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class);
@Resource
private IUserService userService = null;
@Before
public void before() {
//使用"spring.xml"和"spring-mybatis.xml"这两个配置文件创建Spring上下文
ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"spring/spring-applicationContext.xml", "spring/spring-mybatis.xml"});
//从Spring容器中根据bean的id取出我们要使用的userService对象
userService = (IUserService) ac.getBean("userService");
}
@Test
public void test1() {
logger.info("任务开始执行...");
UserEntity userEntity = userService.getUserById(4);
// System.out.println(user.getUserName());
// logger.info("值:"+user.getUserName());
//System.out.println(JSON.toJSONString(userEntity));
logger.info(JSON.toJSONString(userEntity));
logger.info("任务执行结束");
logger.error("任务执行结束");
logger.debug("任务执行结束");
}
}
添加代码后,执行代码,查看控制台输出结果。
输出结果正确,证明本框架已经初步整合。本文到这里结束
参考资料:传送门