封装一个JDBC连接的工具类
并使用了读取工程下的JDBC.Properties文件,这样只需要修改文件中的信息,实现了代码的复用。
public class JDBCUitl2 {
private JDBCUitl2(){
}
private static Connection connection;
private static Properties properties;
private static Properties readFile() {
// 通过类加载器获取bin文件夹下的文件的字节流
InputStream is = JDBCUitl2.class.getClassLoader().getResourceAsStream("JDBC.Properties");
Properties properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
static {
// 只读一次文件
properties = readFile();
try {
Class.forName(properties.getProperty("driverClass"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("Registration driver failure");
}
}
public static Connection getConnection() {
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("connection failure");
}
return connection;
}
//关闭资源
public static void JDBCClose(Connection connection, java.sql.Statement statement, ResultSet rs) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
然后需要获取连接时 直接使用 JDBCUitl2.getConnection();就行了
commons-dbutils-1.6.jar(提供快速操作数据库方法)
- 三个核心类
- 1.DBUtils
- closeQuietly()
- 不用处理异常
- 2.QueryRunner
- 查询
- query(Connection conn, String sql, ResultSetHandler rsh, Object… params)
- 参数1:数据库的连接对象
- 参数2.sql语句
- 参数3.查询后得到的结果集(可以选用不同类型的结果)
- 参数4.替换sql的占位符
- 更新
- update(Connection conn, String sql, Object… params)
private static void fun1() throws SQLException {
// 插入
// 创建查询对象
QueryRunner queryRunner = new QueryRunner();
Connection conn = JDBCUitl2.getConnection();
String sql = "insert into sort values (null,?,?,?)";
// 创建一个数组
Object[] params = {"mac",20,"呜呜呜,百日做梦就完事了嗷"};
int row = queryRunner.update(conn, sql, params);
System.out.println(row);
DbUtils.closeQuietly(conn);
}
- 3.ResultSetHandler 提供八个结果集
- ArrayHandler
- ArrayListHandler ArrayListHandler 可在以返回多条记录 并且每条记录放在object[]中,然后把多条记录又放入list中 给你返回来
- BeanHandler 要封装的对象必须符合javabean规范
- BeanListHandler 返回保存好对象的list集合
- ColumnListHandler 默认返回第一列数据,可以传入参数(字段名)
- ScalarHandler 获取聚合函数类型 long型
- MapHandler
- MapListHandler
String sql = " select * from sort ";
QueryRunner queryRunner = new QueryRunner();
Connection conn = JDBCUitl2.getConnection();
/*
* 测试ArrayHandler
* 默认返回第一条数据
* 把该数据放入object数组中返回
*/
ArrayHandler rsh = new ArrayHandler();
System.out.println(rsh);
Object[] query = queryRunner.query(conn, sql, rsh);
for (Object object : query) {
System.out.println(object);
}
DbUtils.closeQuietly(conn);
commons-dbcp-1.4.jar包下
- 4.DataSource 数据源(数据库连接池)
- 查询时创建和销毁连接 耗费资源
- 使用数据库连接池 可以解决这个问题
- 查询时 会从数据库连接池中 找一个空闲的连接 去查询数据库
- 查询完毕后 不会销毁该连接 会重新放入连接池中 等待下一次使用
- java也提供了一套规范 来处理数据库连接池问题
- javax.sql.DataSource
- DBCP连接池
- C3P0连接池
今天我们这里使用的是DBCP连接池
public class DataSourceUtil {
// 创建连接池对象
private static BasicDataSource dataSource = new BasicDataSource();
// 使用静态代码块 对数据库连接池 进行设置
static {
// 基础设置
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/wljdbc01");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 扩展设置
// 初始化连接数
dataSource.setInitialSize(10);
// 设置最大连接数
dataSource.setMaxActive(10);
// 最大空闲连接数 最多空闲多少个连接 多余的会被系统销毁
dataSource.setMaxIdle(5);
// 设置最小空闲连接数 少于最小空闲 系统会帮你创建出连接
dataSource.setMinIdle(1);
}
private DataSourceUtil() {
}
// 获取数据库连接池的方法
public static DataSource getDataSource() {
return dataSource;
}
}
/*
* 测试DataSource工具类
*
* DBUtile中的QueryRunner 配合DataSource一起使用
*/
public class Demo05 {
public static void main(String[] args) throws SQLException {
QueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());
String sql = "select * from sort";
BeanListHandler<Sort> beanListHandler = new BeanListHandler<Sort>(Sort.class);
List<Sort> query = queryRunner.query(sql, beanListHandler);
for (Sort sort : query) {
System.out.println(sort);
}
}
}