数据库连接池
数据库连接池用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。
public class JdbcUtils {
private static DataSource dataSource = null;
static {
//加载c3p0数据源
dataSource = new ComboPooledDataSource("shiro");
}
/**
* 返回、connection
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 根据sql 语句名获取具体的sql语句命令
*/
public static String getSql(String name) {
Map sqls = null;
try {
sqls = QueryLoader.instance().load("/sql.properties");
return sqls.get(name);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 释放连接资源
*/
public static void realseDb(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void relase(ResultSet reslutSet,Statement satement) {
if (reslutSet != null) {
try {
reslutSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (satement != null) {
try {
satement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC Dao 接口
Dao 定义 Dao 的基本操作, 由 BaseDao 提供实现。
/**
* Dao 接口, 定义 Dao 的基本操作, 由 BaseDao 提供实现.
*/
public interface DAO {
/**
* 执行 INSERT 操作, 返回插入后的记录的 ID
*/
int insert(String sql, Object... args);
/**
* 执行 UPDATE 操作, 包括 INSERT(但没有返回值), UPDATE, DELETE
*/
boolean update(String sql, Object... args);
/**
* 执行单条记录的查询操作, 返回与记录对应的类的一个对象
*/
T query(String sql, Object... args);
/**
* 执行多条记录的查询操作, 返回与记录对应的类的一个 List
*/
List queryForList(String sql, Object... args);
/**
* 执行一个属性或值的查询操作, 例如查询某一条记录的一个字段, 或查询某个统计信息, 返回要查询的值
*/
E getForValue(String sql, Object... args);
/**
* 执行批量更新操作
*/
void batch(String sql, Object[]... args);
}
BaseDao泛型类
BaseDao 实现DAO 的方法。
/**
* 定义BaseDao泛型类
* 实际操作类型
*/
public class BaseDAOimplements DAO {
private QueryRunner queryRunner = new QueryRunner();
private Class type;
public BaseDAO() {
type = ReflectionUtils.getSuperGenericType(getClass());
}
/**
* 返回一个具体的值
*/
public E getForValue(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return (E) queryRunner.query(connection, sql, new ScalarHandler<>(), args);
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return null;
}
/**
* 返回多个对象
*/
public List queryForList(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return queryRunner.query(connection, sql, new BeanListHandler<>(type), args);
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return null;
}
/**
* 返回一个对象
*/
public T query(String sql, Object... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
return queryRunner.query(connection, sql, new BeanHandler<>(type), args);
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return null;
}
/**
* 增、删、改
* @param sql
* @param args
*/
public boolean update(String sql, Object... args) {
Connection connection = null;
boolean flag = false;
try {
connection = JdbcUtils.getConnection();
queryRunner.update(connection, sql, args);
flag = true;
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcUtils.realseDb(connection);
}
return flag;
}
/**
* 根据插入的记录获取相应的主键值
* @param sql
* @param args
*/
@Override
public int insert(String sql, Object... args) {
int id = 0;
Connection connection = null;
java.sql.PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils.getConnection();
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
if (args != null) {
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
}
preparedStatement.executeUpdate();
resultSet = preparedStatement.getGeneratedKeys();
if (resultSet.next()) {
id = resultSet.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.relase(resultSet, preparedStatement);
}
return id;
}
/**
* 批量处理
* @param sql
* @param args
*/
@Override
public void batch(String sql, Object[]... args) {
Connection connection = null;
try {
connection = JdbcUtils.getConnection();
queryRunner.batch(connection, sql, args);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
具体业务DAO实现
根据不同的业务来定义需要的接口,例如维护用户信息(CRUD)的UserDao。
![e24ff6ed85d4a8f4df593847fb0fad95.png](https://i-blog.csdnimg.cn/blog_migrate/71dab6b668fbc6198b99e72eb4129b2c.jpeg)
在数据持久层定义UserDao的实现类UserDaoImpl去继承BaseDao泛型类实现具体的UserDao。
![9c0e827b422177c1c611e6ac5347e0ff.png](https://i-blog.csdnimg.cn/blog_migrate/ded39b3b70e93fb1921f60a4e739319b.jpeg)
在逻辑业务层去实例化UserDaoImpl,再调用相应的方法完成数据的CRUD。
![7e2da013d58ced125cc8600c54a7df1b.png](https://i-blog.csdnimg.cn/blog_migrate/f0d3fea8e219a051bc87703f0761632b.jpeg)