帶着新人學springboot的應用10(springboot+定時任務+發郵件)

  接上一節,環境一樣,這次來說另外兩個任務,一個是定時任務,一個是發郵件。
  
  1.定時任務
  
  定時任務可以設置精確到秒的準確時間去自動執行方法。
  
  我要一個程序每一秒鐘說一句:java小新人最帥
  
  於是,我就寫了一個方法,註解裏cron裏面的很多星星意思是:每個月、週一到週日 、每個小時、每一分、每一秒都執行一次這個方法。
  
  主配置類加個開啓註解
  
  ok,可以了,直接啓動應用,不需要瀏覽器,直接在控制檯看到打印的消息:
  
  所以我們要掌握的是@Scheduled註解中屬性cron的表達式,大概的就是下圖所示:
  
  2.發郵件
  
  來測試一下用springboot發郵件,假如我用qq郵箱向一個老哥的網易郵箱發郵件,基本的邏輯就是:從qq郵箱---------->騰訊qq郵箱服務器------------>網易郵箱服務器-------------->163網易郵箱
  
  所以我們要配置的就是我們qq郵箱的賬號密碼
  
  第一步:導入依賴
  
  第二步:配置文件(看清楚stmp.qq.com這是SMTP服務器中qq郵件的主機地址,其他郵件有自己的STMP主機地址),最後的那個是建議ssl安全連接的,一定要開啓
  
  其中,qq郵箱得到授權碼步驟如下:
  
  第三步:測試類
  
    運行測試方法,可以在網易雲郵箱看到郵件:
  
  3.郵件的高級一點的功能(發郵件有附件)
  
  運行這個測試方法:
  
  4.再高級一點(用模板發送郵件)
  
    還是用博客園註冊爲例,不知道大家註冊的時候是不是收到了一個激活郵件,打開大概的格式就是:xxx用戶,您註冊博客園賬戶需要激活,請點擊激活郵件激活
  
  咳,記得不太清楚了,應該差不多,嘿嘿!話說難道每個人註冊博客園都會用上面的發送html的方式,慢慢拼接html然後發送嗎?其實這樣也行,只是看起來太lower了,而且代碼看起來會很凌亂。
  
  那今天我就用前面學的themeleaf給做個模板,來假裝發發郵件,騙騙自己,嘿嘿~(●´∀`●)~
  
  首先導入themeleaf的依賴,指定themeleaf的版本
  
  其實真正開發中,會把這個發郵件的方法寫成一個類,傳入一些參數就可以發送的,我們嘛,就怎麼簡單怎麼來吧!
  
  themeleaf文件的位置和內容(不要忘記themeleaf的目錄位置和用法了)
  
  點擊激活賬號,就會跳轉到我的controller中的方法,如下:
  
  ok,到這裏就可以了,記得,先運行springboot應用,然後運行測試方法,收到郵件,自己激活一下,然後就會跳轉到
  
  成功跳轉,於是你就激活成功了!
  
  5.可能出現的bug
  
    說說用模板可能會碰到的bug,哎,用了我好幾個小時,現在我還是一副日了狗的心情。
  
  怎麼回事呢?代碼寫了,看了好幾遍也沒錯,就是運行就報錯,在網上看了別人的代碼拿過來還是報錯,報錯如下:
  
  這個錯誤大概意思就是我的模板的html中每個標籤都要是閉標籤,要這種類型的<a></a>,假如是<img xxx>這種標籤就會報錯。
  
  如下所示,最坑的方法就是修改的,而且以後html的標籤都要是一對一對的,坑啊、、、
  
  後來有找了很多資料,原來發現是這裏,themeleaf默認應該是2.xx版本,這個版本解析標籤都要是一對一對的,到了3.xx之後,就不需要這麼麻煩了!
  
  都是版本問題,坑了我好幾個小時,哎,記住記住....
  
  >>> dir(cur)
  
  ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'arraysize', 'close', 'connection', 'description', 'execute', 'executemany', 'executescript', 'fetchall', 'fetchmany', 'fetchone', 'lastrowid', 'row_factory', 'rowcount', 'setinputsizes', 'setoutputsize']
  
  我們在裏面看到了一系列我們熟悉的名稱:close()、execute()、fetchall() 等。
  
  1.創建數據庫表
  
  面對 SQLite 數據庫,我們之前熟悉的 SQL 指令都可以用:
  
  >>> create_table = "create table books (title,author,language)"
  
  >>> cur.execute(create_table)
  
  <sqlite3.Cursor object at 0x104f296c0>
  
  這樣就在數據庫 lite.db 中建立了一個表 books。對這個表可以增加數據:
  
  >>> cur.execute('insert into books values("python basic","rocky","python")')
  
  <sqlite3.Cursor object at 0x104f296c0>
  
  爲了保證數據能夠保存,還要進行如下操作:
  
  >>> conn.commit()
  
  >>> cur.close()
  
  >>> conn.close()
  
  以上,在剛纔建立的數據庫中已經有了一個表 books,表中已經有了一條記錄。
  
  2.查詢
  
  保存以後我們來查詢一下:
  
  >>> conn = sqlite3.connect('lite.db')
  
  >>> cur = conn.cursor(www.feifanyule.cn/)
  
  >>> cur.execute('select * from books')
  
  <sqlite3.Cursor object at 0x104f297a0>
  
  >>> cur.fetchall()
  
  [('python basic', 'rocky', 'python')]
  
  3.批量插入
  
  我們來給 books 表中多增加一些內容,以便於我們進行其它的操作:
  
  >>> books = [("first book","first","c"),("second book","second","c++"),("third book","third","java")]
  
  這次我們來一個批量插入:
  
  >>> cur.executemany('insert into books values (?,?,?)',books)
  
  <sqlite3.Cursor object at 0x104f297a0>
  
  >>> conn.commit()
  
  接下來我們用循環語句來打印一下查詢結果:
  
  >>> rows = cur.execute('select www.mingcheng178.com* from books')
  
  >>> for row in rows:
  
  ...     print(row)
  
  ...
  
  ('python basic', 'rocky', 'python')
  
  ('first book', 'first', 'c')
  
  ('second book',  www.mhylpt.com/'second', 'c++')
  
  ('third book', 'third',www.yigouyule2.cn 'java')
  
  4.更新
  
  正如我們前面所說的,在 cur.execute() 中,可以寫 SQL 語句來操作數據庫:
  
  >>> cur.execute("update books set title='physics' where author='first'")
  
  <sqlite3.Cursor object at 0x104f297a0>
  
  >>> conn.commit()
  
  接下來我們按照條件查詢來看一看:
  
  >>> cur.execute("select * from books where author='first'")
  
  <sqlite3.Cursor object at 0x104f297a0>
  
  >>> cur.fetchall()
  
  [('physics', 'first', 'c')]
  
  5.刪除
  
  刪除也是操作數據庫必須的動作:
  
  >>> cur.execute("www.gcyL157.com select * from books")
  
  <sqlite3.Cursor object at 0x104f297a0>
  
  >>> cur.fetchall(www.michenggw.com)
  
  [('python basic', 'rocky', 'python'), ('physics', 'first', 'c'), ('third book', 'third', 'java')]
  
  最後不要忘記在完成對數據庫的操作以後,一定記得給人家「關上門」:
  
  >>> cur.close(www.gcyL157.com )
  
  >>> conn.close()
  
  寫在之後
  
  基本的知識差不多就是這些,當然肯定不侷限於此。在實際的編程中我們肯定會遇到很多的問題,大家記得要多多去查閱官方文檔,學會解決問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章