上文已经讲解了基于XML配置的SQL映射器,在XML配置的基础上MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码。

Mybatis之接口注解

映射语句

@Insert

可以使用@Insert注解来定义一个INSERT映射语句:

  @Insert(" insert into sys_user (id, username, password, " +
" name, sex, status, org_id, " +
" email, idcard, is_admin, " +
" sort, mobile, stationid" +
" )" +
" values (#{id}, #{username}, #{password}," +
" #{name}, #{sex}, #{status}, #{orgId}, " +
" #{email}, #{idcard}, #{isAdmin}, " +
" #{sort}, #{mobile}, #{stationid}" +
" )")
int insertUser(sysUser sysuser);
[自动生成主键]

在上一章中我们讨论过主键列值可以自动生成。我们可以使用@Options注解的userGeneratedKeys 和keyProperty属性让数据库生成AUTO_INCREMENT列的值

    @Insert(" insert into sys_user ( username, password, " +
" name, sex, status, org_id, " +
" email, idcard, is_admin, " +
" sort, mobile, stationid" +
" )" +
" values ( #{username}, #{password}," +
" #{name}, #{sex}, #{status}, #{orgId}, " +
" #{email}, #{idcard}, #{isAdmin}, " +
" #{sort}, #{mobile}, #{stationid}" +
" )")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser2(sysUser sysuser);

有些数据库如Oracle并不支持 AUTO_INCREMENT 列,其使用序列(SEQUENCE),或者其他查询(uuid)来生成主键值,如下所示:

 @Insert(" insert into sys_user ( username, password, " +
" name, sex, status, org_id, " +
" email, idcard, is_admin, " +
" sort, mobile, stationid" +
" )" +
" values ( #{username}, #{password}," +
" #{name}, #{sex}, #{status}, #{orgId}, " +
" #{email}, #{idcard}, #{isAdmin}, " +
" #{sort}, #{mobile}, #{stationid}" +
" )")
@SelectKey(statement=" SELECT replace(uuid(),'-','') AS id",
keyProperty="id", resultType=String.class, before=true)
int insertUser3(sysUser sysuser);

@Update

可以使用@Update注解来定义一个UPDATE映射语句:

 @Update("update sys_user" +
" set username = #{username}," +
" password = #{password}," +
" name = #{name}," +
" sex = #{sex}," +
" status = #{status}," +
" org_id = #{orgId}," +
" email = #{email}," +
" idcard = #{idcard}," +
" is_admin = #{isAdmin}," +
" sort = #{sort}," +
" mobile = #{mobile}," +
" stationid = #{stationid}" +
" where id = #{id}")
int updateUser(sysUser sysuser);

@Delete

可以使用@Delete  注解来定义一个DELETE映射语句:

   @Delete("delete from sys_user WHERE id=#{id}")
int deleteUser(String id);

@Select

可以使用@ Select注解来定义一个SELECT映射语句:

     @Select("SELECT * FROM sys_user WHERE username = #{username}")
sysUser findByUsername(@Param("username") String username); @Select("SELECT * FROM sys_user WHERE id = #{id}")
sysUser findById(@Param("id") String id);

结果映射

我们可以将查询结果通过别名或者是@Results注解与JavaBean属性映射起来:

 @Select("SELECT * FROM sys_user WHERE username = #{username}")
@Results(
{
@Result(id = true, column = "id", property = "id"),
@Result(column = "password", property = "password"),
@Result(column = "name", property = "name"),
@Result(column = "sex", property = "sex")
})
sysUser findByUsername(@Param("username") String username);

一对一映射

MyBatis提供了@One注解来使用嵌套select语句(Nested-Select)加载一对一关联查询数据。MyBatis3.2.2版本,并没有对应的注解支持嵌套结果ResultMap。

  @Select("SELECT * FROM sys_user WHERE id = #{id}")
@Results(
{
@Result(id = true,column = "id", property = "id"),
@Result(column = "password", property = "password"),
@Result(column = "name", property = "name"),
@Result(column = "sex", property = "sex"),
@Result(property = "sysuserinfo", column = "id",
one = @One(select = "com.goku.mybatis.mapper.sysUserMapper.findsysUserInfo"))
})
sysUser findsysUser(@Param("id") String id); @Select("select * from sys_user_info where id=#{id}")
sysUserInfo findsysUserInfo(String id);

一对多映射

MyBatis提供了@Many注解来使用嵌套Select语句加载一对多关联查询。

  @Select("SELECT * FROM sys_org WHERE id = #{id}")
@Results(
{
@Result(id = true,column = "id", property = "id"),
@Result(column = "version", property = "version"),
@Result(column = "level", property = "level"),
@Result(column = "type", property = "type"),
@Result(property = "sysuser", column = "id",
many = @Many(select = "com.goku.mybatis.mapper.sysUserMapper.findByOrgId"))
})
sysOrg findsysOrg(@Param("id") String id); @Select("SELECT * FROM sys_user WHERE org_id = #{id}")
sysUser findByOrgId(String id);

动态SQL

有时候我们需要根据输入条件动态地构建SQL语句。MyBatis提供了各种注解如@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,来帮助构建动态SQL语句,然后让MyBatis执行这些SQL语句。

@SelectProvider

可以使用org.apache.ibatis.jdbc.SQL工具类来构建SQL语句:

 public String findUserByIdSql()
{
return new SQL()
{
{
SELECT("*");
FROM("sys_user");
WHERE("id=#{id}");
}
} .toString();
}

可以使用@SelectProvider注解来创建一个SELECT映射语句:

    @SelectProvider(type=sysUserDynaSqlProvider.class, method="findUserByIdSql")
sysUser findUserByIdSql(@Param("id") String id);

SQL工具类会处理以合适的空格前缀和后缀来构造SQL语句。

动态SQL provider方法可以接收以下其中一种参数:

  • 无参数
  • 和映射器Mapper接口的方法同类型的参数
  • java.util.Map

例如 映射器Mapper接口方法只有一个参数,那么可以定义SQLProvider方法,它接受一个与Mapper接口方法相同类型的参数:

  public String findUserByIdSql(final String id)
{
return new SQL()
{
{
SELECT("*");
FROM("sys_user");
WHERE("id='"+id+"'");
}
} .toString();
}

如果映射器Mapper接口有多个输入参数,我们可以使用参数类型为java.util.Map的方法作为SQLprovider方法。MyBatis提供的多值映射参数,使用的是#{param}语法。

 public String findUserByIdSql2(Map<String, Object> map)
{
return new SQL()
{
{
SELECT("*");
FROM("sys_user");
WHERE("id=#{param1} and username=#{param2}");
}
} .toString();
} @SelectProvider(type=sysUserDynaSqlProvider.class, method="findUserByIdSql2")
sysUser findUserByIdSql2(String id, String name);

SQL工具类也提供了其他的方法来表示JOINS,ORDER_BY,GROUP_BY等等。

例如 使用LEFT_OUTER_JOIN的例子:

  public String findUserinfoByIdSql()
{
return new SQL()
{
{
SELECT("u.id, username, password, name, sex, status, org_id, email, idcard, is_admin, sort," +
" mobile,address, post_code, height, weight, birthday, blood, culture, finish_school_date," +
" folk, government, homepage, householder, marriage, msn, nativity_address, qq, speciality," +
" description, version");
FROM("sys_user u");
LEFT_OUTER_JOIN("sys_user_info t on u.id=t.id");
WHERE("u.id=#{id}");
}
} .toString();
} @SelectProvider(type=sysUserDynaSqlProvider.class, method="findUserinfoByIdSql")
List<Map<String, String>> findUserinfoByIdSql(@Param("id") String id);

@InsertProvider

可以使用@InsertProvider注解创建动态的INSERT语句:

     public String insertUser(final sysUser sys_user)
{
return new SQL()
{
{
INSERT_INTO("sys_user");
if (sys_user.getId()!=null)
{
VALUES("id", "#{id}");
}
if (sys_user.getName() != null)
{
VALUES("name", "#{name}");
}
}
} .toString();
} @InsertProvider(type = sysUserDynaSqlProvider.class, method = "insertUser")
int insertUser4(sysUser sysuser);

@UpdateProvider

可以通过@UpdateProvider注解创建动态的UPDATE语句:

     public String updateUser(final sysUser sys_user)
{
return new SQL()
{
{
UPDATE("sys_user");
if (sys_user.getName() != null)
{
SET("name = #{name}");
}
WHERE("id = #{id}");
}
} .toString();
} @InsertProvider(type = sysUserDynaSqlProvider.class, method = "updateUser")
int updateUser2(sysUser sysuser);

@DeleteProvider

可以使用@DeleteProvider注解创建动态的DELETE语句:

     public String deleteUser()
{
return new SQL()
{
{
DELETE_FROM("sys_user");
WHERE("id = #{id}");
}
} .toString();
} @DeleteProvider(type = sysUserDynaSqlProvider.class, method = "deleteUser")
int deleteUser2(@Param("id") String id);

GITHUB

github : https://github.com/nbfujx/learn-java-demo/tree/master/Goku.MybatisDemo.Annotation

Mybatis基于接口注解配置SQL映射器(一)的更多相关文章

  1. Mybatis基于接口注解配置SQL映射器(二)

    Mybatis之增强型注解 MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码.但是注解对动态SQL的支持一直差强人意,即使My ...

  2. MyBatis 3 使用注解配置SQL映射器

    l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @Sel ...

  3. MyBatis 3(中文版) 第四章 使用注解配置SQL映射器

    本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l ...

  4. 使用注解配置SQL映射器

    在上一章,我们看到了我们是怎样在映射器Mapper XML配置文件中配置映射语句的.MyBatis也支持使用注解来配置映射语句.当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了. ...

  5. 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql

    一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...

  6. 小峰mybatis(4)mybatis使用注解配置sql映射器

    主流开发还是使用xml来配置:使用注解配置比较快,但是不支持所有功能:有些功能还是得用配置文件: 一.基本映射语句: @Inert @Update @Delete @Select 二.结果集映射语句 ...

  7. Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

    关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...

  8. Mybatis基于XML配置SQL映射器(二)

    Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档  sysUse ...

  9. MyBatis学习笔记3--使用XML配置SQL映射器

    <resultMap type="Student" id="StudentResult"> <id property="id&quo ...

随机推荐

  1. JDK1.7 hashMap源码分析

    了解HashMap原理之前先了解一下几种数据结构: 1.数组:采用一段连续的内存空间来存储数据.对于指定下标的查找,时间复杂度为O(1),对于给定元素的查找,需要遍历整个数据,时间复杂度为O(n).但 ...

  2. Kafka数据如何同步至MaxCompute之实践讲解

    摘要:本次分享主要介绍Kafka产品的原理和使用方式,以及同步数据到MaxCompute的参数介绍.独享集成资源组与自定义资源组的使用背景和配置方式.Kafka同步数据到MaxCompute的开发到生 ...

  3. 如何让UIViewController自动弹出PickerView

    因为响应者的一下属性inputView和inputAccessoryView都是只读的,所以如果想要指定弹出的view就要override 下面两个属性的get和set方法 UIResponder ( ...

  4. python中的open()函数

    定义: python open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写 参数: 模式 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模 ...

  5. 【玩转SpringBoot】异步任务执行与其线程池配置

    同步代码写起来简单,但就是怕遇到耗时操作,会影响效率和吞吐量. 此时异步代码才是王者,但涉及多线程和线程池,以及异步结果的获取,写起来颇为麻烦. 不过在遇到SpringBoot异步任务时,这个问题就不 ...

  6. python接口自动化测试三十五:用BeautifulReport生成报告

    GitHub传送门:https://github.com/TesterlifeRaymond/BeautifulReport 配置BeautifulReport 下载.解压并修改名字为Beautifu ...

  7. spring boot 尚桂谷学习笔记06 异常处理 ---Web

    ------错误处理机制------ 默认效果 1 返回一个默认的错误页面 浏览器发送请求的请求头:优先接收 text/html 数据 客户端则默认响应json数据 : accept 没有说明返回什么 ...

  8. *arg,**kwargs的参数作用的疑惑

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  9. C++中函数调用操作符的重载

    1,本博文讲述函数对象问题: 2,客户需求: 1,编写一个函数: 1,函数可以获得斐波那契数列每项的值: 2,每调用一次返回一个值: 3,函数可根据需要重复使用: 4,代码示例: ; i<; i ...

  10. BZOJ 4524(贪心+二叉堆)

    题面 若一个大于 11 的整数 M的质因数分解有 k 项,其最大的质因子为 \(a_k\),并且满足 \({a_k}^k \leq N,k<128\),我们就称整数 M 为 N-伪光滑数. 现在 ...