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();