上文已经讲解了基于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. thinkphp 相关

    路径重写,既模式2 需要.htaccess文件放到index.php同级, http.config文件 中当前项目目录配置  AllowOverride All LoadModule rewrite_ ...

  2. java并发编程笔记(六)——AQS

    java并发编程笔记(六)--AQS 使用了Node实现FIFO(first in first out)队列,可以用于构建锁或者其他同步装置的基础框架 利用了一个int类型表示状态 使用方法是继承 子 ...

  3. 4.tensorflow——CNN

    1.CNN结构:X-->CONV(relu)-->MAXPOOL-->CONV(relu)-->FC(relu)-->FC(softmax)-->Y 1.1 卷积层 ...

  4. Java并发Lock接口

    java.util.concurrent.locks.Lock接口用作线程同步机制,类似于同步块.新的锁定机制更灵活,提供比同步块更多的选项. 锁和同步块之间的主要区别如下: 序列的保证 - 同步块不 ...

  5. iis 跨域设置多域名

    首先下载 https://www.iis.net/downloads/microsoft/url-rewrite 在最下方 然后在Web.config 文件里面 <configuration&g ...

  6. ==和equal的区别

    1.“==”运算符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符. 如果一个变量指向的数据是对 ...

  7. 49-python基础-python3-列表-常用列表统计函数-max()-min()-sum()

    max() min() sum() 1-数字列表统计 实例: 2-字符串列表统计. 根据ASCII码大小统计字符串列表的min()和max(). 注意:sum()函数无法统计字符串列表. 实例:

  8. Codefores 507B Amr and Pins

    B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. Codefores 506A Mr. Kitayuta, the Treasure Hunter( DP && dfs )

    A. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 megabyte ...

  10. vue - blog开发学习4

    1.新建页面的修改,集成富文本编辑 edit-post.vue(新建和修改都用该组件) <template> <div class="editor"> &l ...