文档章节

基础工具类

architect刘源源
 architect刘源源
发布于 06/17 00:46
字数 978
阅读 129
收藏 0
package com.atguigu.util;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;
/**
 * 获取连接和释放连接的工具类
 * @author yuanyuan liu
 *
 */
public class JDBCUtils {
	private static DataSource dataSource;//多态 
	
	/**
	 * ThreadLocal
	 * 		get()
	 * 		set()
	 *      remove()
	 */
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();//保证一个事务中用的是同一个连接
	
	static {
		//指向需要一个数据源对象,所以写到静态块里了
		try {
			//1、读取druip.properties文件
			Properties pro = new Properties();
			pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
			
			//2、连接连接池
			dataSource = DruidDataSourceFactory.createDataSource(pro);//通过Druid工厂创建数据源对象
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//获取连接
	public static Connection getConnection() {
		Connection connection = threadLocal.get();
		try {
			if(connection == null) {//已经有了连接,就直接return connection 若没有连接,才创建新连接
				connection = dataSource.getConnection();
				threadLocal.set(connection);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}
//	public static Connection getConnection() {
//		Connection connection = null;
//		try {
//			connection = dataSource.getConnection();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//		return connection;
//	}

	//释放连接
	public static void releaseConnection() {
		Connection connection = threadLocal.get();
		if(connection != null) {//说明有连接未关闭
			try {
				connection.close();
				threadLocal.remove();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
//	public static void releaseConnection(Connection connection) {
//		if(connection != null) {
//			try {
//				connection.close();
//			} catch (SQLException e) {
//				e.printStackTrace();
//			}
//		}
//	}
}
package com.atguigu.servlet;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BaseServlet
 */
public class BaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//登录   ||  注册
		String method = request.getParameter("method");
		try {
			//使用反射通过方法名动态获取方法对象,
			//Open Declaration Method java.lang.Class.getDeclaredMethod(String name, Class<?>... parameterTypes) 
			//throws NoSuchMethodException, SecurityException
			Method method2 = this.getClass().getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class);
			//从而执行该方法
			//Open Declaration Object java.lang.reflect.Method.invoke(Object obj, Object... args) 
           //throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
		    /**
		     * 这个this指的是哪个类的对象?这的是BookServlet类的对象,比如说图书管理界面增删改查图书,BookServlet?method=getBooksByPage
		     * 这个BookServlet extends BaseServlet的,这个方法是BookServlet里的getBooksByPage方法,所以this指代BookServlet这个类的类模板
		     */
			method2.invoke(this, request,response);
			
		} catch (Exception e) {
//			e.printStackTrace();
			throw new RuntimeException(e);
		}
		
//		if("login".equals(method)) {
//			//登录
//			login(request, response);
//		}else if("regist".equals(method)) {
//			//注册
//			regist(request, response);
//		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.atguigu.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.catalina.tribes.util.Arrays;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.atguigu.util.JDBCUtils;


/**
 * 定义一个用来被继承的对数据库进行基本操作的Dao
 * 
 * @author Chunsheng Zhang
 *
 * @param <T>
 */
public class BaseDao<T> {
	//这个是dbutils的操作数据库的对象
	private QueryRunner queryRunner = new QueryRunner();
	//定义一个变量来接收泛型的类型
	//T.class和Class<T>有什么区别呢????
	private Class<T> type;
	// 获取T的Class对象,获取泛型的类型,泛型是在被子类继承时才确定
	public BaseDao() {
		//获取子类的类型
		Class clazz = this.getClass();
		System.out.println(this);//com.atguigu.dao.impl.BookDaoImpl@37dd134e
		//获取父类的类型
		//getGenericSuperclass()用来获取当前类的父类的类型
		//ParameterizedType表示的是带泛型的类型
		ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
		System.out.println(parameterizedType);//com.atguigu.dao.BaseDao<com.atguigu.bean.Book>
		//获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型
		//这个方法会返回一个Type的数组
		Type[] types = parameterizedType.getActualTypeArguments();
		System.out.println(Arrays.toString(types));//{class com.atguigu.bean.Book}
		//获取具体的泛型的类型·
		this.type = (Class<T>) types[0];
	}
	
	/**
	 * 通用的增删改操作
	 * 
	 * @param sql
	 * 		insert 
	 * 		delete
	 * 		update
	 * @param params
	 * @return
	 */
	public int update(String sql, Object... params) {
		// 获取连接
		Connection connection = JDBCUtils.getConnection();//这里获取连接
		int count = 0;
		try {
			count = queryRunner.update(connection, sql, params);
		} catch (SQLException e) {
//			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
//			JDBCUtils.releaseConnection(connection);
		}
		return count;
	}
	
	/**
	 * 通用的批处理增删改操作
	 * 
	 * @param sql
	 * 		insert 
	 * 		delete
	 * 		update
	 * @param params:二维数组
	 * 		一维:次数
	 * 		二维:参数
	 * 		
	 * @return
	 */
	public void batchUpdate(String sql, Object[][] params) {
		// 获取连接
		Connection connection = JDBCUtils.getConnection();
		try {
			queryRunner.batch(connection, sql, params);
		} catch (SQLException e) {
//			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
//			JDBCUtils.releaseConnection(connection);
		}
	}

	/**
	 * 获取一个对象
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public T getBean(String sql, Object... params) {
		// 获取连接
		Connection connection = JDBCUtils.getConnection();
		T t = null;
		try {
			t = queryRunner.query(connection, sql, new BeanHandler<T>(type),
					params);
		} catch (SQLException e) {
//			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
//			JDBCUtils.releaseConnection(connection);
		}
		return t;
	}

	/**
	 * 获取所有对象
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<T> getBeanList(String sql, Object... params) {
		// 获取连接
		Connection connection = JDBCUtils.getConnection();
		List<T> list = null;
		try {
			list = queryRunner.query(connection, sql, new BeanListHandler<T>(
					type), params);
		} catch (SQLException e) {
//			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
//			JDBCUtils.releaseConnection(connection);
		}
		return list;
	}
	
	/**
	 * 获取单个值   
	 * @param sql :select count(*) from books
	 * @param params
	 * @return
	 */
	public Object getSingeValue(String sql, Object... params) {
		// 获取连接
		Connection connection = JDBCUtils.getConnection();
		Object o = null;
		try {
			o = queryRunner.query(connection, sql, new ScalarHandler<>(),
					params);
		} catch (SQLException e) {
//			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
//			JDBCUtils.releaseConnection(connection);
		}
		return o;
	}
	
}

 

© 著作权归作者所有

architect刘源源

architect刘源源

粉丝 164
博文 518
码字总数 922746
作品 0
浦东
程序员
私信 提问
Java 基础工具类--iceroot

iceroot是一个Java基础工具类,封装了很多有用的方法。基础工具类对于java代码的编写是非常必要的,然而很多常见的操作在很多第三方类库中并未提供,我们必须一遍又一遍的重新编写。具有以下特...

iceroot
2017/03/07
688
0
Xss 跨站脚本测试平台--XssAPP

XssAPP 是一个专业的 XSS 渗透测试平台。 平台简介 用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。...

Coody
2017/02/07
550
0
从0开始写JavaWeb框架系列(2)从0开始写SamrtFrameWork:开发一个类加载器

一、开发一个类加载器来加载基础包名下的所有类,如使用了某注解的类,或者实现了某接口的类,又或者继承了某父类的所有子类(编写一个工具类,四个注解类) 1.1、需要写一个ClassUtil工具类,...

AAASSSSddd
2016/05/27
55
0
Arale 2.0 支付宝公司的新一代前端基础类库

Arale 2.0 的整体内容包括四部分: Infrastructure(基础架构)。包括 seajs, events, class, base 和 widget 模块。这是整个类库的基础,能从底层让代码的书写规范、组件的构建方式、模块的...

夜聆风
2012/07/08
0
2
java多线程系列:CountDownLatch

这篇文章将介绍CountDownLatch这个同步工具类的基本信息以及通过案例来介绍如何使用这个工具。 CountDownLatch是包下面的一个工具类,可以用来协调多个线程之间的同步,或者说起到线程之间的...

Mr_zebra
2018/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux的基本命令

目录的操作命令(增删改查) 增: mkdir 目录名称; 查: ls 可以看到该目录下的所有的目录和文件 ls -a,可以看到该目录下的所有文件和目录,包括隐藏的 ls -l,可以看到该目录下的所有目录和...

凹凸凸
今天
2
0
在古老unix中增加新用户

Installing 4.3 BSD Quasijarus on SIMH 目标:要在4.3BSD中新增加用户dmr,指定目录/home/dmr,uid为10 gid=31(guest组,系统已建立) 4.3BSD还没有adduser或useradd 直接修改/etc/passwd...

wangxuwei
今天
2
0
Bootstrap(六)表单样式

基本样式 所有设置了 .form-control 类的 <input>、<textarea> 和 <select> 元素都将被默认设置宽度属性为 width: 100%;。 将 label 元素和前面提到的控件包裹在 .form-group 中可以获得最好...

ZeroBit
昨天
3
0
SSL 证书格式转换

SSL 证书格式转换 不同服务器情况下,需要不同的证书格式。 比如 pem 转 pfx。 pem在window 平台下可以导入,但是无法正常使用。 需要转换成pfx。 推荐在线转换工具,由中国数字证书网站提供...

DrChenXX
昨天
2
0
HAProxy

xx

Canaan_
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部