SSM整合
来源:互联网 发布:织梦cms本地安装教程 编辑:程序博客网 时间:2024/06/14 21:48
1.项目截图
2 整合Log4j
1 编写lo g4j属性文件
可以参考官方网站,也可以直接中网上下载后进行修改
log4j.properties文件
#log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILElog4j.rootLogger=DEBUG,CONSOLE,FILElog4j.addivity.org.apache=truelog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=INFO,ERROR、WARN、INFO、DEBUGlog4j.appender.CONSOLE.Target=System.outlog4j.appender.CONSOLE.Encoding=GBKlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nlog4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.DATABASE.URL=jdbc:mysql://192.168.7.103:3306/mysql?useUnicode=true&characterEncoding=UTF-8log4j.appender.DATABASE.driver=com.mysql.jdbc.Driverlog4j.appender.DATABASE.user=rootlog4j.appender.DATABASE.password=abc@123log4j.appender.DATABASE.Threshold=INFO,ERROR、WARN、INFO、DEBUGlog4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread, infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayoutlog4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nlog4j.appender.A1=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.A1.File=/Users/mark_lic/apps/tomcat/apache-tomcat-7.0.81/logs/SpringMVClog4j.appender.A1.Encoding=GBKlog4j.appender.A1.Threshold=INFO,ERROR、WARN、INFO、DEBUGlog4j.appender.A1.DatePattern='.'yyyy-MM-ddlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%nlog4j.appender.FILE=org.apache.log4j.FileAppenderlog4j.appender.FILE.File=/Users/mark_lic/apps/tomcat/apache-tomcat-7.0.81/logs/SpringMVC/file.loglog4j.appender.FILE.Append=falselog4j.appender.FILE.Encoding=GBKlog4j.appender.FILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nlog4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppenderlog4j.appender.ROLLING_FILE.Threshold=INFO,ERROR、WARN、INFO、DEBUGlog4j.appender.ROLLING_FILE.File=rolling.loglog4j.appender.ROLLING_FILE.Append=truelog4j.appender.CONSOLE_FILE.Encoding=GBKlog4j.appender.ROLLING_FILE.MaxFileSize=10KBlog4j.appender.ROLLING_FILE.MaxBackupIndex=1log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nlog4j.appender.im = net.cybercorlin.util.logger.appender.IMAppenderlog4j.appender.im.host = mail.cybercorlin.netlog4j.appender.im.username = usernamelog4j.appender.im.password = passwordlog4j.appender.im.recipient = corlin@cybercorlin.netlog4j.appender.im.layout=org.apache.log4j.PatternLayoutlog4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%nlog4j.appender.SOCKET=org.apache.log4j.RollingFileAppenderlog4j.appender.SOCKET.RemoteHost=localhostlog4j.appender.SOCKET.Port=5001log4j.appender.SOCKET.LocationInfo=truelog4j.appender.SOCKET.layout=org.apache.log4j.PatternLayoutlog4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%nlog4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appenderlog4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000log4j.appender.MAIL=org.apache.log4j.net.SMTPAppenderlog4j.appender.MAIL.Threshold=INFO,ERROR、WARN、INFO、DEBUGlog4j.appender.MAIL.BufferSize=10log4j.appender.MAIL.From=web@www.wuset.comlog4j.appender.MAIL.SMTPHost=www.wusetu.comlog4j.appender.MAIL.Subject=Log4J Messagelog4j.appender.MAIL.To=web@www.wusetu.comlog4j.appender.MAIL.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n# File 输出 一天一个文件,输出路径可以定制,一般在根路径下log4j.appender.R=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.R.File=log.txtlog4j.appender.R.MaxFileSize=500KBlog4j.appender.R.MaxBackupIndex=10log4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
3.整合Myibatis
1编写Myibatis属性文件
该属性文件(myibatis.properties)中的属性配置取决你选择的数据库连接池,这里选择的是druid
jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://192.168.31.168:3306/mysql?useUnicode=true&characterEncoding=UTF-8jdbc.username=rootjdbc.password=abc@123jdbc.initialSize=2jdbc.maxActive=10jdbc.minIdle=0jdbc.maxWait=60000jdbc.validationQuery=SELECT 1jdbc.testOnBorrow=truejdbc.testOnReturn=truejdbc.testWhileIdle=truejdbc.timeBetweenEvictionRunsMillis=60000jdbc.minEvictableIdleTimeMillis=25200000jdbc.removeAbandoned=truejdbc.removeAbandonedTimeout=1800jdbc.logAbandoned=truejdbc.poolPreparedStatements=falsejdbc.maxPoolPreparedStatementPerConnectionSize=20jdbc.filters=stat,wall,log4jjdbc.defaultAutoCommit=true
2 配置数据源以及事务
myibatis-config.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:myibatis/myibatis.properties" /> </bean> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 初始化连接大小 --> <property name="initialSize" value="${jdbc.initialSize}" /> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="${jdbc.maxActive}" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="${jdbc.minIdle}" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${jdbc.maxWait}" /> <!-- 用来验证数据库连接的查询语句,这个查询语句必须是至少返回一条数据的SELECT语句 --> <property name="validationQuery" value="${jdbc.validationQuery}"></property> <!-- 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.建议设置为true 注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 --> <property name="testOnBorrow" value="${jdbc.testOnBorrow}" /> <!-- 指明是否在归还到池中前进行检验,建议设置为true 注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 --> <property name="testOnReturn" value="${jdbc.testOnReturn}" /> <!-- 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.建议设置为true 注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 --> <property name="testWhileIdle" value="${jdbc.testWhileIdle}" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.如果设置为非正数,则不运行空闲连接回收器线程--> <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒.连接在池中保持空闲而不被空闲连接回收器线程 (如果有)回收的最小时间值,单位毫秒 --> <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" /> <!-- 打开removeAbandoned功能 标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制. 如果设置为true, 连接被认为是被泄露并且可以被删除时,关闭数据库连接 false:如果空闲时间超过removeAbandonedTimeout. 关闭数据库连接 设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接.--> <property name="removeAbandoned" value="${jdbc.removeAbandoned}" /> <!-- 泄露的连接可以被删除的超时值, 单位秒.1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" /> <!-- 关闭abanded连接时输出错误日志 当Statement或连接被泄露时是否打印程序的stack traces日志。 被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,因为需要生成stack trace--> <property name="logAbandoned" value="${jdbc.logAbandoned}" /> <!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 --> <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" /> <!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 --> <property name="maxPoolPreparedStatementPerConnectionSize" value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" /> <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 --> <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}" /> <!-- 监控数据库 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall--> <property name="filters" value="${jdbc.filters}" /> <!-- 如果配置了proxyFilters,此配置可以不配置 druid.stat.mergeSql=true 合并执行的相同sql,避免因为参数不同而统计多条sql语句 druid.stat.slowSqlMillis=10000 用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢 --> <property name="connectionProperties" value="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=10000" /> <property name="proxyFilters"> <list> <ref bean="stat-filter" /> <ref bean="log-filter" /> </list> </property> </bean> <!-- 慢SQL记录--> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <property name="mergeSql" value="true" /> <property name="slowSqlMillis" value="10000" /> <property name="logSlowSql" value="true" /> </bean> <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <property name="resultSetLogEnabled" value="false" /> <property name="statementExecutableSqlLogEnable" value="true" /> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath*:com/mark/blog/mapping/*.xml"></property> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.mark.dao.impl" /> <!--该处采用的是byname注入SessionFactory,不涉及对象的创建 避免properties属性没有替换时,创建sqlSessionFactory 即避免dataSource中url,username等属性 not found--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- 配置druid监控spring jdbc --> <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" /> <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"> <property name="patterns"> <list> <value>com.mark.blog.service.impl.*</value> <value>com.mark.blog.dao.impl.*</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 事务传播特性配置 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="query*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置拦截service --> <aop:config> <aop:advisor advice-ref="transactionAdvice" pointcut="execution(* com.mark.blog.*impl.*.*(..))"/> </aop:config></beans>
3 整合Myibatis和druid
druid wiki:https://github.com/alibaba/druid/wiki
需要在web.xml中添加
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!--welcome pages--> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Spring和mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:myibatis/myibatis-config.xml</param-value> </context-param> <!-- druid --> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <init-param> <!-- 用户名 --> <param-name>loginUsername</param-name> <param-value>admin</param-value> </init-param> <init-param> <!-- 密码 --> <param-name>loginPassword</param-name> <param-value>admin</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping></web-app>
4 整合Spring Component
该步骤主要是扫描package下Spring conponent(Service,controller,dao)配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--启用spring的一些annotation --> <context:annotation-config/> <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --> <context:component-scan base-package="com.mark"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <context:component-scan base-package="com.mark"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <context:component-scan base-package="com.mark"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" /> </context:component-scan> <!--HandlerMapping 无需配置,springmvc可以默认启动--> <!--静态资源映射--> <!--本项目把静态资源放在了WEB-INF的statics目录下,资源映射如下--> <mvc:resources mapping="/css/**" location="/statics/css/"/> <mvc:resources mapping="/js/**" location="/statics/js/"/> <mvc:resources mapping="/image/**" location="/statics/image/"/> <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 --> <mvc:annotation-driven/> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP--> <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- --> <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/"/><!--设置JSP文件的目录位置--> <property name="suffix" value=".jsp"/> </bean></beans>
5 编写myibatis sqlmap xml
编写符合业务的sql(UserMapping.xml)
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace:必须与对应的接口全类名一致 id:必须与对应接口的某个对应的方法名一致 --><mapper namespace="com.mark.blog.entity.User"> <select id="getAllUser" resultType="com.mark.blog.entity.User"> select host,Db from db where Db = 'sys' </select></mapper>
6 编写各层实现逻辑
实体类(entity)
public class User { private String host; private String db; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getDb() { return db; } public void setDb(String db) { this.db = db; } @Override public String toString() { return "HOST: " + this.host + "DB: " + this.db; }}
Controller
@Controller@RequestMapping(value = "/")public class HelloController { private final static Log logger = LogFactory.getLog(HelloController.class); @Resource private IUserService userService; @RequestMapping(value = "hello.do") public String handlerHello() { logger.debug("Hello World" + userService.queryUser()); return "hello"; }}Service
public interface IUserService { public User queryUser();}@Service(value = "userService")public class UserServiceImpl implements IUserService { @Resource private IUserDao userDao; public User queryUser() { return userDao.queryUser(); }}DAO
BaseDao引入理由:
1.异常信息:
2.mybatis-spring-1.1.1没有问题,但是采用mybatis-spring-1.2.0+
运行出错:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
从SqlSessionDaoSupport 这个类的源码中可以看出,原因是mybatis-spring-1.2.0+
中取消了自动注入SqlSessionFactory 和 SqlSessionTemplate
解决方案:因为我们dao层是继承于一个dao基类,所以只要在这个基类中注入任意一个属性即可。SqlSessionFactory在spring配置文件中已经配置。
public class BaseDao extends SqlSessionDaoSupport { @Resource public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){ super.setSqlSessionFactory(sqlSessionFactory); }}
public interface IUserDao { public User queryUser();}@Repository(value = "userDao")public class UserDaoImpl extends BaseDao implements IUserDao { public User queryUser() { return getSqlSession().selectOne("getAllUser"); }}
7 编写JSP页面
<html><body><h2>Hello World!</h2><form method="get" action="hello.do"> <input type="submit" value="Submit"/></form></body></html>
8.测试是否OK
1 查看日志
启动tomcat查看日志
...... DEBUG com.mark.blog.controller.HelloController - Hello WorldHOST: localhostDB: sys
2.查看Druid
在浏览器中输入http://IP:Port/druid/weburi.html
项目源码下载
阅读全文
0 0
- SSM整合
- SSM整合
- SSM整合
- ssm整合
- SSM整合
- ssm整合
- ssm整合
- SSM整合
- SSM整合
- SSM整合
- SSM整合
- ssm整合
- ssm整合
- ssm整合
- ssm整合
- ssm整合
- ssm整合
- ssm整合
- 1124. Raffle for Weibo Followers (20)
- 195. Tenth Line。
- IntelliJ Idea Pycharm PhpStrom WebStrom Clion 2017 免费激活方法
- 485_Max_Consecutive_Ones_Easy.c
- visual studio 2017使用技巧
- SSM整合
- 2018年搜狗秋招前端笔试题:字符串删除
- CodeForces
- CSS经典布局-圣杯布局和双飞翼布局对比
- epoll模型
- [leetcode]解决Majority Element的一点小心得
- visual studio 2017搭建linux c++开发环境
- 1125. Chain the Ropes (25)
- 构造函数(构造器)