资讯专栏INFORMATION COLUMN

mybatis注解映射SQL

whlong / 2717人阅读

摘要:解决这个问题方案是定义一份结果映射文件如下所示动态的注解对于动态,提供了不同的注解,用法如下所示首先创建一个类使用类但是使用字符串连接创建语句容易出现问题,所以提供了一个工具,简化了构建动态的方式如下所示或者

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

int offset=0;//开始位置
int limit=25;//取出的数据条数
RowBounds rowBounds=new RowBounds(offset,limit);
List list=studentMapper.findAllStudent(rowBounds);

结果处理器
有时我们需要对查询结果做一些特殊的处理,这个时候就需要结果处理器,举例如下,我们通过sql查询学生的stud_id和name,并期望返回一个map,其中key是stud_id,value是name.
新建一个接口:
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());
    }
})
缓存
缓存对于很多应用来说都是很重要的,因为它能提高系统的性能。mybatis内建了缓存支持,默认情况下,一级缓存是打开的,即如果你使用相同的sqlSession接口调用相同的select查询,查询结果从缓存中取得而不是去查询数据库。
也可以通过标签配置二级缓存。当配置了二级缓存后,也就意味着所有的查询结果都会被缓存,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);

结果注解有一个缺点,就是在一个查询方法前面都要写一遍,不能重用。解决这个问题方案是:
定义一份结果映射文件如下所示:



.......


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









文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70208.html

相关文章

  • Mybatis常见面试题

    摘要:执行没有,批处理不支持,将所有都添加到批处理中,等待统一执行,它缓存了多个对象,每个对象都是完毕后,等待逐一执行批处理。 Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是预编译处理,${}是字符串替换。 使用#{}可以有效的防止...

    liuchengxu 评论0 收藏0
  • 面试官都会问的Mybatis面试题,你会这样回答吗?

    摘要:最终能和面试官聊的开心愉快投缘的叫面霸。能够与很好的集成提供映射标签,支持对象与数据库的字段关系映射提供对象关系映射标签,支持对象关系组件维护。使用可以有效的防止注入,提高系统安全性。 showImg(https://segmentfault.com/img/bVbsSlt?w=358&h=269); 一、概述 面试,难还是不难?取决于面试者的底蕴(气场+技能)、心态和认知及沟通技巧。...

    seanHai 评论0 收藏0
  • 手撕面试官系列(二):开源框架面试题Spring+SpringMVC+MyBatis

    摘要:跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来期间也没有准备充分,到底是因为技术原因影响自己的发展,偏移自己规划的轨迹,还是钱给少了,不受重视。 跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技...

    Flink_China 评论0 收藏0
  • MyBatis理解与掌握(简介)

    摘要:语句在代码中硬编码,造成代码不易于维护,实际应用变化的可能较大,变动需要改变代码。对结果集解析存在硬编码查询列名,变化导致解析代码变化,系统不易于维护,如果能将数据库记录封装成对象解析比较方便。 MyBatis理解与掌握(简介) @(MyBatis)[Java, 框架, MyBatis] 简介   Mybatis是一个数据持久层框架,MyBatis消除了几乎所有的JDBC代码和参数的手...

    Pocher 评论0 收藏0
  • SpringBoot 实战 (九) | 整合 Mybatis

    摘要:提供映射标签,支持对象与数据库的字段关系映射提供对象关系映射标签,支持对象关系组建维护提供标签,支持编写动态。层实现类添加更新删除根据查询查询所有的层构建测试结果其他接口已通过测试,无问题。 微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题。 前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式...

    felix0913 评论0 收藏0

发表评论

0条评论

whlong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<