通過自動回復機器人學Mybatis---基礎版 筆記 2018-01-19

慕課網(wǎng)視頻 通過自動回復機器人學Mybatis---基礎版 的筆記


1.頁面放在webinf下便于管理和控制铸史,直接放在根目錄會直接訪問到,除非設置攔截器(?粒没?)。放在webinf后簇爆,必須得從后臺走才能訪問這些頁面(為什么)
2.sql語句直接寫 select 列名不要用select 癞松,因為用數(shù)據(jù)庫引擎還得再解析一遍*解析成列名影響效率。
3.jsp標簽庫定義的uri可以從jstl的jar包中的c.tld中找
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4.web容器只實例化servlet一次
5.servlet中request.setCharacterEncoding("UTF-8");或者過濾器設置
6.request.getParameter();獲取的是String類型入蛆,根據(jù)情況需要轉為其他類型
7.servlet不應有其他多余的業(yè)務邏輯處理(轉換類型响蓉,判斷是否為空等),要交給service處理

先不用mybatis過程:
web.xml設置servlet映射

<servlet>
  <servlet-name></servlet-name>
  <servlet-class></servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name></servlet-name>
  <url-pattern></url-pattern>
</servlet-mapping>

servlet中連接數(shù)據(jù)庫哨毁,獲得數(shù)據(jù)(list<javabean>)枫甲,給頁面?zhèn)鬟f數(shù)據(jù),跳轉頁面扼褪。(jdbc+用request的attribute給頁面?zhèn)鲾?shù)據(jù))(servlet生命周期想幻?)
頁面用標簽庫core
<c:forEach items="" var="" varStatus="" >
<c:if>
判斷字段不為null和不為空,再確定是否拼進sql里


image.png

代碼重構:
servlet設置編碼话浇、接受值脏毯、向頁面?zhèn)髦怠㈨撁嫣D
dao層幔崖,表的數(shù)據(jù)庫操作食店,執(zhí)行sql語句、獲取數(shù)據(jù)岖瑰、返回結果
service層叛买,調(diào)用dao進行業(yè)務處理(servlet調(diào)用service)
db層,真正和數(shù)據(jù)庫交互,DBAccess, getSqlSession()

mybatis搭建

大部分工作都在配置文件里
核心配置文件蹋订,下載源碼后在路徑\mybatis-3-mybatis-3.3.1\src\test\java\org\apache\ibatis\submitted\complex_property下可找到模版
同目錄下的user.xml是sql配置演示
mybatis如何想dao層提供與數(shù)據(jù)庫交互的對象率挣?SqlSession

SqlSession的作用

向sql傳入?yún)?shù)
執(zhí)行sql語句
獲取執(zhí)行sql語句的結果
事務的控制

如何得到SqlSession

//通過配置文件獲取數(shù)據(jù)庫連接相關信息
Reader reader = Resources.getResourceAsReader("配置文件路徑,src是根目錄露戒,如config/Configuration.xml");
//通過配置信息構建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
//通過SqlSessionFactory打開數(shù)據(jù)庫會話(SqlSession)
SqlSession sqlSession = sqlSessionFactory.openSession();

jdbc 的conn.prepareStatement("sql語句").execute()是自動提交的
如果將自動提交設為false椒功,conn.setAutoCommit(false);之后的每條sql語句都視為同一個事務,需要手動提交事務或者回滾智什,conn.commit(),conn.rollback()
mybatis把connnection封裝后將自動提交設為了false所以sqlsession需要手動提交动漾,sqlsession.commit()
要記得關閉sqlsession,關前先判斷是否為null

sql基本配置和執(zhí)行

配置文件配置sql語句讓SqlSession能讀到并執(zhí)行

sql配置文件

<mapper namespace="">
  <resultMap type="" id="">
    <id column="" jdbcType="" property=""/> 
    <result ... />
    <collection property="" resultMap=""/>
  </resultMap>
  <select id="" resultMap="">sql語句</select>
  <insert...>
  <update...>
  <delete...>
  </mapper>

crud標簽屬性

  • id:sqlSession通過id調(diào)用sql語句荠锭,sqlsession.selectList("namespace名.id名")
    因為id不可重復旱眯,所以可用<mapper namespace="">區(qū)分相同id
  • resultMap:表列名與bean屬性名的映射,讓查詢到的數(shù)據(jù)可以放進bean中

resultMap標簽屬性

  • type:bean類全名
  • id:與crud標簽id沒關系可重名
  • <id> 主鍵用id
    -- column:結果集的列名(不帶前綴,所以連接查詢有時會重名删豺,需要起別名)共虑,可用resultSet.getMetaData.getColumnName()查看列名
    -- jdbcType:sql.Types中定義的常量
    -- property:對應的bean類屬性名
  • <result> 非主鍵用result
  • <collection> 子表集合
    -- resultMap:子表的配置文件中的resultMap,如CommandContent.Content

必須有namespace呀页,沒有的話加載配置文件會出錯

核心配置文件中導入sql配置文件

<mappers>
  <mapper resource="sql配置文件路徑">
</mappers>

動態(tài)sql拼接

傳參:
sqlSession.selectList()只能傳遞一個對象給sql語句(用bean封裝)
<select id="" resultMap="" parameterType="類全名">(lang包可以直接寫類名)
sql查詢語句
<if test="ognl表達式取屬性進行判斷(ognl支持調(diào)用java方法)">and xxx=? </if>
</select>


image.png

image.png

拼接sql語句

應用log4j調(diào)試動態(tài)sql

導入包


配置文件
Logger log;
//級別由低到高
log.debug("adf");
log.info(message);
log.warn(message);
log.error(message);
#大于等于該輸出級別的會被輸出妈拌,看mybatis源碼,輸出級別是debug蓬蝶。Console名稱隨意尘分,主要在后面設置輸出到哪
log4j.rootLogger=DEBUG,Console
#Console名稱跟上面一致,類是控制臺輸出丸氛,想輸出到文件就換成其他的類
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#布局培愁,自定義
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#自定義的輸出格式。
#%d時間雪位,%t線程名稱竭钝,%-5p輸出日志的級別,至少5位雹洗,補齊空格在左邊香罐,%c類全名,%m附加信息时肿,%n換行
log4j.appender.Console.layout.ConversionPattern=%d[%t]%-5p[%c] - %m%n
#個性化庇茫,特殊對待,這個包下的INFO以上級別才輸出
log4j.logger.org.apache=INFO
image.png

list.jsp頁面
只有一個form螃成,action是自己
刪除旦签,增加是servlet鏈接,servlet處理完后請求轉發(fā)到list.jsp
批量刪除按鈕用js將form的action改為servlet寸宏。提交

ajax

left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結字段相等的記錄
right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結字段相等的記錄
inner join(等值連接) 只返回兩個表中聯(lián)結字段相等的行
on 條件

標簽

  • <where>:where內(nèi)條件都不滿足不會有where宁炫,滿足的話會自動去掉多余的and或or


    where
  • <sql id="" ></sql>
    <include refid=""/> 引用<sql>中的內(nèi)容
  • <set></set>update中使用自動去掉逗號


    set
  • <trim></trim>
    -- prefix,要加的前綴;
    -- suffix,后綴;
    -- prefixOverrides,切掉前面的字段;
    -- suffixOverrides,切掉后面的字段.
  • <choose><when></when>...<otherwise></otherwise></choose> IFELSE
  • <association> mapper中的標簽,映射主表
標簽

容易混淆的概念

resultMap和resultType

都是為了表示結果集與java對象的映射
resultType:不需要配置resultMap
氮凝,只能靠結果集的列名和java屬性名對應羔巢,而且是大小寫不敏感的。
可以將它指向java.util.Map罩阵,這樣結果集會放在map中竿秆,key就是結果集的列名,這樣寫是大小寫敏感的稿壁。

用resultMap可用typeHandler進行類型轉化(數(shù)據(jù)庫類型與java類型是不一樣的幽钢,日期類,布爾型傅是,01truefalse)

parameterMap和parameterType

parameterMap 為了保持與老版本一致匪燕,官方不推薦使用蕾羊。

#{}和${}

都是寫在sql語句中成為語句中的一部分

#{c} --> ?
${c} --> c的值
${}沒有預編譯的效果,直接拼接谎懦,用于order by 等不能用?的情況
#{} 能預編譯肚豺,反復執(zhí)行相同的語句,參數(shù)不同界拦,有性能上的優(yōu)勢,防止sql注入

#{}和ognl

image.png

常見問題解析

  1. 獲取自增主鍵值:
    userGeneratedKey="true" 梗劫,將自增主鍵設為true
    keyProperty=""享甸,將自增的主鍵與java屬性對應,以便獲取自增的主鍵值
  2. 沒配置主配置文件出的異常


    image.png
  3. sql語法錯誤排查梳侨,復制進mysql中執(zhí)行
  4. 不要過度使用${} 馍佑,有可能習慣用在java寫sql語句剑逃,然后將它傳進xml中直接用${}調(diào)用,這樣會維護困難,因為一部分sql在java中云茸,一部分在xml中。(注解sql)
  5. 亂碼舶替。
  • 文件本身的編碼
  • jsp設置的編碼
  • servlet用來接受頁面?zhèn)髦档木幋a
  • 用get提交中文的話tomcat也要設置編碼

如果還有亂碼

  • mybatis主配置文件豆赏,數(shù)據(jù)庫url加上編碼方式 ?useUnicode=true&characterEncoding=utf8

  • mysql安裝后的配置的編碼要統(tǒng)一

  • 建立數(shù)據(jù)庫的編碼,表的編碼

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晒旅,一起剝皮案震驚了整個濱河市栅盲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌废恋,老刑警劉巖谈秫,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鱼鼓,居然都是意外死亡拟烫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門迄本,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕淑,“玉大人,你說我怎么就攤上這事岸梨∠舶洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵曹阔,是天一觀的道長半开。 經(jīng)常有香客問我,道長赃份,這世上最難降的妖魔是什么寂拆? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任奢米,我火速辦了婚禮,結果婚禮上纠永,老公的妹妹穿的比我還像新娘鬓长。我一直安慰自己,他們只是感情好尝江,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布涉波。 她就那樣靜靜地躺著,像睡著了一般炭序。 火紅的嫁衣襯著肌膚如雪啤覆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天惭聂,我揣著相機與錄音窗声,去河邊找鬼。 笑死辜纲,一個胖子當著我的面吹牛笨觅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耕腾,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼见剩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幽邓?” 一聲冷哼從身側響起炮温,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牵舵,沒想到半個月后柒啤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡畸颅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年担巩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片没炒。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涛癌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出送火,到底是詐尸還是另有隱情拳话,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布种吸,位于F島的核電站弃衍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坚俗。R本人自食惡果不足惜镜盯,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一岸裙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速缆,春花似錦降允、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倦踢,卻和暖如春送滞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辱挥。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留边涕,地道東北人晤碘。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像功蜓,于是被迫代替她去往敵國和親园爷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis 式撼? MyBatis 是支持定制化 SQL童社、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,520評論 0 4
  • 第一章 案例簡介 設計類似微信公眾號的自動回復功能 準備工作JSP JSTL EL JS...
    qezhhnjy閱讀 956評論 0 0
  • 【又到了一年一度討薪節(jié)了】醒醒吧,我的親們著隆,別發(fā)羨慕的朋友圈扰楼,救救苦命的農(nóng)民工吧 每到年終,工資拖欠問題一直沒有很...
    笑之生閱讀 406評論 2 1
  • 最近的電視劇,《那年花開月正圓》鬧得那么火浦辨,我禁不住誘惑蹬竖,所以十一長假我也追了好幾集。 特地我還查了周瑩的原型流酬,當...
    李晴天閱讀 202評論 1 1