JDBC(三)
1、BasicDao
Druid+DbUtils的方式仍有不足,sql是固定的,select操作结果集返回类型也是固定的
data access object(数据访问对象),每个表有一个通用的增删改查方法xxxDao,将多个表的xxxDao再封装成一个基础的Dao,就叫basicDao,或者叫baseDao
2、总结
导入jar包
- mysql-connector-java
- druid
- commons-dbutils
**配置properties文件
#驱动加载
driverClassName=com.mysql.jdbc.Driver
#注册驱动
url=jdbc:mysql://127.0.0.1:3306/db_name?characterEncoding=utf-8
#连接数据库的用户名
username=root
#连接数据库的密码
password=1234
#初始化时池中建立的物理连接个数。
initialSize=2
#最大的可活跃的连接池数量
maxActive=30
#获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
maxWait=60000
注:参数后面不要有空格!不要有空格!
最终的工具类JdbcUtils
public class JdbcUtils {
// 1、导入druid.jar包
// 2、在druid.properties文件中编写好配置
private static DataSource dataSource;
// 3、静态代码块在类加载时执行,且只执行一次
static {
// 创建properties对象,读取配置
Properties properties = new Properties();
try {
// Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
// properties.load(new FileInputStream("D:\\Users\\Documents\\eclipse-workspace\\bookmanage\\src\\druid.properties"));
properties.load(JdbcUtils.class.getResourceAsStream("/druid.properties"));
// 创建Druid连接池
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从数据库连接池中获取连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* close是把connection连接对象放回到连接池中
* @param connection
* @param statement
* @param resultSet
*/
// public static void closeResource(Connection connection, Statement statement, ResultSet resultSet) {
// DbUtils.closeQuietly(connection);
// DbUtils.closeQuietly(statement);
// DbUtils.closeQuietly(resultSet);
// }
/**
* 关闭连接
* @param connection
*/
public static void close() {
DbUtils.closeQuietly(connection);
}
}
所有DAO的父类BaseDao
public abstract class BaseDao<T> {
private QueryRunner queryRunner = new QueryRunner();
/**
* 通用增删改方法
*
* @param sql
* @param params
* @return
*/
public int update(Connection connection, String sql, Object... params) {
try {
int update = queryRunner.update(connection, sql, params);
return update;
} catch (SQLException e) {
// 这里将编译异常转换为运行异常,抛出。调用者可以捕获也可以不捕获,采用默认的处理方式
throw new RuntimeException(e);
}
}
/**
* 通用的查询方法,返回多行
*
* @param sql
* @param clz
* @param params
* @return
*/
public List<T> getList(Connection connection, String sql, Class<T> clz, Object... params) {
try {
List<T> list = queryRunner.query(connection, sql, new BeanListHandler<T>(clz), params);
return list;
} catch (SQLException e) {
// 这里将编译异常转换为运行异常,抛出。调用者可以捕获也可以不捕获,采用默认的处理方式
throw new RuntimeException(e);
}
}
/**
* 通用的查询方法,返回单行
*
* @param sql
* @param clz
* @param params
* @return
*/
public T getOne(Connection connection, String sql, Class<T> clz, Object... params) {
try {
T t = queryRunner.query(connection, sql, new BeanHandler<T>(clz), params);
return t;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通用的查询方法,返回单行单列(即单值)
* * @param sql
* @param params
* @return
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public Object getScalar(Connection connection, String sql, Object... params) {
try {
return queryRunner.query(connection, sql, new ScalarHandler(), params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}