MyBaties

mybatis3中@SelectProvider的使用技巧

mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/。

mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个@Provider的使用方式,他们是:@SelectProvider、@UpdateProvider、@InsertProvider和@DeleteProvider。

MyBatis 3 User Guide中的最后一章描述了注解的简单用法,但是对于这几个Provider的具体使用方式并没有说的很清楚,特别是参数传递的方式,完全没有提及,对于初次使用的同学来说,会造成不小的困扰。

经过一些尝试后,我总结了一些Provider的使用经验,下面以@SelectProvider为例,依次描述几种典型的使用场景。

1.使用@SelectProvider

@SelectProvider是声明在方法基本上的,这个方法定义在Mapper对应的的interface上。

1 public interface UserMapper {
2     @SelectProvider(type = SqlProvider.class, method = "selectUser")
3     @ResultMap("userMap")
4     public User getUser(long userId);
5 }

上例中是个很简单的Mapper接口,其中定义了一个方法:getUser,这个方法根据提供的用户id来查询用户信息,并返回一个User实体bean。
这是一个很简单很常用的查询场景:根据key来查询记录并将结果封装成实体bean。其中:

@SelectProvider注解用于生成查询用的sql语句,有别于@Select注解,@SelectProvide指定一个Class及其方法,并且通过调用Class上的这个方法来获得sql语句。在我们这个例子中,获取查询sql的方法是SqlProvider.selectUser。
@ResultMap注解用于从查询结果集RecordSet中取数据然后拼装实体bean。

2.定义拼装sql的类

@SelectProvide中type参数指定的Class类,必须要能够通过无参的构造函数来初始化。

@SelectProvide中method参数指定的方法,必须是public的,返回值必须为String,可以为static。

1 public class SqlProvider {
2     public String selectUser(long userId) {
3         return "select * from user where userId=" + userId;
4     }
5 }

3.无参数@SelectProvide方法
在Mapper接口方法上和@SelectProvide指定类方法上,均无参数:
UserMapper.java:

1     @SelectProvider(type = SqlProvider.class, method = "selectAllUser")
2     @ResultMap("userMap")
3     public List<User> getAllUser();

SqlProvider.java:

1     public String selectAllUser() {
2         return "select * from user";
3     }

4.一个参数的@SelectProvide方法
对于只有一个参数的情况,可以直接使用,参见前面的getUser和selectUser。
但是,如果在getUser方法中,对userId方法使用了@Param注解的话,那么相应selectUser方法必须接受Map<String, Object>做为参数:
UserMapper.java:

1     @SelectProvider(type = SqlProvider.class, method = "selectUser2")
2     @ResultMap("userMap")
3     public User getUser2(@Param("userId") long userId);

SqlProvider.java:

1     public String selectUser2(Map<String, Object> para) {
2         return "select * from user where userId=" + para.get("userId");
3     }

5.更多参数的@SelectProvide方法
在超过一个参数的情况下,@SelectProvide方法必须接受Map<String, Object>做为参数,
如果参数使用了@Param注解,那么参数在Map中以@Param的值为key,如下例中的userId;
如果参数没有使用@Param注解,那么参数在Map中以参数的顺序为key,如下例中的password:

UserMapper.java:

1     @SelectProvider(type = SqlProvider.class, method = "selectUserCheck")
2     @ResultMap("userMap")
3     public User getUserCheck(@Param("userId") long userId, String password);

SqlProvider.java:

1     public String selectUserCheck(Map<String, Object> para) {
2         return "select * from user where userId=" + para.get("userId") + " and password=‘" + para.get("1") + "‘";
3     }

6.一些限制
在Mapper接口和@SelectProvide方法类中,不要使用重载,也就是说,不要使用方法名相同参数不同的方法,以避免发生诡异问题。

posted on 2011-08-08 16:59 dbstar 阅读(7009) 评论(2)  编辑  收藏 所属分类: Java

时间: 2024-10-04 11:53:58

MyBaties的相关文章

springMVC 缓存(入门 spring+mybaties+redis一)

使用redis之前需要咋电脑上安装redis: 使用spring+mybaties+redis的本质是扩展类   org.apache.ibatis.cache.Cache:在我们自己扩展的Cache里面使用redis的api: 一:需要引入的依赖: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId>

mybaties分页+自定义前台

1 Springmvc+mybaties 2 3 JSP: 4 <!--右侧区域start--> 5 <td width="100%" class="ver01" > 6 <div class="box2" panelTitle="查询" showStatus="false" id="chaxundiv"> 7 <form action=&quo

mybaties中mapper.xml映射文件中输出映射resultMap与resultType的不同

在mybaties框架思想中可以知道.mybaties在mapper.xml中定义statement,使用resultType(还有resultMap)指定输出数据的类型,将select查询结果集映射为resultType指定的类型, resultType使用注意:select查询出来 列名要和resultType指定的类型属性名对应.(实现开发中常用的是resultType) resultMap:select查询出来 列名不需要和输出类型的属性名对应也可以完成映射.

spring mvc + mybaties + mysql 完美整合cxf 实现webservice接口 (服务端、客户端)

spring-3.1.2.cxf-3.1.3.mybaties.mysql 整合实现webservice需要的完整jar文件 地址:http://download.csdn.net/detail/xuxiaoyu__/9868032 整合的过程其实很简单,通过简单的配置就可以,但是可悲的是 一堆问题都是由于jar缺失或者jar版本冲突引起的,所以附上全部jar文件 ↑↑↑ 发布webservice服务: 第一步:编写接口和实现类 PlcDataDetail.java 1 package test

mybaties简单测试

导入 mybaties-3.3.1.jar包 导入mysql-connector-java.jar包 首先mybaties配置文件配置数据连接相关信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/myba

mybaties 的一些点

1.mybaties 的返回值是对象的话定义为resultMap="resultMap" 值resultMap在文件首部进行重定义避免返回值为空,现在对象存储都是hashmap如下所示 <resultMap id="resultMap" type="java.util.HashMap"> <result column="USER_ID" property="userId" jdbcType

mybaties的批量增删改查及普通增删改查

数据库: create table school(     id int(11) not null auto_increment comment '主键',     name varchar(20) comment '学校名称',     address varchar(100) comment '学校地址',     create_time datatime comment '数据上传时间',     primary key (id) ) 实体类: package com.test.entit

笔记之_Java整理MyBaties单用

mybatis中#和$绑定参数: #{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". ${}将传入的数据直接显示生成在sql中.如:order by ${id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为

小D课堂【SpringBoot】数据库操作之整合Mybaties和事务讲解

========================8.数据库操作之整合Mybaties和事务讲解 5节课================================ 加入小D课堂技术交流答疑群:Q群:699347262 1.SpringBoot2.x持久化数据方式介绍 简介:介绍近几年常用的访问数据库的方式和优缺点 1.原始java访问数据库 开发流程麻烦 1.注册驱动/加载驱动 Class.forName("com.mysql.jdbc.Driver") 2.建立连接 Connec

MyBaties源码解析

觉得查看源代码确实是一个学习的一种方法 因为很多时候别人把最核心的代码给我们都封装好了 我们直接可以来拿使用 很多时候自己也会问 为什么通过这个方法就可以得到我觉得就是一颗好奇心吧 我算了算 就这三个部分也花了几个小时的时间去琢磨 但是感觉值了,我觉得对mybaties的原理更加清晰了 学了mybaties也有一段时间了 今天抽空来聊聊mybaties是如何来操作数据库的 它为什么能够方便我们不用再去关注如何创建连接编写预编译语句 它又是如何实现的呢?我们都知道 要操作数据库数据库 必须先要有数