學習jdbc(一週總結)
宣告:該總結為個人總結,所以記錄得比較亂,看者勿噴
2017.8.3
1.dbutils(結合dbcp連線池版(單例 BasicDataSource bds;))
內容------------
public static boolean execUpdate(Connection conn,String sql,Object ...objs)
public static <T> List<T> queryList(String sql,CallBack<T> call,Object...params)
list.add(objs)
public static <T> T queryOne(String sql,CallBack<T> call,Object...params)
2.java.util.Date轉換成java.sql.Date timestamp和資料庫的datetime可以相容
(1).ps.setDate(2, new java.sql.Date(newDate().getTime())) 根據long來轉換 但是沒有時分
(2).ps.setTimestamp(2, new java.sql.Timestamp(newDate().getTime()))
ps.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
java.util.Date有三個子類:java.sql.Date java.sql.Time java.sql.Timestamp
sql中:time只有時分秒 date只有年月日 timestamp都有
3.ps.get()的引數
Select count(*) as xx from employee
Ps.getInt(1)
Ps.getInt(“count(*)”)
Ps.getInt(“xx”)
4.ps=conn.prepareStatement("insertinto daily(content, sid) values(?, ?)",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = ps. getGeneratedKeys()獲得插入資料的主鍵
此處主鍵必須自動增長,除非插入的時候輸入主鍵值,否則表中主鍵必須自動增長
5.獲取結果元資料
ResultSetMetaDatarsmd = rs.getMetaData();
rsmd.getColumnCount()獲得列數
rsmd.getColunmLabel(index)獲得別名
rsmd.getColumnName()獲得名稱
rsmd.getColumnTypes()獲得一個int值代表Types 該列的型別
注意事項:num as number 列改了名字後,再用原列名rs.getObject(“num”)找不到該資料
6.jdbc呼叫儲存過程
CallableStatement cs = getConn().prepareCall(“{callsp_paging(?,?,?,?,?,?,?,?,?)}”);
//輸入
cs.setInt(1,int);
cs.setString(2,String);
//註冊輸出引數
cs.registerOutParameter(8,java.sql.Types.INTEGER)
//執行儲存過程
cs.execute(); 不用其他的 因為可能有更新也有查詢
7.Object ...obj表示不定長度的陣列 不傳引數則obj長度為0
8.DTO和DAO
2017.8.4
1.連線池(避免頻繁通過資料庫獲取連線(資源開銷太大))(dbcp、c3p0更穩定)
二者的區別dbcp沒有自動的去回收空閒連線的功能(超過響應時間或最大連線數會斷掉所有連線)
c3p0有自動回收空閒連線功能
簡單自定義連線池的實現:(懶漢模式 DataSource)
(1)static LinkedList<Connection>pools = new LinkedList<>();// 儲存資料庫連線的容器
(2)初始化連線池(add 往集合裡新增n個conn)conn =DriverManager.getConnection(url, username, password);
(3)使用者呼叫getConn獲得連線,先判斷空閒連線數,若不夠則再add然後在分配給使用者
(4)釋放連線,重新add到pools陣列中,修改空閒連線和啟用連線的值
2. executeBatch();的使用方法
3.事務(更新操作) 要麼同時成功要麼同時失敗
例子:
只有同時成功的時候才能提交,否則回滾
2017.8.5
1.資料庫儲存檔案(字元流文字、位元組流檔案)
PreparedStatementps = conn.prepareStatement("insert into tb_clob(fname,content)values(?,?)");
ps. setCharacterStream(2, FileReader) //傳入字元流文字
ps. setBinaryStream(2, FileInputStream) //傳入位元組流檔案
2.獲取檔案
先用二進位制流獲取二進位制檔案
InputStream is = rs.getBinaryStream("file");
然後用bufferedInputStream包裝is 用BufferedOutputStream寫出來
B = Byte[1024]
While(int len =bis.read(b) != -1)
Bos.write(b,0,len)
3.Packetfor query is too large(mysql寫入資料過大)
My.ini加一行 max_allowed_packet = 4M 重啟MySql服務
4.conn.getMetaData().getURL()獲取ip和埠號
5. 如果向mysql中儲存二進位制檔案時,資料庫的字符集不能設定為gbk,推薦使用UTF-8(設定嚮導 改)
6. c3p0連線池的工具類DataSource(連線池為單例,連線不可單例)
privatestatic ComboPooledDataSource dataSource = new ComboPooledDataSource();
(餓漢模式)
載入系統屬性步驟 //屬性檔案 get 和new的區別??
Properties props= new Properties(); Properties props = System.getProperties();
Props.load (DBConnection.class.getResourceAsStream("檔案路徑,可以放在同級包內"));
url= props.getProperty("url");通過key值獲取Meaning
各資料庫的驅動
####mysql connectioninfo####
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/mydb
user = root
password = zenghui.111
####MSSQLServer connectioninfo####
#driver =com.microsoft.sqlserver.jdbc.SQLServerDriver
#url =jdbc:sqlserver://127.0.0.1:1433;databaseName=test
#user = sa
#password = zenghui.111
####Oracle connectioninfo####
#driver =com.oracle.driver.OracleDriver
#url =jdbc:oracle:thin:@127.0.0.1:1521:orcl
#user = scott
#password = zenghui.111
7.homework
ps.setObject(i+1,objs[i]);用setObject可以將util.date類的物件存到資料庫的sql.date類
like ? ---- "%"+goodsname+“%”
string.contains(String)// 包含某字串
字串轉換成各型別:
static SimpleDateFormat sdf = newSimpleDateFormat("MM/dd/yyyy"); date=sdf.parse(String)
s=sdf.format(date)--------date轉換成字串
int--Pattern.matches("^\\d*$",s)---Integer.parseInt(s)
double--Pattern.matches("^\\d+\\.??\\d+$",s)--- Double.parseDouble(s)
BigDecimal---Pattern.matches("^\\d+\\.??\\d+$",s)---new BigDecimal(s)