Spring+SpringMVC+MyBatis整合Druid之入门

Druid介绍

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,程序员可以通过定制来实现自己需要的功能。

Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化
首先,强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。
  • 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息。
  • SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
  • SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况。
  • 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。

其次,方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。

Druid内置提供了用于监控的StatFilter、日志输出的Log系列Filter、防御SQL注入攻击的WallFilter。

阿里巴巴内部实现了用于数据库密码加密的CirceFilter,以及和Web、Spring关联监控的DragoonStatFilter。

第三,Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

  • ExceptionSorter。当一个连接产生不可恢复的异常时,例如Oracle error_code_28 session has been killed,必须立刻从连接池中逐出,否则会产生大量错误。目前只有Druid和JBoss DataSource实现了ExceptionSorter。
  • PSCache内存占用优化对于支持游标的数据库(Oracle、SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL执行性能。一个PreparedStatement对应服务器一个游标,如果PreparedStatement被缓存起来重复执行,PreparedStatement没有被关闭,服务器端的游标就不会被关闭,性能提高非常显著。在类似“SELECT * FROM T WHERE ID = ?”这样的场景,性能可能是一个数量级的提升。但在Oracle JDBC Driver中,其他的数据库连接池(DBCP、JBossDataSource)会占用内存过多,极端情况可能大于1G。Druid调用OracleDriver提供管理PSCache内部API。
  • LRU是一个性能关键指标,特别Oracle,每个Connection对应数据库端的一个进程,如果数据库连接池遵从LRU,有助于数据库服务器优化,这是重要的指标。Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0则不是。BoneCP在mock环境下性能可能还好,但在真实环境中则就不好了。
Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。

简单SQL语句用时10微秒以内,复杂SQL用时30微秒。

通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
Druid的优势是在JDBC最低层进行拦截做判断,不会遗漏。

项目介绍(能跑起来就好)

创建一个登陆页面,输入username和password,如果和数据库对应,则跳转的success.jsp,否则跳转到error.jsp


此项目是在我以前的SSM整合的代码该的,所以项目名称有些对不上,根据你tomcat下的名称就好


Spring+SpringMVC+MyBatis整合Druid之入门_第1张图片

项目下载

点击打开链接下载项目代码


项目运行展示

http://localhost:8080/SSMMaven/druid/sql.html

Spring+SpringMVC+MyBatis整合Druid之入门_第2张图片



Spring+SpringMVC+MyBatis整合Druid之入门_第3张图片




搭建(Maven)项目

和Druid有关的配置:

web.xml(添加一个Filter和servlet)

修改pom.xml(添加Druid依赖)

修改Spring的配置文件applicationContext.xml中的dataSource


项目结构

Spring+SpringMVC+MyBatis整合Druid之入门_第4张图片

Spring+SpringMVC+MyBatis整合Druid之入门_第5张图片


修改pom.xml


	4.0.0
	com.imooc
	SSMMaven
	0.0.1-SNAPSHOT
	war


	
		UTF-8
		UTF-8
		1.8
	


	

		
		
			junit
			junit
			4.11
			test
		



		
		
		
			ch.qos.logback
			logback-classic
			1.1.1
		


		
		
			commons-io
			commons-io
			2.2
		



		
		
			taglibs
			standard
			1.1.2
		
		
			jstl
			jstl
			1.2
			compile
		
		
			javax.servlet
			javax.servlet-api
			3.1.0
			compile
		


		
		
			mysql
			mysql-connector-java
			5.1.39
		
		
		
			com.alibaba
			druid
			1.0.7
		

		

		
		
			org.springframework
			spring-core
			4.3.10.RELEASE
		
		
			org.springframework
			spring-beans
			4.3.10.RELEASE
		
		
			org.springframework
			spring-web
			4.3.10.RELEASE
		
		
			org.springframework
			spring-jdbc
			4.3.10.RELEASE
		





		
		
			org.springframework
			spring-webmvc
			4.3.10.RELEASE
		


		
		
			org.mybatis
			mybatis
			3.4.1
		


		
		
			org.mybatis
			mybatis-spring
			1.3.0
		

















	




添加Spring的配置文件




	
	

	
	

	
	
		
		
		
		

		
		
		
		
		
		
		
		

		
			SELECT 1
		
		
		
		

		
		
		
		

		
		
		
		
		
		

		
		
		
	


	
	
		
		
		
	

	
		
		
		
	


	
	
		
	



	
	











配置SpringMVC的配置文件



	

	
	












    
    














MyBatis的配置文件






	
	
		
	


	
		
	



数据库信息

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/text

jdbc.initPoolSize=5
jdbc.maxPoolSize=10
#...

修改web.xml





	SSMMaven
	
		index.jsp
	



	
	
		characterEncodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
		
			forceEncoding
			true
		
	
	
		characterEncodingFilter
		/*
	


	
	
		springDispatcherServlet
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:applicationContext-mvc.xml
		
		1
	
	
		springDispatcherServlet
		/
	







	
	
		contextConfigLocation
		classpath:applicationContext.xml
	
	
		org.springframework.web.context.ContextLoaderListener
	


  
	
		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/*
	













dao层

package com.imooc.dao;

public interface UserMapper {
	
	//传入username返回password
	String selectPassword(String username);

}

dao层的Mapper.xml









	
	






实体层

package com.imooc.entity;

public class User {
	private Integer id;
	private String username;
	private String password;

	public User() {
		super();
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}

	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param username
	 *            the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * @param password
	 *            the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}
}


控制层Controller

package com.imooc.handler;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.imooc.entity.User;
import com.imooc.service.UserService;

@Controller
public class LoginHandler {
	
	
	
	
	@Autowired
	private UserService userService;
	
	@RequestMapping("/login.action")
	public String login(User user){
		String password=userService.login(user.getUsername());
		if(!user.getPassword().equals(password)){
			return "error";
		}else{
			return "success";
		}
	}
	
	
	
	
	

	/**
	 * @return the userService
	 */
	public UserService getUserService() {
		return userService;
	}

	/**
	 * @param userService the userService to set
	 */
	public void setUserService(UserService userService) {
		this.userService = userService;
	}






	public LoginHandler() {
		System.out.println("------------->LoginController");
	}
	
	
	

}



service层

package com.imooc.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.imooc.dao.UserMapper;



@Service
public class UserService {
	
	@Autowired
	private UserMapper userDao;
	
	
	public String login(String username){
		return userDao.selectPassword(username);
	}
	
	
	
	
	

	public UserService() {
		super();
	}

	/**
	 * @return the userDao
	 */
	public UserMapper getUserDao() {
		return userDao;
	}

	/**
	 * @param userDao the userDao to set
	 */
	public void setUserDao(UserMapper userDao) {
		this.userDao = userDao;
	}
	
	
	

}


index.jsp登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



username
password


success.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Insert title here


success.jsp



error.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Insert title here


error.jsp




你可能感兴趣的:(Spring+SpringMVC+MyBatis整合Druid之入门)