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 ...
随机推荐
- boost datetime
To create a date, use the class boost::gregorian::date 1. date #include <boost/date_time/gregoria ...
- 【RabbitMQ】Concurrency、Prefetch、exclusive
分布式消息中间件 RabbitMQ是用Erlang语言编写的分布式消息中间件,常常用在大型网站中作为消息队列来使用,主要目的是各个子系统之间的解耦和异步处理.消息中间件的基本模型是典型的生产者-消费者 ...
- MAX3232 每次只有在上电后,再连接串口线正常——保护电阻。RS232防雷保护
转载:http://m.newsmth.net/article/Circuit/298517?p=1 转载:http://www.360doc.com/content/18/0719/13/57938 ...
- hdu 5120 Intersection (圆环面积相交->圆面积相交)
Problem Description Matt is a big fan of logo design. Recently he falls in love with logo made up by ...
- JS中数据结构之集合
集合(set)是一种包含不同元素的数据结构.集合中的元素称为成员.集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在.当你想要创建一个数据结构用来保存一些独一无二的元素 ...
- delphi 解决RichViewEdit乱码问题
⑴ 设置RichViewEdit下面的几个属性: ① RTFReaderProperties → ParaStyleMode → rvrsAddIfNeeded ② RTFReaderProperti ...
- 环境变量(windows下tomcat问题);shh连接虚拟机网络配置
环境变量(windows下tomcat问题) 有tomcat有jdk 再配置环境变量:参考 提示:若选择“用户变量”,则本次配置的变量只对该用户有效 若选择“系统变量”,则对所有用户 ...
- JS知识—面试准备(一)
1.JS内置类型 分为基本数据类型和Object.基本数据类型有:null,undefined,string,boolean,number,symbol. console.log(typeof nul ...
- TSV 与 CSV
TSV : Tab-separated values 用制表符分隔值. CSV : Comma-separated values 用逗号分隔值. 参考 RFC 4180 - Common Format ...
- JetBrains.dotPeek
Free .NET Decompiler and Assembly Browser Decompile .NET assemblies to C# dotPeek is a free-of-charg ...