摘要:解決這個(gè)問(wèn)題方案是定義一份結(jié)果映射文件如下所示動(dòng)態(tài)的注解對(duì)于動(dòng)態(tài),提供了不同的注解,用法如下所示首先創(chuàng)建一個(gè)類使用類但是使用字符串連接創(chuàng)建語(yǔ)句容易出現(xiàn)問(wèn)題,所以提供了一個(gè)工具,簡(jiǎn)化了構(gòu)建動(dòng)態(tài)的方式如下所示或者
結(jié)果集分頁(yè)
有時(shí)我們需要處理海量數(shù)據(jù),由于數(shù)據(jù)量太大,所以不能一次取出所有的數(shù)據(jù),這時(shí)我們就需要使用分頁(yè)功能。mybatis通過(guò)RowBounds對(duì)象提供對(duì)分頁(yè)的支持,如下所示: int offset=0;//開(kāi)始位置 int limit=25;//取出的數(shù)據(jù)條數(shù) RowBounds rowBounds=new RowBounds(offset,limit); List結(jié)果處理器list=studentMapper.findAllStudent(rowBounds);
有時(shí)我們需要對(duì)查詢結(jié)果做一些特殊的處理,這個(gè)時(shí)候就需要結(jié)果處理器,舉例如下,我們通過(guò)sql查詢學(xué)生的stud_id和name,并期望返回一個(gè)map,其中key是stud_id,value是name. 新建一個(gè)接口: public interface ResultHandler { void handleResult(ResultContext context); } 主要處理流程: Map緩存map=new HashMap (); SqlSession sqlSession=MyBatisUtil.openSession(); sqlSession.select("com.mybatis3.mappers.StudentMapper.findAllStudents",new ResultHandler(){ public void handlerResult(ResultContext context) { Student student=(Student)context.getResultObject(); map.put(student.getStudId(),student.getName()); } })
緩存對(duì)于很多應(yīng)用來(lái)說(shuō)都是很重要的,因?yàn)樗芴岣呦到y(tǒng)的性能。mybatis內(nèi)建了緩存支持,默認(rèn)情況下,一級(jí)緩存是打開(kāi)的,即如果你使用相同的sqlSession接口調(diào)用相同的select查詢,查詢結(jié)果從緩存中取得而不是去查詢數(shù)據(jù)庫(kù)。 也可以通過(guò)注解@Insert @Update @Select @ Delete標(biāo)簽配置二級(jí)緩存。當(dāng)配置了二級(jí)緩存后,也就意味著所有的查詢結(jié)果都會(huì)被緩存,insert,update,delete語(yǔ)句會(huì)更新緩存,cache的緩存管理算法是LRU。除了內(nèi)建的緩存之外,mybatis還整合了第三方緩存框架例如Ehcache等。
舉例說(shuō)明注解的用法: public interface StudentMapper { @Insert("insert into student (stud_id, name, email, addr_id, phone)values(#{studId},#{name},#{email},#{address.addrId},#{phone})") int insertStudent(Student student); } public interface StudentMapper { @Insert("insert into student (name,email,addr_id,phone)values(#{name},#{email},#{address.addrId},#{phone})") @Options(useGeneratedKeys=true,keyProperty="studId") int insertStudent(Student student); } public interface StudentMapper { @Insert("insert into student (name,email,addr_id,phone)values(#{name},#{email},#{address.addrId},#{phone})") @SelectKey(statement="select stud_id_seq.nextval from dual",keyProperty="studId",resultType=int.calss,before=true) int insertStudent(Student student); } @Update("update students set name=#{name},email=#{email}") int updateStudent(Student student); @Delete("delete form students where stud_id=#{studId}") int deleteStudent(int studId) @Select("select name,email,phone from students where stud_id=#{studId}") Student findStudentById(Integer studId);結(jié)果注解
@Select("select name,email,phone from students where stud_id=#{studId}") @Results({ @Result(id=true,column="stud_id",property="studId"), @Result(column="name",property="name"), @Result(column="email",property="email"), @Result(column="phone",property="phone") }) Student findStudentById(Integer studId); 結(jié)果注解有一個(gè)缺點(diǎn),就是在一個(gè)查詢方法前面都要寫(xiě)一遍,不能重用。解決這個(gè)問(wèn)題方案是: 定義一份結(jié)果映射文件如下所示:動(dòng)態(tài)Sql的注解....... @Select("select name,email,phone from students where stud_id=#{studId}") @ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult") Student findStudentById(Integer studId);
對(duì)于動(dòng)態(tài)sql,mybatis提供了不同的注解,@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider 用法如下所示: 首先創(chuàng)建一個(gè)provider類: public class SqlProvider { public String findTutorById(int tutorId) { return "select tutorId,name,email from tutors where tutorId="+tutorId; } } 使用provider類: @SelectProvider(type=SqlProvider.class,method="findTutorById") Tutor findTutorById(int tutorId); 但是使用字符串連接創(chuàng)建sql語(yǔ)句容易出現(xiàn)問(wèn)題,所以mybatis提供了一個(gè)SQL工具,簡(jiǎn)化了構(gòu)建動(dòng)態(tài)Sql的方式; 如下所示: public class SqlProvider { public String findTutorById(int tutorId) { return new SQL(){{ SELECT("tutorid,name,email") FROM("tutors") WHERE("tutorid="+tutorId) }}.toString(); } } 或者 public class SqlProvider { public String findTutorById() { return new SQL(){{ SELECT("tutorid,name,email") FROM("tutors") WHERE("tutorid=#{tutorId}") }}.toString(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70208.html
摘要:執(zhí)行沒(méi)有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個(gè)對(duì)象,每個(gè)對(duì)象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見(jiàn)面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來(lái)的參數(shù)數(shù)據(jù) ${}對(duì)傳遞進(jìn)來(lái)的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:最終能和面試官聊的開(kāi)心愉快投緣的叫面霸。能夠與很好的集成提供映射標(biāo)簽,支持對(duì)象與數(shù)據(jù)庫(kù)的字段關(guān)系映射提供對(duì)象關(guān)系映射標(biāo)簽,支持對(duì)象關(guān)系組件維護(hù)。使用可以有效的防止注入,提高系統(tǒng)安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面試,難還是不難?取決于面試者的底蘊(yùn)(氣場(chǎng)+技能)、心態(tài)和認(rèn)知及溝通技巧。...
摘要:跳槽時(shí)時(shí)刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個(gè)個(gè)都走了,自己也盲目的開(kāi)始面試起來(lái)期間也沒(méi)有準(zhǔn)備充分,到底是因?yàn)榧夹g(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時(shí)時(shí)刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個(gè)個(gè)都走了,自己也盲目的開(kāi)始面試起來(lái)(期間也沒(méi)有準(zhǔn)備充分),到底是因?yàn)榧?..
摘要:語(yǔ)句在代碼中硬編碼,造成代碼不易于維護(hù),實(shí)際應(yīng)用變化的可能較大,變動(dòng)需要改變代碼。對(duì)結(jié)果集解析存在硬編碼查詢列名,變化導(dǎo)致解析代碼變化,系統(tǒng)不易于維護(hù),如果能將數(shù)據(jù)庫(kù)記錄封裝成對(duì)象解析比較方便。 MyBatis理解與掌握(簡(jiǎn)介) @(MyBatis)[Java, 框架, MyBatis] 簡(jiǎn)介 ??Mybatis是一個(gè)數(shù)據(jù)持久層框架,MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手...
摘要:提供映射標(biāo)簽,支持對(duì)象與數(shù)據(jù)庫(kù)的字段關(guān)系映射提供對(duì)象關(guān)系映射標(biāo)簽,支持對(duì)象關(guān)系組建維護(hù)提供標(biāo)簽,支持編寫(xiě)動(dòng)態(tài)。層實(shí)現(xiàn)類添加更新刪除根據(jù)查詢查詢所有的層構(gòu)建測(cè)試結(jié)果其他接口已通過(guò)測(cè)試,無(wú)問(wèn)題。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人如有問(wèn)題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問(wèn)題。 前言 如題,今天介紹 SpringBoot 與 Mybatis 的整合以及 Mybatis 的使用,本文通過(guò)注解的形式...
閱讀 3246·2021-11-24 10:43
閱讀 4209·2021-11-24 10:33
閱讀 3789·2021-11-22 09:34
閱讀 2136·2021-10-11 10:58
閱讀 3757·2021-10-11 10:58
閱讀 870·2021-09-27 13:36
閱讀 3588·2019-08-30 15:54
閱讀 2975·2019-08-29 18:41