文章目錄
概述
JDBC
JDBC 訪問數據庫步驟
- 加載一個Driver驅動
- 創建數據庫連接
- 創建Sql命令發送器Statement
- 通過Statement發送Sql命令並得到結果
- 處理結果
- 關閉數據庫資源
- ResultSet
- Statement
- Connection
jdbc 常用接口
1. Statement 接口
用於執行靜態SQl 語句並返回它所生成的結果的對象
三種 Statement 類
- Statement : 用於發送簡單的Sql 語句
- PreparedStatement 可以發送包含參數的語句,比上一個效率更好,而且可以防止SQL注入,
- CallableStatement : 繼承則PreparedStatement ,用於調用存儲過程
- 優先使用PreparedStatement 可以避免Sql 注入風險
常用的 Statement
- execute 運行語句,返回是否有結果集
- eecuteQuery 運行select 語句,返回ResultSet 結果集
- executeUpdate 運行inset/update/delete操作,返回更新的行數
事務管理
-
在JDBC 中,事務操作 是自動提交的
-
系統自動 調用 commit ,否則調用rollback 回滾
-
可以改成手動提交,調用 setAutoCommit(False)來禁止自動提交
時間類型
1. java.util.Date
- 子類 : java.sql.Date 表示年月日
- 子類 : java.sql.Time 表示時分秒
- 子類 : java.sql.TimeStmp 表示年月日時分秒
日期比較處理
- 插入隨機日期
- 取出指定日期範圍的記錄
文本存儲方式
CLOB
- 用來存儲大量的文本數據
- 大字段有些特殊,不同的數據庫處理方式不一樣,大字段的操作常常是以流的方式來處理的,
mysql 中的相關類型
- TINYTEXT
- TEXT[(M)]
- MEDIUMTEXT
- LONGTEXT
- 上面四種依次變大容量
BLOB
- 二進制大對象的使用
- 大字段數據通常是以流的形式,,而非一般的字段,一次即可讀出數據
Mysql 中相關類型
- TINYTEXT
- TEXT[(M)]
- MEDIUMTEXT
- LONGTEXT
- 上面四種依次變大容量
工具類總結
第一種
package com.pratice.jdbc;
/**
* @version : 1.0
* @auther : Firewine
* @Program Name: <br>
* @Create : 2018-09-29-21:30
*/
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 操作JDBC的工具類,其中分裝一些工具方法
*
*/
public class JDBCTools {
public static void release(ResultSet rs, Statement statement, Connection conn){
if (rs != null){
try{
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (statement != null){
try{
statement.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn != null){
try{
//也只是返回連接池中,不是真的關閉了
conn.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
/**
* 關閉statement和connection 的方法
* @param statement
* @param conn
*/
public static void release(Statement statement,Connection conn){
if (statement != null){
try{
statement.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn != null){
try{
conn.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
/**
* 1.獲取連接的方法
* 通過讀取配置文件從數據庫服務器獲取一個連接
* @return
* @throws Exception
*/
private static DataSource dataSource = null;
//數據庫連接池只被初始化一次。
static {
dataSource = new ComboPooledDataSource("helloc3p0");
}
public static Connection getConnection()throws Exception{
return dataSource.getConnection();
}
// public static Connection getConnection()throws Exception{
// //1.準備連接數據庫的4個字符串
// //2.獲取jdbc.properties對應的輸入流
// Properties ppop = new Properties();
//
// //3.加載對應的輸入流
// InputStream in =
// JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
//
// //4.具體決定user。password的等4個個字符串
// ppop.load(in);
// //3.加載數據庫驅動程序(對應的Driver實現類中有註冊驅動的靜態代碼塊)
// String user = ppop.getProperty("user");
// String password = ppop.getProperty("password");
// String jdbcUrl = ppop.getProperty("jdbcUrl");
// String driver = ppop.getProperty("driver");
//
// Class.forName(driver);
// //4.通過DriverManager 的GetConnection方法獲取數據庫連接
// return DriverManager.getConnection(jdbcUrl,user,password);
// }
}
第二種方法
package sxt.study.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
static Properties pros = null; //可以幫助讀取和處理資源文件中的信息
static { //加載JDBCUtil類的時候調用
pros = new Properties();
try {
pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getMysqlConn(){
try {
Class.forName(pros.getProperty("mysqlDriver"));
return DriverManager.getConnection(pros.getProperty("mysqlURL"),
pros.getProperty("mysqlUser"),pros.getProperty("mysqlPwd"));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Connection getOracleConn(){
try {
Class.forName(pros.getProperty("oracleDriver"));
return DriverManager.getConnection(pros.getProperty("oracleURL"),
pros.getProperty("oracleUser"),pros.getProperty("oraclePwd"));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void close(ResultSet rs,Statement ps,Connection conn){
try {
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement ps,Connection conn){
try {
if(ps!=null){
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn){
try {
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
C3P0 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="helloc3p0">
<!-- 指定連接數據源的基本屬性 -->
<property name="user">root</property>
<property name="password">pwd</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///runoob?useSSL=true</property>
<!-- 若數據庫中連接數不足時, 一次向數據庫服務器申請多少個連接 -->
<property name="acquireIncrement">5</property>
<!-- 初始化數據庫連接池時連接的數量 -->
<property name="initialPoolSize">5</property>
<!-- 數據庫連接池中的最小的數據庫連接數 -->
<property name="minPoolSize">5</property>
<!-- 數據庫連接池中的最大的數據庫連接數 -->
<property name="maxPoolSize">10</property>
<!-- C3P0 數據庫連接池可以維護的 Statement 的個數 -->
<property name="maxStatements">20</property>
<!-- 每個連接同時可以使用的 Statement 對象的個數 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>