40.MyBaits懒加载、一二级缓存、模糊查询、分页查询、动态SQL
MyBaits_Day04
第一節(jié)、作業(yè)
<!-- 對(duì)getAllCateAndGoods做實(shí)現(xiàn)--><select id="getAllCateAndGoods" resultMap="cateAndGoods">SELECT * FROM category;</select><!-- type表示resultMap是在封裝誰(shuí)的對(duì)象 --><resultMap type="category" id="cateAndGoods"><id property="cid" column="cid"/><!-- allGoods是一個(gè)list集合 myBatis不能自動(dòng)封裝--><!--對(duì)應(yīng)list類型 我們用collection --><collection property="allGoods" ofType="goods" select="getGoodsByCid" column="cid"></collection></resultMap><select id="getGoodsByCid" resultType="goods">SELECT * FROM goods WHERE cid=#{cid};</select> private int cid;private String cname;//每一個(gè)分類下對(duì)應(yīng)的商品//分析:一個(gè)商品分類下面有多個(gè)商品--一對(duì)多--一個(gè)分類下有多個(gè)商品(多個(gè)-集合)private List<Goods> allGoods;第二節(jié)、MyBatis做級(jí)聯(lián)查詢的時(shí)候的懶加載
什么是懶加載:按需加載
場(chǎng)景:我頁(yè)面上只需要顯示分類,當(dāng)用戶選中某個(gè)分類的時(shí)候,才去加載商品
版本一:(沒(méi)有開(kāi)啟懶加載)每次頁(yè)面進(jìn)來(lái),只要調(diào)用接口,會(huì)查詢分類同時(shí)也查詢分類下的商品
解決:開(kāi)啟懶加載
方法一:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-u8bTsIQd-1631707125142)(C:\Users\王元元\AppData\Roaming\Typora\typora-user-images\image-20210904192103279.png)]
方法二:
<collection property="allGoods" ofType="goods" select="getGoodsByCid" column="cid" fetchType="lazy"></collection>=什么叫關(guān)聯(lián)對(duì)象:
查分類及其分類的商品的時(shí)候,每一個(gè)分類下對(duì)應(yīng)的商品就是關(guān)聯(lián)對(duì)象
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-WS0M0PPZ-1631707125143)(C:/Program%20Files/Typora/upload/image-20210904101652038.png)]
第三節(jié)、MyBatis中緩存
什么叫緩存:
緩存的作用:
1、提高訪問(wèn)的效率(緩存放在內(nèi)存)
2、減小數(shù)據(jù)庫(kù)的壓力
3、緩存有一個(gè)過(guò)期時(shí)間
MyBaits中緩存
一級(jí)緩存:sqlSession(通一個(gè)SqlSession的操作會(huì)觸發(fā)緩存 默認(rèn)開(kāi)啟的)
SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession(); CategoryMapper mapper = sqlSession.getMapper(CategoryMapper.class); List<Category> allCateAndGoods = mapper.getAllCateAndGoods(); sqlSession.clearCache();//清除緩存 CategoryMapper mapper2 = sqlSession.getMapper(CategoryMapper.class); List<Category> allCateAndGoods2 = mapper.getAllCateAndGoods(); System.out.println(allCateAndGoods==allCateAndGoods2);//地址比較二級(jí)緩存:基于mapper(同一個(gè)mapper下的操作觸發(fā)緩存)
開(kāi)啟二級(jí)緩存的步驟:
1、全局配置文件中開(kāi)啟緩存
<setting name="cacheEnabled" value="true"/>2、需要開(kāi)啟二級(jí)緩存mapper開(kāi)啟緩存
3、mapper中操作的實(shí)體類實(shí)現(xiàn)序列化接口
注意點(diǎn):如果實(shí)體類中有關(guān)聯(lián)對(duì)象,關(guān)聯(lián)對(duì)象也需要實(shí)現(xiàn)序列化接口
public class Category implements Serializable{第四節(jié)、模糊查詢
直接將模糊的條件傳入即可
<select id="getGoodByLike" resultType="goods">SELECT * FROM goods WHERE name LIKE #{name} </select> SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession(); GoodsMapper mapper = sqlSession.getMapper(GoodsMapper.class); List<Goods> goodByLike = mapper.getGoodByLike("%紅%");//直接將模糊條件傳入即可 for (Goods goods : goodByLike) {System.out.println(goods); }第五節(jié)、分頁(yè)查詢
方式一、
1、在Mapper中直接通過(guò)SQL實(shí)現(xiàn)(DAO)
<select id="getGoodsBylimit" resultType="goods">SELECT * FROM goods limit #{start},#{pagesize} </select>2、在Service層調(diào)用DAO層(需要將前臺(tái)傳入?yún)?shù)做計(jì)算)
SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession(); GoodsMapper mapper = sqlSession.getMapper(GoodsMapper.class);//查第幾頁(yè) 每頁(yè)的條數(shù) controller -->service-->dao List<Goods> goodsBylimit = mapper.getGoodsBylimit(2, 2);3、數(shù)據(jù)來(lái)源從頁(yè)面上來(lái)–接收是通過(guò)Controller
注意:分頁(yè)的計(jì)算方式: (pagenum-1)*pageSize, pageSize
方式二、通過(guò)PageHelper實(shí)現(xiàn)
pageHelper是MyBaits一個(gè)分頁(yè)插件
環(huán)境搭建:
1、導(dǎo)入依賴pagehelper-5.1.2.jar jsqlparser-1.0.jar
2、在全局配置文件中使用pageHelper的插件
<plugins><!-- com.github.pagehelper為PageHelper類所在包名 --><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins>3、使用—Service層
//1.配置分頁(yè)pageNum 第幾頁(yè) pageSize 每一頁(yè)多少條 PageHelper.startPage(2, 2); SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession(); GoodsMapper mapper = sqlSession.getMapper(GoodsMapper.class); List<Goods> allGoods = mapper.getAllGoods();//通過(guò)pageInfo對(duì)象進(jìn)行分頁(yè) PageInfo<Goods> pageInfo = new PageInfo<>(allGoods);List<Goods> list = pageInfo.getList(); for (Goods goods : list) {System.out.println(goods); } System.out.println(pageInfo.getTotal());//獲取數(shù)據(jù)的總數(shù) System.out.println(pageInfo.getPrePage());//pageInfo 封裝分頁(yè)的一些信息第六節(jié)、動(dòng)態(tài)SQL
動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過(guò) JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài) SQL,可以徹底擺脫這種痛苦。
if標(biāo)簽
<if test="title != null">規(guī)則:如果if中條件滿足,則將if標(biāo)簽SQL進(jìn)行拼接
<!--如果條件指?jìng)魑也鸥鶕?jù)傳入的條件進(jìn)行查詢什么都不傳 查所有如:頁(yè)面?zhèn)髁嗣?按照名字查頁(yè)面?zhèn)髁嗣趾偷刂? 按名字和地址...--> SELECT * FROM goods WHERE 1=1 <if test="name!=null and name!=''">AND name=#{name} </if> <if test="location!=null and location!=''">AND location=#{location} </if> <if test="price!=null and price!=0">AND price > #{price} </if> </select>choose、when、otherwise
作用:類似于JAVA中switch
<select id="getGoods" resultType="goods">SELECT * FROM goods WHERE 1=1<choose><when test="name!=null and name!=''">AND name=#{name}</when><when test="location!=null and location!=''">AND name=#{name}</when><otherwise>ORDER BY price DESC;</otherwise></choose> </select>[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Ehi7cAvV-1631707125150)(upload/image-20210904154728332.png)]
where
<select id="getGoods" resultType="goods">SELECT * FROM goods <where><if test="name!=null and name!=''">AND name=#{name}</if><if test="location!=null and location!=''">AND location=#{location}r</if></where>set
<update id="getGoods">update goods<set><if test="name!=null and name!=''">name=#{name},</if><if test="location!=null and location!=''">location=#{location},</if> </set>WHERE id=#{id} </update>trim標(biāo)簽----自定義標(biāo)簽
foreach標(biāo)簽 -----遍歷list或者map集合
/if>
location=#{location},
WHERE id=#{id}
總結(jié)
以上是生活随笔為你收集整理的40.MyBaits懒加载、一二级缓存、模糊查询、分页查询、动态SQL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何查看chrome浏览器插件位置
- 下一篇: java endian_java的lit