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