mybatis中注解映射SQL示例代碼
前言
本文主要給大家介紹了關(guān)于mybatis注解映射SQL的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹:
結(jié)果集分頁(yè)
有時(shí)我們需要處理海量數(shù)據(jù),由于數(shù)據(jù)量太大,所以不能一次取出所有的數(shù)據(jù),這時(shí)我們就需要使用分頁(yè)功能。mybatis通過(guò)RowBounds對(duì)象提供對(duì)分頁(yè)的支持,如下所示:
<select id="findAllStudents" resultMap="StudentResult"> select * from studdents </select> int offset=0;//開(kāi)始位置 int limit=25;//取出的數(shù)據(jù)條數(shù) RowBounds rowBounds=new RowBounds(offset,limit); List<Student> list=studentMapper.findAllStudent(rowBounds);
結(jié)果處理器
有時(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<Integer , String> map=new HashMap<Integer,String>(); 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ò)<cache>標(biāo)簽配置二級(jí)緩存。當(dāng)配置了二級(jí)緩存后,也就意味著所有的查詢結(jié)果都會(huì)被緩存,insert,update,delete語(yǔ)句會(huì)更新緩存,cache的緩存管理算法是LRU。除了內(nèi)建的緩存之外,mybatis還整合了第三方緩存框架例如Ehcache等。
注解@Insert @Update @Select @ Delete
舉例說(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é)果映射文件如下所示:
<mapper namespace="com.mybatis3.mappers.StudentMapper"> <resultMap type="Student" id="StudentResult"> ....... </resultMap> @Select("select name,email,phone from students where stud_id=#{studId}") @ResultMap("com.mybatis3.mappers.StudentMapper.StudentResult") Student findStudentById(Integer studId);
動(dòng)態(tài)Sql的注解
對(duì)于動(dòng)態(tài)sql,mybatis提供了不同的注解,@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider
用法如下所示:
首先創(chuàng)建一個(gè)provider類(lèi):
public class SqlProvider { public String findTutorById(int tutorId) { return "select tutorId,name,email from tutors where tutorId="+tutorId; } }
使用provider類(lèi):
@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(); } }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SpringBoot集成ElaticJob定時(shí)器的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot集成ElaticJob定時(shí)器的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Java陷阱之a(chǎn)ssert關(guān)鍵字詳解
這篇文章詳細(xì)介紹了Java陷阱之a(chǎn)ssert關(guān)鍵字,有需要的朋友可以參考一下2013-09-09selenium+java破解極驗(yàn)滑動(dòng)驗(yàn)證碼的示例代碼
本篇文章主要介紹了selenium+java破解極驗(yàn)滑動(dòng)驗(yàn)證碼的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01JavaSE實(shí)現(xiàn)文件壓縮與解壓縮的技巧分享
我們?cè)谌粘?shí)際開(kāi)發(fā)中,對(duì)于文件壓縮和解壓縮場(chǎng)景,是非常常見(jiàn)的操作,本文詳細(xì)介紹JavaSE中文件壓縮和解壓縮的實(shí)現(xiàn)方法,包括源代碼解析、應(yīng)用場(chǎng)景案例、優(yōu)缺點(diǎn)分析、案例演示、文末總結(jié)等等,請(qǐng)同學(xué)們耐心閱讀2024-03-03使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出
這篇文章主要介紹了使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出,EasyExcel是一個(gè)快速解決大文件內(nèi)存溢出的Excel處理工具,它能讓你在不用考慮性能、內(nèi)存等因素的情況下,快速完成Excel的讀、寫(xiě)等功能,需要的朋友可以參考下2023-10-10SpringBoot自定義starter啟動(dòng)器的實(shí)現(xiàn)思路
這篇文章主要介紹了SpringBoot如何自定義starter啟動(dòng)器,通過(guò)starter的自定義過(guò)程,能夠加深大家對(duì)SpringBoot自動(dòng)配置原理的理解,需要的朋友可以參考下2022-10-10