JDBC工具類
commons-dbutils-1.6.jar
可以操作JDBC連接數據庫並且執行sql語句,處理返回的結果集
三個核心類:
1.DbUtils 關閉資源方法(安靜的關閉即不用異常處理)
2.QueryRunner 執行sql語句並且返回你想要的結果集
3.ResultSetHandler接口 參數(使用實現類 想要什麼結果集 就傳入什麼該接口的實現類)
QueryRunner
工具類
public class JDBCUtil {
private static String driverClass;
private static String url;
private static String user;
private static String password;
// 使用靜態代碼塊加載驅動 讀取配置文件
static {
// 使用系統類來讀取配置文件
ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
// 獲取文件中的數據
driverClass = rb.getString("driverClass");
url = rb.getString("url");
user = rb.getString("user");
password = rb.getString("password");
// 讓驅動類只加載一次
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 獲取數據庫連接的方法
public static Connection getConnection(){
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("連接失敗");
}
return connection;
}
// 關閉數據庫的方法 如果沒有結果集需要關閉 直接傳null就行
public static void closeAll(ResultSet resultSet, Statement statement, Connection connection) {
// 關閉資源前進行非空判斷防止空指針出現
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException("關閉失敗");
}
// 加快系統回收的速度
resultSet = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
throw new RuntimeException("關閉失敗");
}
statement = null;
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException("關閉失敗");
}
connection = null;
}
}
}
配置文件(dbinfo.properties)
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myjdbc
user=root
password=123456
插入
private static void insert() throws SQLException {
// 插入一條數據使用QueryRunner
QueryRunner qr = new QueryRunner();
// 獲取連接
Connection conn = JDBCUtil.getConnection();
String sql = "insert into sort values(null,'顯示器',5,'這是一臺高級顯示器')";
// 插入數據
int row = qr.update(conn, sql);
if (row > 0) {
System.out.println("插入成功");
}
// 安靜的關閉資源
DbUtils.closeQuietly(conn);
}
更新
private static void update() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "update sort set sname=?,sprice=?,sdesc=? where sid=5";
// 多參數參數 傳參方式1 利用數組傳
// 方式2 直接傳遞參數 要和佔位符問號的順序對應
Object[] params = {"咖啡",1000,"java裏的咖啡"};
int row = qr.update(connection, sql, params);
if (row > 0) {
System.out.println("修改成功");
}
DbUtils.closeQuietly(connection);
}
查詢操作(8個結果集)
ArrayHandler
把查詢出來的數據的第一行放進對象數組中並返回
@Test
public void select1() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
// 調用查詢方法 傳入什麼容器 該類就把數據放到什麼容器中給你返回
Object[] rel = qr.query(connection, sql, new ArrayHandler());
for (Object object : rel) {
System.out.println(object);
}
DbUtils.closeQuietly(connection);
}
ArrayListHandler
查詢每一條記錄放到list集合中(每一條記錄是一個對象數組)
@Test
public void select2() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List<Object[]> list = qr.query(connection, sql, new ArrayListHandler());
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object);
}
System.out.println();
}
DbUtils.closeQuietly(connection);
}
BeanHandler
把結果的第一行封裝成一個JavaBean對象
JavaBean對象規則:
1.成員變量私有化
2.提供空參的構造方法
3.提供set/get方法
符合以上規則的實體類創建出來的對象就是JavaBean對象
@Test
public void select3() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
// 要把使用哪個JavaBean實體類傳進去
// 類名.class
Sort sort = qr.query(connection, sql, new BeanHandler<>(Sort.class));
if (sort == null) {
System.out.println("沒有該條數據");
}
System.out.println(sort);
DbUtils.closeQuietly(connection);
}
BeanListHandler
把結果集封裝成一個JavaBean對象再放入list集合中返回
@Test
public void select4() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List<Sort> list = qr.query(connection, sql, new BeanListHandler<>(Sort.class));
for (Sort sort : list) {
if (sort == null) {
System.out.println("沒有該條數據");
}
System.out.println(sort);
}
DbUtils.closeQuietly(connection);
}
ColumnListHandler
返回指定列的數據放在list中返回
@Test
public void select5() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List<Object> list = qr.query(connection, sql, new ColumnListHandler<>("sdesc"));
for (Object object : list) {
System.out.println(object);
}
DbUtils.closeQuietly(connection);
}
ScalarHandler
查詢結果是一個的時候使用的
@Test
public void select6() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select avg(sprice) from sort";
Double long1 = qr.query(connection, sql, new ScalarHandler<Double>());
System.out.println(long1);
DbUtils.closeQuietly(connection);
}
MapHandler
將結果集存儲在map中返回第一條記錄
@Test
public void select7() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
Map<String, Object> map = qr.query(connection, sql, new MapHandler());
Set<String> set = map.keySet();
for (String string : set) {
Object object = map.get(string);
System.out.println(string + "" + object);
}
DbUtils.closeQuietly(connection);
}
MapListHandler
將結果集每一條記錄都保存在map中再放入list中返回
@Test
public void select8() throws SQLException {
QueryRunner qr = new QueryRunner();
Connection connection = JDBCUtil.getConnection();
String sql = "select * from sort";
List<Map<String, Object>> list = qr.query(connection, sql, new MapListHandler());
for (Map<String, Object> map : list) {
for (String key : map.keySet()) {
System.out.println(key + " " + map.get(key));
}
}
DbUtils.closeQuietly(connection);
}
數據庫連接池
java爲了解決頻繁創建數據庫連接和釋放數據庫連接的問題
使用了數據庫連接池來解決並且給出了一套規範 數據庫連接池規範(一套接口)
javax.sql.DataSource java擴展包
由數據庫廠商提供的
常用數據庫連接池 DBCP C3P0
需要導入的jar包(docp中依賴了pool中的類)
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
BasicDataSource 是DataSource(規範類) 的實體類
基礎設置(要使用數據庫連接池 必須設置的內容)
DataSourceUtil工具類
public class DataSourceUtil {
private static BasicDataSource dataSource = new BasicDataSource();
static {
// 基礎設置dataSource
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/myjdbc");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 擴展設置
// 初始化連接數
dataSource.setInitialSize(10);
// 最大活動數
dataSource.setMaxActive(8);
// 最大空閒連接數
dataSource.setMaxIdle(5);
// 最小空閒連接數
dataSource.setMinIdle(2);
}
// 獲取數據庫連接池
public static DataSource getDataSource() {
return dataSource;
}
}
測試DataSourceUtil類
public class Test {
public static void main(String[] args) throws SQLException {
// 數據庫連接池和QueryRunner結合使用
QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSource());
// 插入一條數據
String sql = "insert into sort values(null,?,?,?)";
Object[] params = {"試卷",10,"一份萬分試卷"};
int row = qr.update(sql, params);
if (row > 0) {
System.out.println("插入成功");
}
}
}