详解Mybatis注解写法(附10余个常用例子)
作者:sunnyzyq 发布时间:2023-01-19 03:39:53
【前言】
Mybatis 除了 XML 配置写法,还可以使用注解写法。
首先需要引入 Mybatis 的依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.3</version>
</dependency>
然后在接口上打上对应 @Mapper 注解
下面是常用的 Myatis 注解写法:
【1】新增对象( 非自增 ID )
插入的时候,数据库的值字段会自动匹配对象中同名称属性的值。
@Insert(value = { "INSERT INTO user (id, name, age, remark) VALUES (#{id}, #{name}, #{age}, #{remark})" })
public void addUser(User user);
【2】新增对象( 自增 ID )
如果数据库user表的 id 是自增长,我们可以加上 @Options 注解,那么该对象在插入后,id 属性会自动获取到主键。
@Options(useGeneratedKeys=true, keyProperty="id") 其中的 id 对应数据库表中的主键字段。
@Insert(value = { "INSERT INTO user (name, age, remark) VALUES (#{name}, #{age}, #{remark})" })
@Options(useGeneratedKeys=true, keyProperty="id")
public void insertUser(User user);
【3】根据 ID 查询对象
@Param(value = "id") 其中的 id 对应 SQL 语句中的 #{id}
@Select("SELECT * FROM user WHERE id = #{id}")
public User getUserById(@Param(value = "id") long id);
在查询对象的过程中,表字段会自动装箱给同名属性。当然,也可以写成绑定形式。
如下:@Result 注解中 property 是对象字段,column 是表字段。
@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
@Result(property="id", column="id"),
@Result(property="name", column="name"),
@Result(property="age", column="age"),
@Result(property="remark", column="remark"),
})
public User getUserById(@Param(value = "id") long id);
【4】大于 ( > ) 查询
在SQL 语句中,直接写作 > ,但在 xml 中,大于通常用转义 > 替代 ( xml 写法介绍详见 6.2)。
@Select("SELECT * FROM user WHERE age > #{age}")
public List<User> getUserList(@Param(value = "age") Integer age);
【5】小于 ( < ) 查询
在SQL 语句中,直接写作 < ,但在 xml 中,小于通常用转义 < 替代 ( xml 写法介绍详见 6.2)。
@Select("SELECT * FROM user WHERE age < #{age}")
public List<User> getUserList(@Param(value = "age") Integer age);
【6】IN 关键字查询
(6.1)带 IN 的子查询
@Select("SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE name = #{name})")
public List<User> getUserList(@Param(value = "name") String name);
(6.2)带 IN 的集合查询
List 集合,Set集合,数组 都适用。
注意:@Select({"<script>", "xx1", "xx2", "</script>"}) 这种写法为 xml 方式写法。所有 SQL 都在 <script> </script> 这对标签之中,标签之外是一对大括号,<script> 标签内的所有参数在最后执行 SQL 的时候会自动拼接,如这里为 xx1xx2,以此类推。 <script> 标签内还可以内嵌标签,比如下面里的 <foreach>,标签内所有引号都为单引号。
@Select({"<script>", "SELECT * FROM user WHERE id IN ",
"<foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach>", "</script>"})
public List<User> getUserList(@Param(value = "ids") List<Long> ids);
在 Postgrelsql 中,如果逻辑SQL中的 IN 和 ANY 的语义相同,那么尽量用 ANY,这样会更加效率。如:
@Select("SELECT * FROM user WHERE id = ANY(#{ids}::integer[])")
public List<SubOrderPO> getUserList(@Param(value = "ids") Integer[] ids);
【7】LIKE 关键字查询
@Select("SELECT * FROM user WHERE name LIKE concat('%', #{name}, '%') ")
public List<User> getUserList(@Param(value = "name") String name);
【8】时间查询
(8.1)Date 类型:直接传入进行比较
@Select("SELECT * FROM user WHERE create_time > #{createTime}")
public List<User> test(@Param(value = "createTime") Date createTime);
(8.2)String 类型:需要将其转化( 时间精度可以按自己需要裁取 )
Mysql :STR_TO_DATE('2008-08-08 08:08:08', '%Y-%m-%d %H:%i:%s')
Postgrelsql :to_timestamp('2008-08-08 08:08:08','yyyy-MM-dd hh24:mi:ss')
Oracle : to_date( '2008-08-08 08:08:08' , 'yyyy-MM-dd HH24:mi:ss' )
如 Mysql 写法:
@Select("SELECT * FROM user WHERE create_time > STR_TO_DATE(#{createTime}, '%Y-%m-%d %H:%i:%s')")
public List<User> test(@Param(value = "createTime") String createTime);
【9】高级查询( 动态SQL )
注意:【>】是大于(>)的转义,【<】 是小于(<)的转义
@Select({"<script>", "SELECT * FROM user ","<where>",
"<if test = 'name != null' >", " AND name LIKE concat('%', #{name}, '%') ", "</if>",
"<if test = 'age != null and age != 0' >", " AND age < #{age} ", "</if>",
"</where>", "</script>"})
public List<User> getUserList(@Param(value = "name") String name, @Param(value = "age") Integer age);
【10】修改对象
@Update("UPDATE user SET name = #{name} WHERE id = #{id}")
public void update(@Param(value = "id") Long id, @Param(value = "name") String name);
【11】删除对象
@Delete("Delete FROM user WHERE id = #{id}")
public void delete(@Param(value = "id") Long id);
来源:https://blog.csdn.net/sunnyzyq/article/details/102533764


猜你喜欢
- 一、unity方向导航制作设计要求是方向导航随着鼠标旋转转换方向,效果图如下:具体的实现方法主要有两个步骤,分别为UI设计和脚本编写。我的设
- 前言当指执行插入排序、希尔排序、归并排序等算法时,比较两个对象“大小”的比较操作。我们很容易理解整型的 i>j 这样的比较方式,但当我
- 使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片。本篇用SpringBoot Thymeleaf实现验证
- 对象是对类的实例化。对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为。Java 对象的生命周期包括创建、使用和清除。一、
- 前言:在 Spring 中, IOC 是很重要的概念,其本质就是 map 结构,存储容器和业务 Be
- 简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求。闲暇时间把项目配置文件共享出来,供大家参看:
- 本文实例讲述了Android自定义ActionBar的实现方法。分享给大家供大家参考。具体实现方法如下:Android 3.0及以上已经有了
- dependencyManagement一般出现在最顶层父工程的pom文件中,它的作用是用来管理jar版本,让子项目引用一个依赖而不用指明版
- 本文实例讲述了android自由改变Dialog窗口位置的方法。分享给大家供大家参考。具体如下:Dialog dialog = new Di
- 本文实例为大家分享了java实现简单石头剪刀布游戏的具体代码,供大家参考,具体内容如下问题描述Alice, Bob和Cindy一起玩猜拳的游
- 普通 jar 包的导出1.点击 file 中的project.structor=>选择Artifacts=>+=>选择 j
- 【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1
- 之前给大家在博文中讲过如何通过eclipse快速搭建SSM开发环境,但相对而言还是有些麻烦的,今天玄武老师给大家介绍下如何使用Intelli
- 本文实例为大家分享了ManualResetEvent的使用方法,供大家参考,具体内容如下1. 源码下载:下载地址:ManualResetEv
- 对于Android 的手势不光在软件中会经常用到,比如浏览器中的翻
- 一、Code First 代码优先DbContext可以用于数据库优先,代码优先和模型优先的开发。DbContext主要包含一组非常易于使用
- 使用unity制作瞄准镜,供大家参考,具体内容如下一、创建场景在Hierarchy窗口中使用Plane和Cube创建场景,并调整摄像机位置二
- 一直以来,我们都是在服务端查询出结果生成JSON字符串,供前端调用,那么我们能否把从前端接受的JSON字符串转换成字典集合,让后台处理呢?比
- 本文实例为大家分享了好看的android音量旋钮,供大家参考,具体内容如下效果图:实现思路,用的自定义的控件,图片和按钮都是自己绘制的,并且
- ⛳️ 基本类型做形式参数(零散参数的数据接收)1、基本数据类型要求前台页面的表单输入框的name属性值与对应控制器方法中的形式参数名称与类型