1. 程式人生 > >學習jdbc(一週總結)

學習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)