jdbc、時間類型、大數據、stmt批處理

1.JDBC

1.1 基本操作

JDBC是接口,而JDBC驅動纔是接口的實現。
在這裏插入圖片描述
加載驅動類:

Class.forName(“com.mysql.jdbc.Driver”);

調用靜態方法進行註冊,jdk5以上自動完成。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
……
}

創建鏈接的url中可提供編碼參數::

jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8

1.2 增刪改查

Statement stmt = con.createStatement();
int m = stmt.executeUpdate(sql); //  增刪改
ResultSet rs = stmt.executeQuery(sql); // 查

在這裏插入圖片描述
Object getObject(int columnIndex):獲取指定列的Object類型的數據。
對於上面ResultSet的方法中,參數columnIndex表示列的索引,列索引從1開始,而不是0,這第一點與數組不同。

1.3 使用PreparedStatement

它是Statement接口的子接口,可以防止SQL攻擊。
SQL攻擊:用戶輸入的是SQL語句的片段,最終用戶輸入的SQL片段與我們DAO中寫的SQL語句合成一個完整的SQL語句!例如用戶在登錄時輸入的用戶名和密碼都是爲SQL語句的片段!

2. java.utl.Date類型與java.sql. 時間類型轉換

java.sql.Date,
java.sql.Time,
java.sql.Timestamp
以上類都是java.util.Date的子類

(1)把數據庫的三種時間類型賦給java.util.Date,基本不用轉換,因爲這是把子類對象給父類的引用,不需要轉換:

java.sql.Date date =//子類對象
java.util.Date d = date; // 直接給父類對象

java.sql.Time time = …
java.util.Date d = time;

java.sql.Timestamp timestamp = …
java.util.Date d = timestamp;

當需要把java.util.Date轉換成數據庫的三種時間類型時,這就不能直接賦值了:

java.utl.Date d = new java.util.Date();
java.sql.Date date = new java.sql.Date(d.getTime());//會丟失時分秒
Time time = new Time(d.getTime());//會丟失年月日
Timestamp timestamp = new Timestamp(d.getTime());

3.數據庫存儲大數據

在my.ini中添加如下配置,設置可存放的數據大小限制。

max_allowed_packet=10485760

mysql使用如下四種類型來處理文本大數據:
在這裏插入圖片描述
把圖片轉爲二進制數進行存儲:
(1)方法一:pstmt.setBinaryStream(int, InputSteam)

pstmt.setString(1, "a.jpg");
InputStream in = new FileInputStream("f:\\a.jpg");
pstmt.setBinaryStream(2, in);
pstmt.executeUpdate();

ResultSet讀取二進制數:
ResultSet. getBinaryStream(String columnLabel)

String filename = rs.getString("filename");
OutputStream out = new FileOutputStream("F:\\" + filename);
InputStream in = rs.getBinaryStream("data");
IOUtils.copy(in, out);
out.close();

(2)方法二:存儲的數據包裝成Blob類型,然後調用pstmt的setBlob()方法來設置數據
存:pstmt.setBlob(2, blob)

pstmt.setString(1, "a.jpg");
File file = new File("f:\\a.jpg");
byte[] datas = FileUtils.getBytes(file);//獲取文件中的數據
Blob blob = new SerialBlob(datas);      //轉爲Blob對象
pstmt.setBlob(2, blob);					//存
pstmt.executeUpdate();

讀:rs.getBlob("data")

String filename = rs.getString("filename");//獲取文件名
File file = new File("F:\\" + filename) ;  //創建文件對象
Blob blob = rs.getBlob("data");            //獲取文件的Blob格式數據
byte[] datas = blob.getBytes(0, (int)file.length()); // 轉爲字節數組
FileUtils.writeByteArrayToFile(file, datas); // 寫到指定文件

4.批處理

(1)Statement
 void addBatch(String sql):添加一條語句到“批”中;
 int[] executeBatch():執行“批”中所有語句。返回值表示每條語句所影響的行數據;
 void clearBatch():清空“批”中的所有語句。

for(int i = 0; i < 10; i++) {
	String number = "S_10" + i;
	String name = "stu" + i;
	int age = 20 + i;
	String gender = i % 2 == 0 ? "male" : "female";
	String sql = "insert into stu values('" + number + "', '" + name + "', " + age + ", '" + gender + "')";
	stmt.addBatch(sql); // 增加一批sql
	}
	stmt.executeBatch();

(1)PreparedStatement

pstmt = con.prepareStatement(sql);
for(int i = 0; i < 10; i++) {
	// 循環賦值
	pstmt.setString(1, "S_10" + i);
	pstmt.setString(2, "stu" + i);
	pstmt.setInt(3, 20 + i);
	pstmt.setString(4, i % 2 == 0 ? "male" : "female");
	pstmt.addBatch(); // 增加一批值
}
pstmt.executeBatch();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章