Mybatis基于接口注解配置SQL映射器(一)
上文已经讲解了基于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映射器(一)的更多相关文章
- Mybatis基于接口注解配置SQL映射器(二)
Mybatis之增强型注解 MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码.但是注解对动态SQL的支持一直差强人意,即使My ...
- MyBatis 3 使用注解配置SQL映射器
l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @Sel ...
- MyBatis 3(中文版) 第四章 使用注解配置SQL映射器
本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l ...
- 使用注解配置SQL映射器
在上一章,我们看到了我们是怎样在映射器Mapper XML配置文件中配置映射语句的.MyBatis也支持使用注解来配置映射语句.当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了. ...
- 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...
- 小峰mybatis(4)mybatis使用注解配置sql映射器
主流开发还是使用xml来配置:使用注解配置比较快,但是不支持所有功能:有些功能还是得用配置文件: 一.基本映射语句: @Inert @Update @Delete @Select 二.结果集映射语句 ...
- Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器
关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...
- Mybatis基于XML配置SQL映射器(二)
Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档 sysUse ...
- MyBatis学习笔记3--使用XML配置SQL映射器
<resultMap type="Student" id="StudentResult"> <id property="id&quo ...
随机推荐
- 为你的AliOS Things应用增加自定义cli命令
摘要: 怎么才能在RTOS系统中,通过 串口shell控制LED的开关. 在日常嵌入式开发中,我们经常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操作.如系统自检,模拟运行,或者进入手动模 ...
- JS中的getter和setter
对象有两种属性:(1)数据属性,就是我们经常使用的属性(2)访问器属性,也称存取器属性 存取器属性就是一组获取和设置值的函数.getter负责获取值,它不带任何参数.setter负责设置值,在它的函数 ...
- myeclipse svn重新定位 本地文件 svn 重新定位
我们在用工具myeclipse开发项目时,当资源库存储空间不够时,我们就需要添加资源库,涉及到我们切换项目资源库,下面就介绍一下svn资源库重新定位步骤 1,window到show view到othe ...
- php基于SQLite实现的分页功能示例
php基于SQLite实现的分页功能. 这里操作数据库文件使用的是前面文章<PHP基于PDO实现的SQLite操作类>中的SQLite数据库操作类. 代码: <?php class ...
- 解决“element表单验证输入的数字检测出来是string”的问题
form表单: 校验规则: 注意:一.数字类型的验证需要在 v-model 处加上 .number 的修饰符,这是 Vue 自身提供的用于将绑定值转化为 number 类型的修饰符.二.校验中是否添加 ...
- Python操作 Memcache
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据 库驱动网站的速 ...
- [CSP-S模拟测试]:养花(分块)
题目描述 小$C$在家种了$n$盆花,每盆花有一个艳丽度$a_i$.在接下来的$m$天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅,并在晚上放回.同时每天有特定的光照强度$k_i$,如果这一 ...
- src,href 和rel的区别
src用于替换当前元素,值一般是引用的文件的绝对路径或者相对路径 href 属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript代码段 rel REL属性用于定义链接的文 ...
- 四两拨千斤,ARM是如何运作、靠什么赚钱的
在智能手机.平板大行其道的今天,ARM这个名字我们几乎每天都要见到或者听到几次,作为编辑的我更是如此,每天涉及到的新闻总是或多或少跟ARM扯上关系,它还与Intel.AMD.NVIDA等公司有说不清道 ...
- Apache JMeter
https://en.wikipedia.org/wiki/Apache_JMeter Apache JMeter 是 Apache 的一个项目,它是一个负载测试工具可以用于进行各种服务器的性能测试分 ...