public?void?updateGoddess(Goddess?goddess)?throws?SQLException{
????????Connection?conn?=?DBUtil.getConnection();????
????????StringBuilder?sql=new?StringBuilder();
????????sql.append("update?femalegod?set?");
????????//這個comFlag標記用來確定是否要在拼接語句時加逗號
????????boolean?comFlag=false;
????????
????????//如果本屬性非空,后面的屬性拼接時必然要加逗號,所以comFlag賦值為true
????????if?(goddess.getUserName()!=null){
????????????sql.append("username=?");
????????????comFlag=true;
????????}
????????
????????//如果本屬性非空,且comFlag為false,說明本屬性為set關鍵字后第一個設置,則前面無需加逗號,
????????//同時由于本屬性非空,說明后面如果有要拼接的屬性,必須有逗號,所以設置comFlag為true
????????if?(goddess.getAge()!=null){
????????????if?(comFlag)????????
????????????????sql.append(",age=?");//comFlag為真,說明前面已有待更新的屬性,因此要在最前面加逗號
????????????else{
????????????????sql.append("age=?");//comFlag為假,前面還沒有待更新屬性,本屬性為第一個待更新的,無需在前面加逗號
????????????????comFlag=true;???????//如果后面還有屬性要更新,那個屬性前需要加逗號,因此在這里設置comFlag為true
????????????}
????????}
????????????
????????if?(goddess.getBirthday()!=null){
????????????if?(comFlag)
????????????????sql.append(",birthday=?");
????????????else{
????????????????sql.append("birthday=?");
????????????????comFlag=true;
????????????}
????????}
????????if?(goddess.getEmail()!=null){
????????????if?(comFlag)
????????????????sql.append(",email=?");
????????????else{
????????????????sql.append("email=?");
????????????????comFlag=true;
????????????}
????????}
????????if?(goddess.getMobile()!=null){
????????????if?(comFlag)
????????????????sql.append(",mobile=??");
????????}
????????????
????????sql.append("?where?id=?");
????????
????????System.out.println(sql.toString());
????????PreparedStatement?ps=conn.prepareStatement(sql.toString());
????????
????????//i為參數索引值
????????int?i=0;
????????
????????//為前面的sql語句里的?號取對應的屬性值,如果屬性為空,則不需要更新,跳過,否則,提取屬性值
????????if(goddess.getUserName()!=null)
????????????ps.setString(++i,?goddess.getUserName());
????????if(goddess.getAge()!=null)
????????????ps.setInt(++i,?goddess.getAge());
????????if(goddess.getBirthday()!=null)
????????????ps.setDate(++i,?new?Date(goddess.getBirthday().getTime()));
????????if(goddess.getEmail()!=null)
????????????ps.setString(++i,?goddess.getEmail());
????????if(goddess.getMobile()!=null)
????????????ps.setString(++i,?goddess.getMobile());
????????ps.setInt(++i,?goddess.getID());
????????
????????ps.execute();
????????ps.close();
????}
2016-08-07
上面“不然變成where?1=1?username?like?"xiao%"就出錯了”忘了加注釋符,復雜查詢我只做了如上測試,因為時間關系(后面有太多課程要學,不想在一個項目上糾纏太久),沒有在視圖層的代碼里做相應改動以便用戶可以在前臺輸入復雜多個查詢,有興趣有時間的童鞋可以試試,有問題大家再來一起交流討論
2016-08-07
根據姓名或手機查詢女神,這個方法我本來根據老師上課的要求做了點擴充,可以根據多個條件的與或進行查詢,課程看到最后發現項目的要求其實很簡單,只按單個條件查詢,而且限定在手機或姓名,既然前面復雜條件能查詢到,簡單查詢當然更可以,所以我也沒改這部分,功能一樣能實現。
public?List<Goddess>?queryGoddessList(List<Map<String,Object>>?params)?throws?SQLException{ ????????Connection?conn?=?DBUtil.getConnection();???????? ????????List<Goddess>?gs?=?new?ArrayList<Goddess>(); ????????Goddess?g?=?null; ???????? ????????StringBuffer?sb?=?new?StringBuffer(); ????????sb.append("select?*?from?femalegod?where?1=1");?//設置?1=1這個永遠為真的條件是為了和下面的田間查詢做拼接 ???????? ????????if(params!=null?&&?params.size()>0){?//判斷查詢參數列表非空 ????????????for(int?i=0;i<params.size();i++){ ????????????????Map<String,Object>?param?=?params.get(i);//依次取出查詢參數 ????????????????sb.append("?"+param.get("connector")+"?"+param.get("name")+"?"+param.get("rela")+"?"+"'"+param.get("value")+"'"); ????????????}//對參數做拼接,connector存放連接符&&或||,name存放查詢字段名,rela存放關系符=,>,等等,value存放字段值 ????????} ???????? ????????System.out.println(sb.toString());?//輸出拼接后的sql查詢語句便于調試糾錯 ???????? ????????/** ?????????*?以下部分為常規操作,對查詢得到的結果集依次放入對象 ?????????*?并添加進list,返回 ?????????*/ ????????PreparedStatement?ps=conn.prepareStatement(sb.toString()); ????????ResultSet?rs=ps.executeQuery(); ????????while(rs.next()){ ????????????g?=?new?Goddess(); ????????????g.setID(rs.getInt("ID")); ????????????g.setUserName(rs.getString("username")); ????????????g.setAge(rs.getInt("age")); ????????????g.setBirthday(rs.getDate("birthday")); ????????????g.setEmail(rs.getString("email")); ????????????g.setMobile(rs.getString("mobile")); ????????????gs.add(g); ????????} //???????? ????????return?gs; ????}如果也想試試復雜查詢的效果,我這里寫了個測試例子,根據三個條件姓名,年齡,及生日查詢 public?static?void?main(String[]?args)?throws?SQLException?{ ???????? ????????GoddessMethod?gsMethod?=?new?GoddessMethod(); ???????? ????????List<Map<String,Object>>?params?=?new?ArrayList<Map<String,Object>>(); ????????//設計的查詢例子:username?like?"xiao%"?or?age=20?or?birthday=1994-01-01 ???????? ????????//第一套參數:?and?username?like?"xiao%",?最前面放一個and是為了跟查詢方法里的where?1=1?拼接上 ????????不然變成where?1=1?username?like?"xiao%"就出錯了 ????????Map<String,Object>?param?=?new?HashMap<String,Object>(); ????????param.put("connector",?"and"); ????????param.put("name",?"username"); ????????param.put("rela",?"like"); ????????param.put("value",?"'xiao%'");???????? ????????params.add(param); ????????//第二套參數:?age?=?20 ????????param?=?new?HashMap<String,Object>(); ????????param.put("connector",?"or"); ????????param.put("name",?"age"); ????????param.put("rela",?"="); ????????param.put("value",?"20"); ????????params.add(param); ???????? ????????//第三套參數:?birthday?=?1994-01-01 ????????param?=?new?HashMap<String,Object>(); ????????param.put("connector",?"or"); ????????param.put("name",?"birthday"); ????????param.put("rela",?"="); ????????param.put("value",?"to_date('1994-01-01','yyyy-mm-dd')"); ????????params.add(param); ???????? ????????//輸出params對象里存放的參數,查看是否正確 ????????for?(int?i=0;i<params.size();i++){ ????????????System.out.println(params.get(i).get("connector")+"?"+params.get(i).get("name")+"?"+params.get(i).get("rela")+"?"+params.get(i).get("value")); ????????} ???????? ????????//調用查詢方法,并輸出 ????????List<Goddess>?gs?=?gsMethod.queryGoddessList(params); ????????for(Goddess?g:?gs){ ????????????System.out.println(g.getUserName()+","+g.getAge()); ????????}2016-07-22
你的根據姓名和手機號查詢女神部分是怎么寫的????
2016-07-19
看起來好繁瑣。
2016-07-02
求教返回主菜單
2016-07-02
實際開發中,要修改對象,肯定是要讀到一個對象再修改,所以我覺得可以不用做判斷的
=================================
你的意思是假如我只更新一個屬性,譬如
update 某表 set 屬性=? where 條件
但在這種情況下我也得把SQL語句寫全了
update 某表 set 屬性1=?,屬性2=?,屬性3=?。。。。 where 條件
即使大部分屬性不用更新,也得拿原來的值再賦一遍?這當然也算個辦法,只是我本想著有沒有更妙的寫法,可以寫得比較符合實際,不用加一堆沒必要的賦值,就像老師的課程里提到的where 1=1那個小技巧?,F在看來是沒有這種技巧,要么就很笨很啰嗦像我這樣挨個判斷挨個拼接,要么就不管三七二十一,所有屬性都更新一遍,即使值不變?其實后一種情況這里處理起來也很麻煩,如果我從控制臺得到一個更新屬性,其余都為空的話,我是不是還得用一個select語句找到對應的這條記錄,把它的屬性值全部取出來,除了要更新的那個屬性,其余屬性都得原樣填到上一個update對應的問號里去?
2016-07-02
實際開發中,要修改對象,肯定是要讀到一個對象再修改,所以我覺得可以不用做判斷的
2016-07-01
/**
* 修改
* @throws SQLException
*/
public void updateGoddess(Goddess goddess) throws SQLException {
String sql = " update imooc_goddess "
+ " set user_name=?,sex=?,age=?,birthday=?,email=?,mobile=?,"
+ " update_user=?,update_date=current_date(),isdel=? where id=?";
PreparedStatement ptmt = conn.prepareStatement(sql);
ptmt.setString(1, goddess.getUser_uame());
ptmt.setInt(2, goddess.getSex());
ptmt.setInt(3, goddess.getAge());
ptmt.setDate(4, new Date(goddess.getBirthday().getTime()));
ptmt.setString(5, goddess.getEmail());
ptmt.setString(6, goddess.getMobile());
ptmt.setString(7, goddess.getUpdate_user());
ptmt.setInt(8, goddess.getIsdel());
ptmt.setInt(9, goddess.getId());
ptmt.execute();
}
拿到要修改的對象,再把對要修改的屬性象重新賦值,再保存進去,直接操作對象。(這里只是所有屬性都有值的情況下,有NULL值的時候要自己做驗證判斷)
2016-07-01
不建議這樣寫,太亂。
建議把各個功能分別封裝在不同方法中,在主程序中去調用各個方法去實現對應功能
public void operatlin_query() throws Exception{//查詢所有
public void operatlin_get(Integer id) throws SQLException{//查詢單個
public void operatlin_add() throws Exception{//添加
public void operatlin_update() throws Exception{//更新
public void operatlin_delete() throws Exception{//刪除
public void operatlin_search() throws Exception{//根據姓名、手機號來查詢
while(true){
? ? if(){
? ? ? ? ? ?//“if”判斷輸入主菜單命令,在語句中直接調用對應方法
? ? } else if(){
? ? }else if(){
? ? }..............
}
這樣寫看起來有條理些,便于以后優化