Java十五 c3p0连接池连接数据库的具体,实现filter过滤器(2020.10.26)

filter过滤器

为什么要用filter过滤器
所有的页面和servlet请求时都要进行是否登录的判断,没有登录跳转回登录界面
在页面请求和响应时统一设置编码格式
所有的页面和servle请求时都要进行是否登录的判断,没有登录跳转回登录界面
可以借助jsp中的三大组件中的filter过滤器来完成

过滤器的实现原理
过滤器的实现原理
过滤器的使用
(1)创建一个类实现filter接口
EncodingFilter.java

package com.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter(urlPatterns = {"/*"})
public class EncodingFilter implements Filter{
}

(2)实现接口中的方法init初始化 doFilter主要方法体 destroy销毁方法

	public void destroy() {
	}
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		//向下还原
		HttpServletRequest hreq = (HttpServletRequest)req;
		HttpServletResponse hresp = (HttpServletResponse)resp;
		//设置编码字符集
		hreq.setCharacterEncoding("UTF-8");
		hresp.setCharacterEncoding("UTF-8");
		hresp.setContentType("text/html");
		//创建session对象用于判断session是否存在
		HttpSession session = hreq.getSession();
		//获取当前浏览器中访问的地址  web项目名/页面名
		String requestURI = hreq.getRequestURI();
		//获取当前应用和当前访问全路径  web项目名
		String contextPath = hreq.getContextPath();
		//获取当前访问页面或servlet名
		String page = requestURI.substring(contextPath.length());
		//判断是否是登录界面或者是否是登录的servlet tomcat设置不一样可以把/给去了
		//contains方法比较字符串是否一样
		if(page.contains("/Login.jsp")||page.contains("loginServlet")){
			//chain方法
			chain.doFilter(hreq, hresp);//过滤完成后,	继续向下一个过滤器或者servlet执行
		}else{
			//判断session是否为空  不为空代表有用户登录
			if (session.getAttribute("ename")!=null){
				//chain方法
				chain.doFilter(hreq, hresp);//过滤完成后,	继续向下一个过滤器或者servlet执行
			}else{
				//如果判断没有session跳转到登陆页面
				hresp.sendRedirect("Login.jsp");
			}
		}
	}
	public void init(FilterConfig arg0) throws ServletException {
	}

(3)需要进行过滤器的配置

// 默认filter名字跟类名一样  /*过滤所有方法
@WebFilter(urlPatterns = {"/*"})

首先记录一下普通数据库连接和连接池的区别以及连接池的好处

普通数据库连接:
数据库连接,连接时会消耗时间(100多毫秒),数据启动后使用过后,用户没有进行操作,数据会被闲置,连接会释放,如果再使用需要耗费时间进行连接
连接池:在连接池内部可以有多个数据库连接,当建立连接后,如果后续用户不使用连接,此连接会放置在连接池中,如果用户再次访问该数据库,直接从连接池中获取该数据库,不需要在访问数据库服务器。这样减少了对数据库服务器的请求,访问效率提高
进行之前先导包
c3p0-0.9.2.1.jar
commons-dbutils-1.7.jar
mchange-commons-java-0.2.3.4.jar
mysql-connector-java-5.1.15-bin.jar
自行上网百度 或者私聊我

1.设置c3p0数据池连接信息 同理可用jdbc.properties
c3p0-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <default-config>
        <!--default-config 表示默认配置-->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
         <!--//数据库名-->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/Test?useSSL=true</property>
         <!--//数据库账号-->
        <property name="user">root</property>
         <!--//数据库密码-->
        <property name="password">123456</property>
        <!--//初始化池的大小-->
        <property name="initialPoolSize">1</property>
        <!--//最小连接池数-->
        <property name="minPoolSize">2</property>
        <!--//池增量-->
        <property name="acquireIncrement">3</property>
        <!--//最大连接池数量-->
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

2.使用c3p0连接池 创建连接池对象ComboPooledDataSource 获取数据源 关流
DbUtils.java

package com.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class DbUtils {
    //创建连接池对象
    private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
    //获取数据库连接
    public static Connection getConn() throws SQLException {
        return comboPooledDataSource.getConnection();
    }
    //获取数据源
    public static DataSource getDataSources(){
        return comboPooledDataSource;
    }
    //关流
    public static void close(){
        if(comboPooledDataSource!=null) {
            comboPooledDataSource.close();
        }
    }
}

3.使用c390连接池 增删改 单查询 多查询
创建queryRunner对象传入数据源进行c3p0操作

//创建queryRunner对象进行操作
    QueryRunner qr = new QueryRunner(DbUtils.getDataSources());

单条数据查询

public Emp getEmpById(int eid) throws SQLException {
        String sql="select * from emp where eid=?";
        Object [] obj={eid};
        return qr.query(sql,new BeanHandler<Emp>(Emp.class),obj);
    }

多条数据查询

    public List<Dept> getAllDept() throws SQLException {
    	String sql="select * from dept";
        Object [] obj={};
        return qr.query(sql, new BeanListHandler<Dept>(Dept.class),obj);
    }

修改

    @Override
    public int editByid(Emp emp) throws SQLException {
        String sql="update emp set ename=?,eage=?,email=?,did=? where eid=?";
        Object [] obj={emp.getEname(),emp.getEage(),emp.getEmail(),emp.getDid(),emp.getEid()};
        return qr.execute(sql,obj);
    }

单查,多查和增删改区别:
query查询 返回是对象或者list集合
单查传参sql BeanHandler obj问号赋值
多查sql BeanListHandler obj问号赋值

excute增删改 返回值是int
excute(sql,obj传值)

c3p0连接数据库方法扩展

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中//重点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值