JDBCday04_大對象_Dao_DBUtil_JavaBean 大對象 (一般不用) clob(海量文字,如圖書) blob(二進位數據,如圖片,音樂,電影) clob海量文字存入資料庫 : FileReader(讀文本) + PreparedStatement的setCharacterStre ...
JDBCday04_大對象_Dao_DBUtil_JavaBean
大對象 (一般不用)
clob(海量文字,如圖書)
blob(二進位數據,如圖片,音樂,電影)
clob海量文字存入資料庫 : FileReader(讀文本) + PreparedStatement的setCharacterStream方法(以字元輸入)
blob圖片,音樂存入資料庫 : FileInputStream(位元組讀) + PreparedStatement的setBinaryStream的方法(以二進位輸入)
clob海量文字從資料庫寫到本地磁碟 : FileWriter(文本寫出) + PreparedStatement的getCharacterStream(先讀再寫)方法返回給Reader + FileWrite的write方法
clob圖片音頻從資料庫寫到本地磁碟 : FileOutputStream(位元組寫出) + ResultSet的getBinaryStream獲取位元組文件傳給InputStream,然後創建byte數組,FileOutputStream的write方法寫入.
往資料庫中存大文本或圖片 :
setCharacterStream(int parameterIndex,Reader x)將指定參數設置為給定輸入流
File file = new File("D:\\mianshiti.txt");
//圖片FileInputStream
FileReader fr = new FileReader(file);
Connection conn = DBUtil.getConnection();
String sql = "insert into t_book(book_id,book_name,book_content) values(?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "1");
pstmt.setString(2,"面試題");
//圖片pstmt.setBinaryStream
pstmt.setCharacterStream(3, fr);
int i = pstmt.executeUpdate();
System.out.println(i);
DBUtil.close(pstmt);
DBUtil.close(conn);
fr.close();
2. 將資料庫中的大文件存放到本地
File file = new File("D:\\HA.png");
//輸出圖片FileOutputStream fos = new FileOutputStream(file);
FileWriter fw = new FileWriter("D:\\haha.txt");
Connection conn = DBUtil.getConnection();
String sql = "select * from t_book";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()) {
/*
圖片讀取
InputStream is = rs.getBinaryStream(4);
byte[] b = new byte[23000];
*/
Reader reader = rs.getCharacterStream(3);
char[] ch = new char[1024];
int length = 0;
//作為整數讀取的字元,如果已到達流的末尾,則返回 -1
while((length=reader.read(ch))!=-1) {
fw.write(ch, 0, length);
}
}
fw.close();
DBUtil.close(rs, stmt, conn);
DAO(Database Access Object)資料庫訪問對象
- 使用資料庫訪問對象來抽象和封裝對資料庫的所有訪問
- 將底層的資料庫訪問和上層的業務邏輯分開
Dao怎麼用
DAO操作資料庫:即在DAO中封裝了一個數據表在一個項目中的增、刪、改、查的全部動作。
JavaBean
1.JavaBean是一個public類
2.JavaBean提供公共的無參構造方法
3.JavaBean內的屬性(欄位)都是私有的.這些屬性只能通過
優點
1.減少了數據傳遞間的碎片
2.代碼結構清晰
3.便於維護和程式擴展
4.節約了開發周期,避免了重覆代碼
DBUtil
將資料庫的連接和關閉封裝在一個類里,在其他類里如果需要開啟或者關閉連接,只需要調用DBUtil里的方法,返回一個連接即可。不需要在當前類里寫繁瑣的代碼。
優點
1.代碼結構清晰
2.便於維護和程式擴展
3.節約了開發周期,避免了重覆代碼
查詢工資在1-10的員工信息 (分頁顯示)
SELECT * FROM(
SELECT ROWNUM r,a.* FROM(
SELECT copy_emp.* FROM copy_emp WHERE salary IS NOT NULL ORDER BY salary DESC)a)
WHERE r>0 AND r<=10
分頁代碼
/**
* 分頁顯示
*/
public List<EmpBean> showEmpMagByPage(int page,int pageSize) {
Connection conn = DBUtil.getConnection();
String sql = "SELECT * FROM ( " +
" SELECT ROWNUM r,a.* FROM ( " +
" SELECT copy_emp.* FROM copy_emp"+
" WHERE salary IS NOT NULL ORDER BY salary DESC ) a ) " +
" WHERE r>? AND r<=?"; //字元串前邊要加空格
PreparedStatement pstmt = null;
//int pageSize = 10;//每頁顯示條數
int startPage = (page - 1) * pageSize;
int endPage = pageSize * page;
ResultSet rs = null;
List<EmpBean> list = new ArrayList<EmpBean>();
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, startPage);
pstmt.setInt(2, endPage);
rs = pstmt.executeQuery();
while(rs.next()) {
EmpBean bean = new EmpBean();
//bean.getFirstName(rs.getString(1));
bean.setRownum(rs.getInt(1));
bean.setEmpID(rs.getInt(2));
bean.setFirstName(rs.getString(3));
bean.setLastName(rs.getString(4));
bean.setSalary(rs.getDouble(9));
list.add(bean);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//DBUtil.close(rs, pstmt, conn);
DBUtil.close(rs);
DBUtil.close(pstmt);
DBUtil.close(conn);
}
return list;
}