随堂笔记_2
MAVEN
maven三大組件如何協(xié)同
1.依賴(lài)
maven高級(jí)依賴(lài)原則之二:聲明順序依賴(lài)
2.mybatis高級(jí)映射column屬性如何傳遞多個(gè)值?
子查詢(xún)調(diào)用
3.因?yàn)楫?dāng)前應(yīng)用的MyBatis3&Spring5這兩個(gè)版本較高版本框架對(duì)環(huán)境有要求
會(huì)造成以下影響
因?yàn)楫?dāng)前環(huán)境下的maven其實(shí)用的JDK版本不是1.8所以要設(shè)置jdk版本為1.8
- 局部配置
- 全局配置
4.mybatis與spring整合,applicationContext.xml中設(shè)置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--1、關(guān)聯(lián)數(shù)據(jù)資源屬性文件--><context:property-placeholder location="classpath:config.properties"/><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${conn.driverclass}"/><property name="url" value="${conn.url}"/><property name="username" value="${conn.username}"/><property name="password" value="${conn.userpass}"/></bean><!--3、配置sqlsessionfactory bean--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="druidDataSource"/><property name="mapperLocations" value="classpath*:*Mapper.xml"/><property name="typeAliasesPackage" value="com.yyjc.spring.pojo"/></bean>5.spring配置-mybatis基于mapper接口動(dòng)態(tài)代理生成實(shí)現(xiàn)類(lèi)并注入
- 使用mybaitis的mapper接口執(zhí)行sql語(yǔ)句時(shí),我們拿到其實(shí)是接口實(shí)現(xiàn)類(lèi)的代理,這個(gè)代理類(lèi)是由mybatis使用動(dòng)態(tài)代理生成的接口實(shí)現(xiàn)類(lèi)。
- mybatis通過(guò)配置 MapperFactoryBean來(lái)生成Mapper接口的代理。如:
上面這種配置的缺點(diǎn)是為每一個(gè)mapper接口都要加入配置,因此有了使用MapperScannerConfigurer,它會(huì)將包下的每個(gè)mapper接口都自動(dòng)創(chuàng)建MapperFactoryBean,無(wú)需自己?jiǎn)为?dú)添加,MapperScannerConfigurer的配置如下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mapper" /><!-- 無(wú)需在此指定SqlSessionFactory或SqlSessionTemplate , 因?yàn)?MapperScannerConfigurer將會(huì)創(chuàng)建MapperFactoryBean之后自動(dòng)裝配。可以使用 sqlSessionFactoryBeanName或sqlSessionTemplateBeanName 屬性來(lái)設(shè)置正確的bean 名稱(chēng) --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean>下面是一個(gè)更簡(jiǎn)單的配置
<mybatis:scan base-package="com.example.mapper"/>在此框架中獲取動(dòng)態(tài)代理的實(shí)現(xiàn)類(lèi)的bean的id:即為實(shí)現(xiàn)接口的駝峰法名稱(chēng),但也有問(wèn)題
eg:接口(IEmplo),id(iEmplo),
? 以上會(huì)報(bào)錯(cuò):
現(xiàn)階段:不以大寫(xiě)I開(kāi)頭的遵循駝峰法即可
6.開(kāi)啟事務(wù)的幾種方式:
sqlSessionFactory.sessionOpen(true); sqlSession.commit(); 基于注解開(kāi)啟事務(wù)在要開(kāi)啟事務(wù)的方法上用以下該方法級(jí)別的注解@Transactional(rollbackFor = Throwable.class)7.基于mybatis注解實(shí)現(xiàn)關(guān)聯(lián)映射
1.pojo類(lèi)要實(shí)現(xiàn)序列化接口(Serializable)
①【在主配置文件中的映射配置文件沒(méi)了怎么配置?】
基于mapper接口動(dòng)態(tài)代理【把接口當(dāng)映射配置文件看】
<mappers><mapper class="com.yyjc.mybatis.daoInter.EmployeeDaoInter"/></mappers>class指向的是接口的字節(jié)碼文件
②【字段名和pojo屬性的關(guān)聯(lián)】
@Results(value={@Result(id=true,column="",property=""),@Result(column="",property=""),@Result(column="",property="")} )③@Results中字段名和pojo已經(jīng)關(guān)聯(lián)了如何重用呢?
在本類(lèi)中重用
在本類(lèi)中的其它方法重用(在@Results中設(shè)置id[唯一標(biāo)識(shí)符],在想要重用此注解的方法外用@ResultMap其值等于id即可[value=“id”])注:其他類(lèi)引用時(shí)只能是其方法名
/*根據(jù)員工編號(hào)查詢(xún)員工信息*/@Select(value="select * from employees where employee_id=#{emId}")@Results(id = "selectOne",value ={@Result(id=true,column = "employee_id",property = "employeeId"),@Result(column = "first_name",property = "firstName"),............})Employee selectOne(int emId);@Select(value="select * from employees where employee_id=#{emId}")@ResultMap(value = "selectOne")Employee test(int emId);在其他類(lèi)中重用
一對(duì)多分布式關(guān)聯(lián)映射查詢(xún)EmployeeDaoInter: @Select(value="select * from employees where department_id=#{departId}")@ResultMap( /*重用@Results */value = "commonsResult")List<Employee> selectEmployeeList(int departId);DepartmentDaoInter: @Result(column = "department_id",property = "employeesList",many = @Many(select = "com.yyjc.mybatis.daoInter.EmployeeDaoInter.selectEmployeeList"))④注解中設(shè)置加載 的方式
全局加載(懶):第一步:在主配置文件開(kāi)啟延時(shí)加載<setting name="lazyLoadingEnabled" value="true"/> <!--把積極加載改為按需加載--><setting name="aggressiveLazyLoading" value="false"/> 局部:懶加載:延時(shí)加載 @Result(column = "department_id",property = "employeesList",many = @Many(select = "com.yyjc.mybatis.daoInter.EmployeeDaoInter.selectEmployeeList",fetchType = FetchType.LAZY))} 立即加載:默認(rèn)的加載方式@Result(column = "department_id",property = "employeesList",many = @Many(select = "com.yyjc.mybatis.daoInter.EmployeeDaoInter.selectEmployeeList",fetchType = FetchType.EAGER))}延遲加載
1.全局延遲加載:在主配置文件的設(shè)置
2.局部延遲加載,在映射文件中設(shè)置
效果
8.mybatis基于映射配置文件二級(jí)緩存如何配置
①存配置
要正確的使用二級(jí)緩存,需完成如下配置的。
cache標(biāo)簽用于聲明這個(gè)namespace使用二級(jí)緩存,并且可以自定義配置。
<cache/>- type:cache使用的類(lèi)型,默認(rèn)是PerpetualCache,這在一級(jí)緩存中提到過(guò)。
- eviction: 定義回收的策略,常見(jiàn)的有FIFO(先入先出),LRU。
- flushInterval: 配置一定時(shí)間自動(dòng)刷新緩存,單位是毫秒。
- size: 最多緩存對(duì)象的個(gè)數(shù)。
- readOnly: 是否只讀,若配置可讀寫(xiě),則需要對(duì)應(yīng)的實(shí)體類(lèi)能夠序列化。
- blocking: 若緩存中找不到對(duì)應(yīng)的key,是否會(huì)一直blocking,直到有對(duì)應(yīng)的數(shù)據(jù)進(jìn)入緩存。
cache-ref代表引用別的命名空間的Cache配置,兩個(gè)命名空間的操作使用的是同一個(gè)Cache。
<cache-ref namespace="mapper.StudentMapper"/>當(dāng)開(kāi)啟緩存后,數(shù)據(jù)的查詢(xún)執(zhí)行的流程就是 二級(jí)緩存 -> 一級(jí)緩存 -> 數(shù)據(jù)庫(kù)。
②緩存中相關(guān)屬性介紹
select元素中的屬性
? useCache="true|or"默認(rèn)為true
一級(jí)緩存無(wú)效,二級(jí)緩存有效
?
? select flushC、e="默認(rèn)為false"清理緩存,一二級(jí)緩存都會(huì)受到影響。
insrt/delete/update flushCache="默認(rèn)為true"清理緩存,一二級(jí)緩存都會(huì)受到影響。
sqlSession.clearCache();只清除一級(jí)緩存
第三方緩存配置文件的defaultCache元素的屬性意思
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><!-- 磁盤(pán)保存路徑 --><diskStore path="E:\" />defaultCache:默認(rèn)的緩存配置信息,如果不加特殊說(shuō)明,則所有對(duì)象按照此配置項(xiàng)處理maxElementsInMemory:設(shè)置了緩存的上限,最多存儲(chǔ)多少個(gè)記錄對(duì)象eternal:代表對(duì)象是否永不過(guò)期timeToIdleSeconds:最大的發(fā)呆時(shí)間timeToLiveSeconds:最大的存活時(shí)間overflowToDisk:是否允許對(duì)象被寫(xiě)入到磁盤(pán)<defaultCachemaxElementsInMemory="10000"maxElementsOnDisk="10000000"eternal="false"overflowToDisk="true"timeToIdleSeconds="120"timeToLiveSeconds="120"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache> </ehcache>9.基于mybatis注解和主配置文件開(kāi)啟和使用二級(jí)緩存
1.在主配置文件中開(kāi)啟緩存【默認(rèn)是開(kāi)啟的可以不寫(xiě)】 <setting name="cacheEnabled" value="true"/>2.在要使用二級(jí)緩存的類(lèi)前加入類(lèi)注解開(kāi)啟 二級(jí)緩存```開(kāi)啟二級(jí)緩存 @CacheNamespace(blocking = true)序列化和反序列化
Java序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程,而Java反序列化是指把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程:(就像是加密和解密的過(guò)程一樣)
10.pojo實(shí)現(xiàn)序列化
是==對(duì)象永久化的一種機(jī)制==。
確切的說(shuō)應(yīng)該是對(duì)象的序列化,一般程序在運(yùn)行時(shí),產(chǎn)生對(duì)象,這些對(duì)象隨著程序的停止運(yùn)行而消失,但如果我們想把某些對(duì)象(因?yàn)槭菍?duì)象,所以有各自不同的特性)保存下來(lái),==在程序終止運(yùn)行后,這些對(duì)象仍然存在,可以在程序再次運(yùn)行時(shí)讀取這些對(duì)象的值,或者在其他程序中利用這些保存下來(lái)的對(duì)象。==這種情況下就要用到對(duì)象的序列化。
11.JDBC操作數(shù)據(jù)庫(kù)的步驟
加載并注冊(cè)驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver"); 基于驅(qū)動(dòng)管理類(lèi)創(chuàng)建連接對(duì)象Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbName",userName,passWord); 定義待執(zhí)行的SQL語(yǔ)句String sql="insert/delete/update"or"select"; 基于連接對(duì)象創(chuàng)建【預(yù)編譯】命令語(yǔ)句對(duì)象①Statement statement=conn.createStatement();②PreparedStatement statement=conn.prepareStatement(sql)12.數(shù)據(jù)庫(kù)事務(wù)
? 并發(fā):理解(一群人打一個(gè)球)
? 并行:理解(每個(gè)人都有一個(gè)球)
①把DOS命令窗口切換成MySQL窗口
mysql -uroot -p0610mysql -u[數(shù)據(jù)庫(kù)用戶(hù)賬戶(hù)] -p[數(shù)據(jù)庫(kù)用戶(hù)密碼]退出mysql窗口返回DOS窗口quit/exit②MySQL命令行操作常用命令【重點(diǎn)】
1、通過(guò)命令行窗口連接MySQL服務(wù)mysql -uroot -proot;2、查看當(dāng)前所有數(shù)據(jù)庫(kù)show databases;3、使用指定數(shù)據(jù)庫(kù)use databasename; (use myemployees)4、查看當(dāng)前使用的數(shù)據(jù)庫(kù)select database();5、查看MySQL數(shù)據(jù)庫(kù)的引擎show engines;6、查看當(dāng)前數(shù)據(jù)庫(kù)的所有表show tables;7、查看指定表的結(jié)構(gòu)desc employees;8、查看當(dāng)前自動(dòng)提交事務(wù)的狀態(tài)show variables like 'autocommit'; (ON表啟用 ,OFF表禁用)9、設(shè)置當(dāng)前自動(dòng)事務(wù)的狀態(tài)set autocommit = 0 | 1 ;10、查看當(dāng)前MySQL數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別select @@tx_isolation;11、設(shè)置當(dāng)前會(huì)話事務(wù)隔離級(jí)別set session|global transaction isolation level 隔離級(jí)別;③事務(wù)的并發(fā)問(wèn)題
3.1 臟讀
事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
3.2 不可重復(fù)讀
事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過(guò)程中,
對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果 不一致。
3.3 幻讀
系統(tǒng)管理員A將數(shù)據(jù)庫(kù)中所有學(xué)生的成績(jī)從具體分?jǐn)?shù)改為ABCDE等級(jí),
但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,
當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒(méi)有改過(guò)來(lái),
就好像發(fā)生了幻覺(jué)一樣,這就叫幻讀。
④事務(wù)的隔離級(jí)別
. 事務(wù)隔離級(jí)別存在的意義:在一定的層面上避免事務(wù)并發(fā)引發(fā)的問(wèn)題
4.1 讀未提交(read-uncommitted)
4.2 已提交讀(不可重復(fù)讀)(read-committed)
4.3 可重復(fù)讀(repeatable-read)
4.4 串行化(serializable)(序列化)
面試題:事務(wù)并發(fā)與事務(wù)隔離級(jí)別的聯(lián)系?
答:因?yàn)橛惺聞?wù)并發(fā)影響才會(huì)導(dǎo)致出現(xiàn)事務(wù)隔離級(jí)別來(lái)解決它;事務(wù)隔離級(jí)別能在一定層面上避免事務(wù)并發(fā)引發(fā)的問(wèn)題
--------------------------------------------------------| 事務(wù)隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |------------------------------------------------------| 讀未提交(read-uncommitted)| 是 | 是 | 是 |------------------------------------------------------| 不可重復(fù)讀(read-committed)| 否 | 是 | 是 |------------------------------------------------------| 可重復(fù)讀(repeatable-read) | 否 | 否 | 是 |------------------------------------------------------| 串行化(serializable) | 否 | 否 | 否 | ------------------------------------------------------13.http中post和get的區(qū)別
都是http(超文本傳輸協(xié)議)中瀏覽器與服務(wù)器交互的方法。
HTTP協(xié)議中定義了瀏覽器和服務(wù)器進(jìn)行交互的不同方法,基本方法有4種,分別是GET,POST,PUT,DELETE。這四種方法可以理解為,對(duì)服務(wù)器資源的查,改,增,刪。
GET:從服務(wù)器上獲取數(shù)據(jù),也就是所謂的查,僅僅是獲取服務(wù)器資源,不進(jìn)行修改。
POST:向服務(wù)器提交數(shù)據(jù),這就涉及到了數(shù)據(jù)的更新,也就是更改服務(wù)器的數(shù)據(jù)。
PUT:PUT的英文含義是放置,也就是向服務(wù)器新添加數(shù)據(jù),就是所謂的增。
DELETE:從字面意思也能看出,這種方式就是刪除服務(wù)器數(shù)據(jù)的過(guò)程。
其實(shí)get和post的區(qū)別不大,比如說(shuō)安全方面,get請(qǐng)求參數(shù)在URL地址上會(huì)直接暴露出來(lái),post請(qǐng)求參數(shù)放在request body部分,通過(guò)F12也可以看見(jiàn),他們的安全性其實(shí)差不多,再加上http底層是TCP/IP,所以get和post的底層也是TCP/IP,也就是說(shuō),post和get都是TCP鏈接,他們之間能做的事情是一樣的,你要給GET加上request body,給POST帶上url參數(shù),技術(shù)上是完全行的通的。 但是由于HTTP的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們?cè)趹?yīng)用過(guò)程中體現(xiàn)一些不同:
? 如get產(chǎn)生一個(gè)TCP數(shù)據(jù)包,post產(chǎn)生兩個(gè)數(shù)據(jù)包。
詳細(xì)的來(lái)說(shuō)就是:對(duì)于get的請(qǐng)求,瀏覽器會(huì)把HTTP header和data一并發(fā)送過(guò)去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))。而對(duì)于post的請(qǐng)求,瀏覽器會(huì)先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再次發(fā)送data,服務(wù)器響應(yīng)200。
舉個(gè)例子來(lái)說(shuō)就是:比如說(shuō)送貨,get方式只需一趟就把貨送到。而post得跑兩趟,第一趟,過(guò)去跟服務(wù)器打個(gè)招呼,告訴他等會(huì)會(huì)送貨過(guò)來(lái),讓他打開(kāi)門(mén)迎接,第二趟,則是把貨送了過(guò)來(lái)。
因?yàn)閜ostT需要兩步,時(shí)間上消耗的要多一點(diǎn),看起來(lái)GET比POST更有效。其實(shí)這并不一定,
\1. GET與POST都有自己的語(yǔ)義,不能隨便混用。
\2. 據(jù)研究,在網(wǎng)絡(luò)環(huán)境好的情況下,發(fā)一次包的時(shí)間和發(fā)兩次包的時(shí)間差別基本可以無(wú)視。而在網(wǎng)絡(luò)環(huán)境差的情況下,兩次包的TCP在驗(yàn)證數(shù)據(jù)包完整性上,有非常大的優(yōu)點(diǎn)。
\3. 并不是所有瀏覽器都會(huì)在POST中發(fā)送兩次包,Firefox就只發(fā)送一次。
14.Redis如何設(shè)置密碼及驗(yàn)證密碼?
設(shè)置密碼:config set requirepass 123456
授權(quán)密碼:auth 123456
總結(jié)
- 上一篇: log4j监控mybatis的普通配置
- 下一篇: maven web项目中的web.xml