欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis中注解映射SQL示例代碼

 更新時(shí)間:2017年08月24日 10:16:30   作者:haofengpingjieli  
這篇文章主要給大家介紹了關(guān)于mybatis中注解映射SQL的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家的學(xué)習(xí)或者共組具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

本文主要給大家介紹了關(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)代碼

    這篇文章主要介紹了SpringBoot集成ElaticJob定時(shí)器的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Java陷阱之a(chǎn)ssert關(guān)鍵字詳解

    Java陷阱之a(chǎn)ssert關(guān)鍵字詳解

    這篇文章詳細(xì)介紹了Java陷阱之a(chǎn)ssert關(guān)鍵字,有需要的朋友可以參考一下
    2013-09-09
  • selenium+java破解極驗(yàn)滑動(dòng)驗(yàn)證碼的示例代碼

    selenium+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-01
  • java 兩階段終止線程的正確做法

    java 兩階段終止線程的正確做法

    這篇文章主要給大家分享了java 兩階段終止線程的正確做法,文章列舉出錯(cuò)誤的做法與正確做法做對(duì)比,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2021-12-12
  • JavaSE實(shí)現(xiàn)文件壓縮與解壓縮的技巧分享

    JavaSE實(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)出

    這篇文章主要介紹了使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出,EasyExcel是一個(gè)快速解決大文件內(nèi)存溢出的Excel處理工具,它能讓你在不用考慮性能、內(nèi)存等因素的情況下,快速完成Excel的讀、寫(xiě)等功能,需要的朋友可以參考下
    2023-10-10
  • java8 Stream流逐行處理文本文件

    java8 Stream流逐行處理文本文件

    這篇文章主要介紹了java8 Stream流逐行處理文本文件的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • SpringBoot自定義starter啟動(dòng)器的實(shí)現(xiàn)思路

    SpringBoot自定義starter啟動(dòng)器的實(shí)現(xiàn)思路

    這篇文章主要介紹了SpringBoot如何自定義starter啟動(dòng)器,通過(guò)starter的自定義過(guò)程,能夠加深大家對(duì)SpringBoot自動(dòng)配置原理的理解,需要的朋友可以參考下
    2022-10-10
  • SpringBoot整合Swagger2代碼實(shí)例

    SpringBoot整合Swagger2代碼實(shí)例

    這篇文章主要介紹了SpringBoot整合Swagger2代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java中的字節(jié)流文件讀取教程(二)

    Java中的字節(jié)流文件讀取教程(二)

    這篇文章主要給大家介紹了關(guān)于Java中字節(jié)流文件讀取的相關(guān)資料,本文屬于之前文章的延長(zhǎng)篇,有需要的朋友可以先看看上一篇文章,相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論