数据库连接池
数据库连接池用c3p0-0.9.1.2.jar包,通过配置文件的方式来维护数据库连接信息。在类路径下新建c3p0-config.xml文件,内容如下:
root
123456789
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8
5
5
5
20
20
5
JdbcUtils类
该类主要用来加载c3p0数据源属性,获取connection及释放connection。
/**
* 获取数据库连接,及sql语句
*@author逍遥居士
*@versionV 1.0
*/
publicclassJdbcUtils {
privatestaticDataSourcedataSource=null;
static{
//加载c3p0数据源
dataSource=newComboPooledDataSource("shiro");
}
/**
* 返回、connection
*
*@return
*@throwsSQLException
*/
publicstaticConnection getConnection()throwsSQLException {
returndataSource.getConnection();
}
/**
* 根据sql语句名获取具体的sql语句命令
*
*@paramname
*@return
*/
publicstaticString getSql(Stringname) {
Mapsqls=null;
try{
sqls= QueryLoader.instance().load("/sql.properties");
returnsqls.get(name);
}catch(IOExceptione) {
e.printStackTrace();
}
returnnull;
}
/**
* 释放连接资源
*
*@paramconnection
*/
publicstaticvoidrealseDb(Connectionconnection) {
if(connection!=null) {
try{
connection.close();
}catch(SQLExceptione) {
e.printStackTrace();
}
}
}
publicstaticvoidrelase(ResultSetreslutSet,Statementsatement) {
if(reslutSet!=null) {
try{
reslutSet.close();
}catch(SQLExceptione) {
e.printStackTrace();
}
}
if(satement!=null) {
try{
satement.close();
}catch(SQLExceptione) {
e.printStackTrace();
}
}
}
}
JDBCDao 接口
Dao定义 Dao 的基本操作,由BaseDao提供实现。
/**
*Dao接口, 定义Dao的基本操作, 由 BaseDao 提供实现.
*
*@param:
*Dao实际操作的泛型类型
*@author逍遥居士
*@versionV 1.0
*/
publicinterfaceDAO {
/**
* 执行 INSERT 操作, 返回插入后的记录的 ID
*
*@paramsql:
* 待执行的 SQL 语句
*@paramargs:
* 填充占位符的可变参数
*@return: 插入新记录的 id
*/
intinsert(Stringsql, Object...args);
/**
* 执行 UPDATE 操作, 包括 INSERT(但没有返回值), UPDATE, DELETE
*
*@paramsql:
* 待执行的 SQL 语句
*@paramargs:
* 填充占位符的可变参数
*/
booleanupdate(Stringsql, Object...args);
/**
* 执行单条记录的查询操作, 返回与记录对应的类的一个对象
*
*@paramsql:
* 待执行的 SQL 语句
*@paramargs:
* 填充占位符的可变参数
*@return: 与记录对应的类的一个对象
*/
T query(Stringsql, Object...args);
/**
* 执行多条记录的查询操作, 返回与记录对应的类的一个 List
*
*@paramsql:
* 待执行的 SQL 语句
*@paramargs:
* 填充占位符的可变参数
*@return: 与记录对应的类的一个 List
*/
List queryForList(Stringsql, Object...args);
/**
* 执行一个属性或值的查询操作, 例如查询某一条记录的一个字段, 或查询某个统计信息, 返回要查询的值
*
*@paramsql:
* 待执行的 SQL 语句
*@paramargs:
* 填充占位符的可变参数
*@return: 执行一个属性或值的查询操作, 例如查询某一条记录的一个字段, 或查询某个统计信息, 返回要查询的值
*/
E getForValue(Stringsql, Object...args);
/**
* 执行批量更新操作
*
*@paramsql:
* 待执行的 SQL 语句
*@paramargs:
* 填充占位符的可变参数
*/
voidbatch(Stringsql, Object[]...args);
}
BaseDao泛型类
BaseDao实现DAO的方法。
/**
* 定义BaseDao泛型类
*
*@author逍遥居士
*@versionV 1.0
*
*@param
* 实际操作类型
*/
publicclassBaseDAOimplementsDAO {
privateQueryRunnerqueryRunner=newQueryRunner();
privateClasstype;
publicBaseDAO() {
type= ReflectionUtils.getSuperGenericType(getClass());
}
/**
* 返回一个具体的值
*
*@paramsql
*@paramargs
*@return
*/
public E getForValue(Stringsql, Object...args) {
Connectionconnection=null;
try{
connection= JdbcUtils.getConnection();
return(E)queryRunner.query(connection,sql,newScalarHandler<>(),args);
}catch(SQLExceptione) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
returnnull;
}
/**
* 返回多个对象
*
*@paramsql
*@paramargs
*@return
*/
publicList queryForList(Stringsql, Object...args) {
Connectionconnection=null;
try{
connection= JdbcUtils.getConnection();
returnqueryRunner.query(connection,sql,newBeanListHandler<>(type),args);
}catch(SQLExceptione) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
returnnull;
}
/**
* 返回一个对象
*
*@paramsql
*@paramargs
*@return
*/
publicT query(Stringsql, Object...args) {
Connectionconnection=null;
try{
connection= JdbcUtils.getConnection();
returnqueryRunner.query(connection,sql,newBeanHandler<>(type),args);
}catch(SQLExceptione) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
returnnull;
}
/**
* 增、删、改
*
*@paramsql
*@paramargs
*/
publicbooleanupdate(Stringsql, Object...args) {
Connectionconnection=null;
booleanflag=false;
try{
connection= JdbcUtils.getConnection();
queryRunner.update(connection,sql,args);
flag=true;
}catch(SQLExceptione) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
returnflag;
}
/**
* 根据插入的记录获取相应的主键值
*
*@paramsql
*@paramargs
*/
@Override
publicintinsert(Stringsql, Object...args) {
intid= 0;
Connectionconnection=null;
java.sql.PreparedStatementpreparedStatement=null;
ResultSetresultSet=null;
try{
connection= JdbcUtils.getConnection();
preparedStatement=connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
if(args!=null) {
for(inti= 0;i
preparedStatement.setObject(i+ 1,args[i]);
}
}
preparedStatement.executeUpdate();
resultSet=preparedStatement.getGeneratedKeys();
if(resultSet.next()) {
id=resultSet.getInt(1);
}
}catch(SQLExceptione) {
e.printStackTrace();
}finally{
JdbcUtils.relase(resultSet,preparedStatement);
}
returnid;
}
/**
* 批量处理
*
*@paramsql
*@paramargs
*/
@Override
publicvoidbatch(Stringsql, Object[]...args) {
Connectionconnection=null;
try{
connection= JdbcUtils.getConnection();
queryRunner.batch(connection,sql,args);
}catch(SQLExceptione) {
e.printStackTrace();
}
}
}
具体业务DAO实现
根据不同的业务来定义需要的接口,例如维护用户信息(CRUD)的UserDao。
在数据持久层定义UserDao的实现类UserDaoImpl去继承BaseDao泛型类实现具体的UserDao。
在逻辑业务层去实例化UserDaoImpl,再调用相应的方法完成数据的CRUD。