mybatis中注解映射SQL示例代码

前言

本文主要给大家介绍了关于mybatis注解映射SQL的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

结果集分页

有时我们需要处理海量数据,由于数据量太大,所以不能一次取出所有的数据,这时我们就需要使用分页功能。mybatis通过RowBounds对象提供对分页的支持,如下所示:

<select id="findAllStudents" resultMap="StudentResult">
 select * from studdents
</select>
int offset=0;//开始位置
int limit=25;//取出的数据条数
RowBounds rowBounds=new RowBounds(offset,limit);
List<Student> list=studentMapper.findAllStudent(rowBounds);

结果处理器

有时我们需要对查询结果做一些特殊的处理,这个时候就需要结果处理器,举例如下,我们通过sql查询学生的stud_id和name,并期望返回一个map,其中key是stud_id,value是name.

新建一个接口:

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());
 }
})

缓存

缓存对于很多应用来说都是很重要的,因为它能提高系统的性能。mybatis内建了缓存支持,默认情况下,一级缓存是打开的,即如果你使用相同的sqlSession接口调用相同的select查询,查询结果从缓存中取得而不是去查询数据库。

也可以通过<cache>标签配置二级缓存。当配置了二级缓存后,也就意味着所有的查询结果都会被缓存,insert,update,delete语句会更新缓存,cache的缓存管理算法是LRU。除了内建的缓存之外,mybatis还整合了第三方缓存框架例如Ehcache等。

注解@Insert @Update @Select @ Delete

举例说明注解的用法:

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);

结果注解

@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);

结果注解有一个缺点,就是在一个查询方法前面都要写一遍,不能重用。解决这个问题方案是:

定义一份结果映射文件如下所示:

<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);

动态Sql的注解

对于动态sql,mybatis提供了不同的注解,@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider
用法如下所示:

首先创建一个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); 

但是使用字符串连接创建sql语句容易出现问题,所以mybatis提供了一个SQL工具,简化了构建动态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();
  }
 } 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Spring与Mybatis基于注解整合Redis的方法

    基于这段时间折腾redis遇到了各种问题,想着整理一下.本文主要介绍基于Spring+Mybatis以注解的形式整合Redis.废话少说,进入正题. 首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图: 一,先上jar包 二,创建实体类 package com.sl.user.vo; import java.io.Serializable; import com.fasterxml.jackson.databind.PropertyNamingSt

  • Mybatis 开发注解快速入门

    快速普及 1.mybatis是什么 mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis实现了接口绑定,使用更加方便. 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来

  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

  • Mybatis基于注解形式的sql语句生成实例代码

    对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方式,可能以后会逐渐完善起来.第一次写博客,写的简单点. package com.bob.config.mvc.mybatis; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retenti

  • Mybatis中注解@MapKey的使用详解

    mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. 在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型. 这时候我们就可以使用这个注解了 @Retention(Retention

  • MyBatis Generator去掉生成的注解

    是不是很讨厌mybatis Generator帮我们生成代码的时候在Mapper和mapper.xml文件中生成的一大堆注解?今天在看MyBatis Generator代码的时候发现,原来mybatis generator是提供了配置注解的能力,配置如下,在generatorConfig.xml中加上配置: <commentGenerator> <property name="suppressDate" value="true"/> <

  • mybatis中注解映射SQL示例代码

    前言 本文主要给大家介绍了关于mybatis注解映射SQL的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 结果集分页 有时我们需要处理海量数据,由于数据量太大,所以不能一次取出所有的数据,这时我们就需要使用分页功能.mybatis通过RowBounds对象提供对分页的支持,如下所示: <select id="findAllStudents" resultMap="StudentResult"> select * from st

  • spring中使用mybatis实现批量插入的示例代码

    有3种实现方式:foreach,spring事务,以及ExecutorType.BATCH. 1. foreach方式 这种方式实际是对SQL语句进行拼接,生成一个长长的SQL,对很多变量进行绑定.如果数据量不大(1000个以内),可以用这种方式.如果数据量太大,可能数据库会报错. 定义接口 public interface StudentMapper05 { public void insertStudent(List<Student> studentList); } 定义mapper 适用

  • Mybatis中的动态SQL语句解析

    这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置. Mybatis使用注解配置SQL,但是由于配置功能受限,而且对于复杂的SQL而言可读性很差,所以很少使用. Mybatis常用xml配置的方式,使用xml的几个简单的元素,便能完成动态SQL的功能,大量的判断都可以在mybaties的映射xml里面配

  • Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.delete.select(增删改查);cache.cache-ref.resultMap.parameterMap.sql. 下

  • mybatis中注解与xml配置的对应关系和对比分析

    注解与xml配置的对应关系 mybatis中注解就是简单不需要写配置文件,适合简单的数据处理,理解起来比较容易,不动态生成SQL时候可以用用. 需要绑定,有些时候不如配置文件,配置文件扩展强. 选择合适的方式应用在合适的场景,注解主要应用于sql语句比较简单容易理解的情况下可读性高:生成动态sql时用xml配置文件要更简洁,扩展性强 常用的注解和xml的对应关系 @CacheNamespace 类 <cache> @CacheNamespaceRef 类 <cacheRef> @R

  • 在Vue中使用antv的示例代码

    一,在vue原型中使用 1.首先安装antv/g2 yarn add @antv/g2 --save 2.在main.js中挂在到vue原型实例中 const G2 = require('@antv/g2') Vue.prototype.$G2 = G2 3.在vue文件中可以直接在mounted生命周期中直接使用 <template> <div> <div id="c1"></div> </div> </templat

  • SpringBoot中实现数据字典的示例代码

    我们在日常的项目开发中,对于数据字典肯定不模糊,它帮助了我们更加方便快捷地进行开发,下面一起来看看在 SpringBoot 中如何实现数据字典功能的 一.简介 1.定义 数据字典是指对数据的数据项.数据结构.数据流.数据存储.处理逻辑等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明,使用数据字典为简单的建模项目.简而言之,数据字典是描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合. 数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序元数

  • JavaScript中removeChild 方法开发示例代码

    1. 概述 删除后的节点虽然不在文档树中了,但其实它还在内存中,可以随时再次被添加到别的位置. 当你遍历一个父节点的子节点并进行删除操作时,要注意,children属性是一个只读属性,并且它在子节点变化时会实时更新 // 拿到待删除节点: var self = document.getElementById('to-be-removed'); // 拿到父节点: var parent = self.parentElement; // 删除: var removed = parent.remove

  • 如何在vue中使用ts的示例代码

    本文介绍了如何在vue中使用ts的示例代码,分享给大家,具体如下: 注意:此文并不是把vue改为全部替换为ts,而是可以在原来的项目中植入ts文件,目前只是实践阶段,向ts转化过程中的过渡. ts有什么用? 类型检查.直接编译到原生js.引入新的语法糖 为什么用ts? TypeScript的设计目的应该是解决JavaScript的"痛点":弱类型和没有命名空间,导致很难模块化,不适合开发大型程序.另外它还提供了一些语法糖来帮助大家更方便地实践面向对象的编程. typescript不仅可

随机推荐