慕課網(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里
代碼重構:
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>
應用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
list.jsp頁面
只有一個form螃成,action是自己
刪除旦签,增加是servlet鏈接,servlet處理完后請求轉發(fā)到list.jsp
批量刪除按鈕用js將form的action改為servlet寸宏。提交
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
常見問題解析
- 獲取自增主鍵值:
userGeneratedKey="true" 梗劫,將自增主鍵設為true
keyProperty=""享甸,將自增的主鍵與java屬性對應,以便獲取自增的主鍵值 -
沒配置主配置文件出的異常
image.png - sql語法錯誤排查梳侨,復制進mysql中執(zhí)行
- 不要過度使用${} 馍佑,有可能習慣用在java寫sql語句剑逃,然后將它傳進xml中直接用${}調(diào)用,這樣會維護困難,因為一部分sql在java中云茸,一部分在xml中。(注解sql)
- 亂碼舶替。
- 文件本身的編碼
- jsp設置的編碼
- servlet用來接受頁面?zhèn)髦档木幋a
- 用get提交中文的話tomcat也要設置編碼
如果還有亂碼
mybatis主配置文件豆赏,數(shù)據(jù)庫url加上編碼方式 ?useUnicode=true&characterEncoding=utf8
mysql安裝后的配置的編碼要統(tǒng)一
建立數(shù)據(jù)庫的編碼,表的編碼