上文已经讲解了基于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. Makefile中的$@ $< $^的意义

    $@  目标文件 $<   第一个依赖文件 $^  所有的依赖文件 $? 比目标还要新的依赖文件列表 $%  仅当目标是函数库文件中,表示规则中的目标成员名 $+  所有依赖目标的集合,与$^类 ...

  2. webpack CSS处理loader

    loader概念: 首先来介绍一下loader,之前我们用webpack来处理我们写的js代码,并且webpack会自动处理js之间相关的依赖.但是,在开发中我们不仅仅有基本的js代码处理,我们也需要 ...

  3. 每天一个linux命令:which(17)

    which which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录.which指令会在环境变量$PATH设置的目录里查找符合条件的文件.也就是说,使用whic ...

  4. flask入门到入土

    # Flask ## 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用 ...

  5. iOS系统日历选择问题

    参考:https://blog.csdn.net/lg_sun/article/details/78913064 -(NSString *)getTimeToken{ NSDateFormatter ...

  6. 09-排序2 Insert or Merge(25 分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  7. 【bzoj1458】士兵占领(最大流||有源汇最大流)

    转载 http://hzwer.com/2963.html Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里 ...

  8. k-近邻算法(kNN)测试算法:作为完整程序验证分类器

    #测试算法:作为完整程序验证分类器 def datingClassTest(): hoRatio = 0.10 #设置测试集比重,前10%作为测试集,后90%作为训练集 datingDataMat,d ...

  9. [NOIP2015]子串 题解

    题目描述 有两个仅包含小写英文字母的字符串A和B. 现在要从字符串A中取出k个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可 ...

  10. 【翻译】Knowledge-Aware Natural Language Understanding(摘要及目录)

    翻译Pradeep Dasigi的一篇长文 Knowledge-Aware Natural Language Understanding 基于知识感知的自然语言理解 摘要 Natural Langua ...