【MyBatis】Java 数据持久层框架:认识 MyBatis

Java 数据持久层框架:认识 MyBatis

  • [1.CRUD 注解](#1.CRUD 注解)
  • 2.映射注解
  • 3.高级注解
    • [3.1 高级注解](#3.1 高级注解)
    • [3.2 MyBatis 3 注解的用法举例](#3.2 MyBatis 3 注解的用法举例)

MyBatis 和 JPA 一样,也是一款优秀的 持久层框架,它支持定制化 SQL、存储过程,以及高级映射。它可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通 Java 对象)映射成数据库中的记录。

MyBatis 3 提供的注解可以取代 XML。例如,使用注解 @Select 直接编写 SQL 完成数据查询;使用高级注解 @SelectProvider 还可以编写动态 SQL,以应对复杂的业务需求。

1.CRUD 注解

增加删除修改查询 是主要的业务操作,必须掌握这些基础注解的使用方法。MyBatis 提供的操作数据的基础注解有以下 4 个。

  • @Select:用于构建查询语句。
  • @lnsert:用于构建添加语句。
  • @Update:用于构建修改语句。
  • @Delete:用于构建删除语句。

下面来看看它们具体如何使用,见以下代码:

java 复制代码
@Mapper
public interface UserMapper{
  @Select("SELECT * FROM user WHERE id = #{id}")
  User queryById(@Param("id") int id);
  
  @Select("SELECT * FROM user")
  List<User> queryAll();
  
  @Insert(("INSERT INTO user(name,age) VALUES(#{name},#{age})"))
  int add(User user);
  
  @Delete("DELETE FROM user WHERE id = #{id}")
  int delById(int id);
  
  @Update("UPDATE user SET name=#{name},age=#{age} WHERE id = #{id}")
  int updateById(User user);
  
  @Select("SELECT * FROM user")
  Page<User> getUserList();
}

从上述代码可以看出:首先要用 @Mapper 注解来标注类,把 UserMapper 这个 DAO 交给 Spring 管理。这样 Spring 会自动生成一个实现类,不用再写 UserMapper 的映射文件了。最后使用基础的 CRUD 注解来添加要实现的功能。

2.映射注解

MyBatis 的映射注解用于建立实体和关系的映射。它有以下 3 个注解。

  • @Results:用于填写结果集的多个字段的映射关系。
  • @Result:用于填写结果集的单个字段的映射关系。
  • @ResultMap: 根据 ID 关联 XML 里面的 <resultMap>

可以在查询 SQL 的基础上,指定返回的结果集的映射关系。其中,property 表示实体对象的属性名,column 表示对应的数据库字段名。使用方法见以下代码:

java 复制代码
@Results({
  @Result(property = "username", column = "USERNAME"),
  @Result(property = "password", column = "PASSWORD")
})
@Select("select * from user")
List<User> list();

3.高级注解

3.1 高级注解

MyBatis 3.x 版本主要提供了以下 4 个 CRUD 的高级注解。

  • @SelectProvider:用于构建动态查询 SQL。
  • @InsertProvider:用于构建动态添加 SQL。
  • @UpdateProvider:用于构建动态更新 SQL。
  • @DeleteProvider:用于构建动态删除 SQL。

高级注解主要用于编写动态 SQL。这里以 @SelectProvider 为例,它主要包含两个注解属性, 其中,type 表示工具类,method 表示工具类的某个方法(用于返回具体的 SQL)。

以下代码可以构建动态 SQL,实现查询功能:

java 复制代码
@Mapper
public interface UserMapper {
  @SelectProvider(type = UserSql.class, method = "listAll")
  List<User> listAllUser();
}

UserSql 工具类的代码如下:

java 复制代码
public class UserSql {
  public String listAll() {
    return "select * from user";
  }
}

3.2 MyBatis 3 注解的用法举例

如果要查询所有的值,则基础 CRUD 的代码是:

java 复制代码
@Select("SELECT * FROM user3")
List<User> queryAll();

也可以用映射注解来一一映射,见以下代码:

java 复制代码
// 使用注解编写 SQL, 完成映射 @Select("select * from user3")
@Results({  
  @Result(property = "id", column = "id"),
  @Result(property = "name", column = "name"),
  @Result(property = "age", column = "age")
})
List<User> listAll;

如果要用多个参数进行查询,则必须加上注解 @Param,否则无法使用 EL 表达式获取参数。

UserMapper 接口的写法如下:

java 复制代码
@Select("select * from user where name like #{name} and age like #{age}")
User getByNameAndAge(@Param("name") String name, @Param("age") int age);

对应的控制器代码如下:

java 复制代码
@RequestMapping("/querybynameandage")
User querybynameandage(String name, int age) {
  return userMapper.getByNameAndAge(name,age);
}

还可以根据官方提供的 API 来编写动态 SQL:

java 复制代码
public String getUser(@Param("name") String name, @Param("age") int age) { 
	return new SQL() {{
		SELECT("*");
		FROM("user3");
		if (name != null && age != 0) {
			WHERE("name like #{name} and age like #{age}");
		} else {
			WHERE("1=2");
		}
	}}.toString();
}
相关推荐
C137的本贾尼3 分钟前
Spring AI Alibaba 开箱:国产百炼大模型初体验
java·人工智能·spring
ElevenS_it1881 小时前
Redis监控实战:内存使用+命中率+连接数三类核心指标接入Zabbix+分级告警完整配置方案
运维·网络·redis·mybatis·zabbix
William Dawson1 小时前
【通俗易懂!Spring四大核心注解源码解读:@Configuration、@ComponentScan、@Import、@EnableXXX实战】
java·后端·spring
菜菜小狗的学习笔记2 小时前
八股(九)杂七杂八
java·后端·spring
逍遥德2 小时前
Java编程高频的“技术点”-01:自定义全局异常处理器
java·开发语言·spring boot·后端
小旭95273 小时前
商品详情实现与缓存问题(穿透、击穿、雪崩)解决方案
java·数据库·spring boot·后端·缓存
我本楚狂人www3 小时前
Spring 两大核心思想(一):IoC
java·数据库·spring
杨运交4 小时前
[021][数据模块]基于`BaseEnum`的统一枚举处理方案:序列化与 JPA 转换实践
spring boot
用户398346161204 小时前
Go-Spring 实战第 10 课 —— 依赖注入的方式:字段注入和构造函数注入
spring·go
超梦dasgg5 小时前
详细讲解:WebMvcConfigurer 接口
java·开发语言·spring