1. 程式人生 > >Java學習路程之資料庫連線, common-dbutils和資料來源

Java學習路程之資料庫連線, common-dbutils和資料來源

一.資料庫連線 1.封裝資料庫連線

public class Day28{
	public static void main(String[] args) throws SQLException {
		//查詢sort全表並且將查詢出來的每條資料封裝成一個物件
		//給每一張表建立一個實體類
		Connection connection = JDBCConnection.getConnection();
		//獲取SQL語句執行物件
		Statement statement = connection.createStatement();
		String sql = "select * from sort";
		ResultSet resultSet = statement.executeQuery(sql);
		//結果處理
		while (resultSet.next()) {
			Sort sort = new Sort();
			sort.setSid(resultSet.getInt("sid"));
			sort.setSname(resultSet.getString("sname"));
			sort.setSprice(resultSet.getDouble("sprice"));
			sort.setSdesc(resultSet.getString("sdesc"));
			System.out.println(sort);
		}
		//關閉資源
		JDBCConnection.myClose(connection, resultSet, statement);
	}
}

public class JDBCConnection {
	//宣告連線
	private static Connection connection;
	//註冊驅動 在靜態程式碼塊中會只註冊一次
	static{
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			//丟擲執行時異常停止程式
			throw new RuntimeException("註冊驅動失敗");
		}
	}
	private JDBCConnection(){
	}
	//獲取連線方法
	public static Connection getConnection(){
		//資料庫地址
		String url = "jdbc:mysql://localhost:3306/ldmysql01";
		/資料庫/使用者名稱
		String user = "root";
		//資料庫密碼
		String password = "123456";
		try {
			//獲取連線物件
			connection = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("資料庫連線失敗");
		}
		return connection;
	}
	//關閉資源方法
	public static void myClose(Connection connection, ResultSet resultSet, Statement statement){
		//當使用try catch處理異常時,發生異常時,不影響下面程式碼的執行.當自己丟擲異常時,異常發生會導致程式中斷.
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (statement != null) {
			try {
				statement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

二.common-dbutils 工具類庫 1.dbutils類 closeQuietly(Connection conn)方法關閉資源 2.queryrunner類 query(Connection conn, String sql, ResultSetHandler rsh, Object… params) 查詢 引數1:資料庫連線物件 引數2:SQL語句(可使用佔位符) 引數3:查詢後得到的結果集(可以選用不同型別的結果集) 引數4:替換SQL語句佔位符 update(Connection conn, String sql, Object… params) 更新 插入資料

  //建立查詢物件
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	String sql = "insert into sort values (null, ?, ?, ?)";
	//建立陣列 傳引數
	Object[] params = {"熱風鞋子", 100, "好穿不貴"};
	int row = queryRunner.update(connection, sql, params);
	System.out.println("受影響的行數" + row);
	//關閉資源
	DbUtils.close(connection);

刪除 id為10的資料

	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	String sql = "delete from sort where sid=?";
	int row = queryRunner.update(connection, sql, 10);
	System.out.println("受影響的行數" + row);
	DbUtils.close(connection);

修改id=8 毛巾 100 柔軟

QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	String sql = "update sort set sname=?, sprice=?, sdesc=? where sid=?";
	Object[] params = {"毛巾", 100, "柔軟", 8};
	int row = queryRunner.update(connection, sql, params);
	System.out.println("受影響的行數" + row);
	DbUtils.close(connection);

3.ResaultSetHandle 提供結果集 ArrayHandler 預設返回查詢的第一條資料

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	Object[] query = queryRunner.query(connection, sql, new ArrayHandler());
	for (Object object : query) {
		System.out.println(object);
	}
	DbUtils.close(connection);

ArrayListHabdler 返回多條記錄

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	List<Object[]> query = queryRunner.query(connection, sql, new ArrayListHandler());
	for (Object[] objects : query) {
		for (Object object : objects) {
			System.out.print(object+ " ");
		}
		System.out.println();
	}
	DbUtils.close(connection);

BeanListHandler 預設只返回第一條資料

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	Sort sort = queryRunner.query(connection, sql, new BeanHandler<>(Sort.class));
	System.out.println(sort);
	DbUtils.close(connection);

BeanListHandler 返回儲存好的物件的list集合,返回所有資料

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	List<Sort> query = queryRunner.query(connection, sql, new BeanListHandler<>(Sort.class));
	for (Sort sort : query) {
		System.out.println(sort);
	}
	DbUtils.close(connection);

ColumnListHandler 預設返回資料庫中第一列資料,可以傳入引數(欄位名)

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	List<Object> query = queryRunner.query(connection, sql, new ColumnListHandler<>("sname"));
	for (Object object : query) {
		System.out.println(object);
	}
	DbUtils.close(connection);

ScalarHandler 獲取聚合函式返回的資料並且返回的是long型

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	String sql2 = "select count(*) from sort";
	Long query = queryRunner.query(connection, sql2, new ScalarHandler<Long>());
	System.out.println(query);
	//或
	/*Number number = queryRunner.query(connection, sql2, new ScalarHandler<Long>());
	System.out.println(number.longValue());*/
	DbUtils.close(connection);

MapHandler 預設返回第一條資料

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	Map<String, Object> map = queryRunner.query(connection,sql, new MapHandler());
	for (String key : map.keySet()) {
		System.out.println(key + " "+ map.get(key));
	}
	DbUtils.close(connection);

MapListHandler 返回多條記錄

	String sql = "select * from sort";
	QueryRunner queryRunner = new QueryRunner();
	Connection connection = JDBCutil1.getConnection();
	List<Map<String,Object>> query = queryRunner.query(connection, sql, new MapListHandler());
	for (Map<String, Object> map : query) {
		for (String key : map.keySet()) {
			System.out.print(key +" "+ map.get(key));
		}
		System.out.println();
	}

三.DataSource 資料來源 查詢時建立和銷燬連線耗費資源,使用資料來源可以解決這個問題,查詢時會從資料庫連線池找出一個空閒的連線去查詢資料庫,查詢完畢後不會銷燬連線會重新放入連線池中

	// 建立資料庫連線池
	BasicDataSource dataSource = new BasicDataSource();
	//基礎設定 賬號密碼 資料庫地址
	dataSource.setDriverClassName("com.mysql.jdbc.Driver");
	dataSource.setUrl("jdbc:mysql://localhost:3306/ldmysql01");
	dataSource.setUsername("root");
	dataSource.setPassword("123456");
	// 獲取連線
	Connection connection = dataSource.getConnection();
	System.out.println(connection);

dataSource工具類

	// 通過資料庫連線池建立 QueryRunner物件
	QueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());
	String sql = "select * from sort";
	List<Sort> query = queryRunner.query(sql, new BeanListHandler<>(Sort.class));
	System.out.println(query);