详解Mybatis注解写法(附10余个常用例子)

【前言】

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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis中注解@MapKey的使用详解

    mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. 在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型. 这时候我们就可以使用这个注解了 @Retention(Retention

  • Mybatis基于注解形式的sql语句生成实例代码

    对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方式,可能以后会逐渐完善起来.第一次写博客,写的简单点. package com.bob.config.mvc.mybatis; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retenti

  • Mybatis 开发注解快速入门

    快速普及 1.mybatis是什么 mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis实现了接口绑定,使用更加方便. 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来

  • MyBatis Generator去掉生成的注解

    是不是很讨厌mybatis Generator帮我们生成代码的时候在Mapper和mapper.xml文件中生成的一大堆注解?今天在看MyBatis Generator代码的时候发现,原来mybatis generator是提供了配置注解的能力,配置如下,在generatorConfig.xml中加上配置: <commentGenerator> <property name="suppressDate" value="true"/> <

  • mybatis多个接口参数的注解使用方式(@Param)

    1 简介 1.1 单参数 在 Mybatis 中, 很多时候, 我们传入接口的参数只有一个. 对应接口参数的类型有两种, 一种是基本的参数类型, 一种是 JavaBean . 例如在根据主键获取对象时, 我们只需要传入一个主键的参数即可. 而在插入, 更新等操作时, 一般会涉及到很多参数, 我们就使用 JavaBean . 1.2 多参数 但是, 在实际的情况中, 我们遇到类似这样的情况可能: 接口需要使用的参数多于一个: 接口需要使用的参数又远少于对应 JavaBean 的成员变量, 或者需要

  • mybatis @Alias注解在类上的使用方式(推荐)

    比如在类上使用该注解 @Alias("dDebtEntity") 则在mapper.xml文件中resultType="dDebtEntity" 在myBatisConfig.xml中 sqlSessionFactory需要配置注解  需要扫的路径 <typeAliases> <package name="com.xxxxx.core"/> </typeAliases> Mybatis之typeAlias配置的

  • mybatis中注解映射SQL示例代码

    前言 本文主要给大家介绍了关于mybatis注解映射SQL的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 结果集分页 有时我们需要处理海量数据,由于数据量太大,所以不能一次取出所有的数据,这时我们就需要使用分页功能.mybatis通过RowBounds对象提供对分页的支持,如下所示: <select id="findAllStudents" resultMap="StudentResult"> select * from st

  • mybatis学习笔记之mybatis注解配置详解

    Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护.MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀. MyBatis 3构建在基于全面且强大的Java配置API上.该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础

  • 详解Mybatis注解写法(附10余个常用例子)

    [前言] Mybatis 除了 XML 配置写法,还可以使用注解写法. 首先需要引入 Mybatis 的依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <

  • 详解Mybatis中万能的Map和模糊查询写法

    1.万能的Map 假设,我们的实体类,或者数据库中的表,字段或参数过多,我们接口参数以前用的是实体类,现在考虑使用下Map! 接口: //万能的Map int addUser2(Map<String,Object> map); mapper.xml: <!--Map中的key--> <insert id="addUser2" parameterType="map"> insert into mybatis.user (id,nam

  • 详解mybatis @SelectProvider 注解

    01.前言 为什么会写这篇文章, 因为在看到 MapperAnnotationBuilder 构造方法初始化时, 发现了四个从未见过的注解 public MapperAnnotationBuilder(Configuration configuration, Class<?> type) { ... sqlAnnotationTypes.add(Select.class); sqlAnnotationTypes.add(Insert.class); sqlAnnotationTypes.add

  • 详解mybatis批量插入10万条数据的优化过程

    数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下: package com.lcy.service.mapper; import com.lcy.service.pojo.TestVO; import org.apache.ibatis.annotations.Insert; import java.util.List; public interface TestMapper { @Insert("") Integer test

  • Mybatis详解在注解sql时报错的解决方法

    目录 错误: 文件结构 BookMapper.java BookMapperSQL .java Mybatis的配置文件 分析: 错误: 在做Mybatis用注解方式来注入sql的练习时,报了这样子的错误. 遇到错误很正常,然后我又从学了一遍今天刚刚学的内容,温故而知新嘛. 错误问题如下: 文件结构 BookMapper.java public interface BookMapper { @SelectProvider(type = BookMapperSQL.class,method = "

  • 详解Mybatis框架SQL防注入指南

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路. 一.Mybatis的SQL注入 Mybatis的SQL语句可以基于注解的方式写在类方法上面,更多的是以xml的方式写到xml文件.Mybatis中SQL语句需要我们自己手动编写或者用generator自动生成.

  • 详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel"> <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> <result column="insta

  • 详解MyBatis XML配置解析

    MyBatis核心配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environm

  • 详解Mybatis 传递参数类型为List的取值问题

    问题描述: 参数传递为List时: 当传递一个 List 实例或者数组作为参数对象传给 Mybatis.此时,Mybatis 会自动将它包装在一个 Map 中,用名称在作为键.List 实例将会以"list" 作为键,而数组实例将会以"array"作为键.所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map. DAO 层: List<User> selectUserByIDs( List ID

  • 详解MyBatis配置typeAliases的方法

    0x00:前言参考 之前的<MyBatis 中 SqlMapConfig 配置文件详解>记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下配置文件中 typeAliases 标签的详细使用. 0x01:标签介绍 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声明该类型的全路径,java.lang.String,或者 cn

随机推荐