项目结构:
1.新建Maven web_app项目,名为xxx_druid,在pom.xml中引入druid-1.2.8和mysql-connector-8.0.28以及相关依赖。
pom.xml相关依赖:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--JDBC数据源的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.16</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<!--数据库驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
2.编写Major实体类,MajorDao接口及声明增删查改的方法。
Major:
package cn.com.sise.pojo;
import java.util.Map;
/**
* 专业类
*/
public class Major{
private String major_id;//专业ID
private String major_name;//专业
private Integer tuition;//学费
private Integer dept_id;//系别ID
private Map<String,String> classs;//班级集合属性
//添加无参构造函数
public Major(){}
public Major(String major_id) {
this.major_id = major_id;
}
//添加有参构造函数
public Major(String major_id, String major_name, Integer tuition, Map<String,String> classs) {
this.major_id = major_id;
this.major_name = major_name;
this.tuition=tuition;
this.classs=classs;
}
//为属性提供setter和getter方法
public String getMajorId() {
return major_id;
}
public void setMajorId(String major_id) {
this.major_id = major_id;
}
public String getMajorName() {
return major_name;
}
public void setMajorName(String major_name) {
this.major_name = major_name;
}
public Integer getTuition() {
return tuition;
}
public void setTuition(Integer tuition) {
this.tuition = tuition;
}
public Integer getDeptId() {
return dept_id;
}
public void setDeptId(Integer dept_id) {
this.dept_id = dept_id;
}
public Map<?, ?> getClasss() {
return classs;
}
public void setClasss(Map<String,String> classs) {
this.classs = classs;
}
@Override
public String toString() {
return "Major{" +
"majorId='" + major_id + '\'' +
", majorName='" + major_name + '\'' +
", tuition=" + tuition +
", deptId=" + dept_id +
'}';
}
}
MajorDao:
package cn.com.sise.dao;
import cn.com.sise.pojo.Major;
import java.util.List;
public interface MajorDao {
public int addMajor(Major major);
public int updateMajor(Major major);
public int deleteMajor(int id);
public Major findMajorByMajorId(int id);
public List<Major> findAllMajors();
}
3.定义MajorDaoImpl实现类,运用使用JdbcTemplate方法实现对专业的增、删、查和改功能。
MajorDaoImpl:
package cn.com.sise.dao.impl;
import cn.com.sise.dao.MajorDao;
import cn.com.sise.pojo.Major;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
/*MajorDao的实现类*/
@Repository("MajorDao")
public class MajorDaoImpl implements MajorDao {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public int addMajor(Major major) {
//定义sql语句
String sql = "insert tb_major(major_id,major_name,tuition,dept_id) values(?,?,?,?)";
//存放sql语句的参数
Object[] params = new Object[]{
major.getMajorId(),
major.getMajorName(),
major.getTuition(),
major.getDeptId()
};
//执行sql语句,获取返回的结果
int row = this.jdbcTemplate.update(sql, params);
return row;
}
@Override
public int updateMajor(Major major) {
String sql = "update tb_major set major_name=?" + ",tuition=?" + ",dept_id=? where major_id=?";
Object[] params = new Object[]{
major.getMajorName(),
major.getTuition(),
major.getDeptId(),
major.getMajorId()
};
int row = this.jdbcTemplate.update(sql, params);
return row;
}
@Override
public int deleteMajor(int id) {
String sql = "delete from tb_major where major_id=?";
int row = this.jdbcTemplate.update(sql, id);
return row;
}
@Override
public Major findMajorByMajorId(int id) {
String sql="select * from tb_major where major_id=?";
/*
* 提供默认实现类 BeanPropertyRowMapper , javabean属性和表的字段必须一致
BeanPropertyRowMapper将结果集通过java的反射机制映射到java对象中
*/
RowMapper<Major> rowMapper = BeanPropertyRowMapper.newInstance(Major.class);
Major major = this.jdbcTemplate.queryForObject(sql, rowMapper, id);
return major;
}
@Override
public List<Major> findAllMajors() {
String sql="select * from tb_major";
RowMapper<Major> rowMapper=BeanPropertyRowMapper.newInstance(Major.class);
//使用query方法执行查询,并返回一个集合
List<Major> majorList=this.jdbcTemplate.query(sql,rowMapper);
return majorList;
}
}
4.在resource目录下创建数据库属性文件druid.properties,新建配置文件beans-druid.xml,配置数据源。
druid.properties:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/freshman?useUnicode=true&characterEncoding=utf-8&useSSL=true
username=root
password=123456
initialSize=3
maxActive=20
minIdle=1
beans-druid.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.com.sise "/>
<!-- 引入dbc.properties属性文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:druid.properties"/>
<!-- 数据源配置, 使用 Druid 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
<property name="driverClassName" value="${driverClassName}"/>
<!-- 基本属性 url、user、password -->
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<!-- 配置初始化大小、最小连接数、最大连接数 -->
<property name="initialSize" value="${initialSize}"/>
<property name="minIdle" value="${minIdle}"/>
<property name="maxActive" value="${maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000"/>
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat"/>
</bean>
<!-- 2配置Jdbc模板 -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 默认必须使用数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--将jdbcTemplate对象注入到MajorDao实现类中 -->
<bean id="majorDao" class="cn.com.sise.dao.impl.MajorDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
</beans>
5.在webapp目录下的web.xml中,配置druid自启动的监听器,新建test.jsp,获取spring容器内的实例majorDao,再新建对象调用查询方法。
web.xml:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans-druid.xml</param-value>
<!--<param-value>/ WEB-INF/applicationContext.xml</param-value>-->
</context-param>
<!--连接池启用Web监控统计功能start -->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<servlet>
<!-- 监控SQL情况 -->
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<!-- 允许用户清统计数据-->
<init-param>
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>test.jsp</welcome-file>
</welcome-file-list>
</web-app>
这里要注意过滤器、监听器以及servlet的放置位置,如果没有按照相应的位置放置,web-app根标签就会飘红,尽管有时候项目能够运行起来(大部分是部署工件出错),但是监听器就会失效,这个大家要注意。相关bug如下:
test.jsp:
<%--
Created by IntelliJ IDEA.
User: Chris
Date: 2022/4/1
Time: 17:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="cn.com.sise.*" %>
<%@ page import="org.springframework.context.ApplicationContext" %>
<%@ page import="org.springframework.context.support.ClassPathXmlApplicationContext" %>
<%@ page import="org.springframework.jdbc.core.JdbcTemplate" %>
<%@ page import="cn.com.sise.dao.MajorDao" %>
<%@ page import="cn.com.sise.pojo.Major" %>
<%@ page import="cn.com.sise.pojo.Major" %>
<%@ page import="java.util.List" %>
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ApplicationContext applicationContext= WebApplicationContextUtils.getWebApplicationContext(application);
assert applicationContext != null;
MajorDao majorDao= (MajorDao) applicationContext.getBean("majorDao");
List<Major> majors=majorDao.findAllMajors();
for(Major major:majors){
out.print(major+"\n");
}
%>
</body>
</html>
6.配置Tomcat,启动并运行项目,浏览test.jsp页面进行测试。
进行测试,没有问题。
接下来进入druid,看看监控是否生效。(用户名和密码在web.xml有设置,可自行更改。)
好的,成功进入。
接下来查看数据源,SQL、URI、Session监控是否生效。(因为只开启了这几项,后续有其他功能需要可查找druid文档在beans-druid.xml手动开启)
好的,druid到这里就使用成功了!