本文主要介绍 MyBatis 是什么,以及使用 MyBatis 操作数据库
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
简单来说 MyBatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具。
对数据库的操作是后端开发中非常重要的一部分,之前已经学习过使用 JDBC 来操作数据库,那为什么还要学习 MyBatis
因为 JDBC 的操作太繁琐了,对于 JDBC 来说,整个操作非常的繁琐,我们不但要拼接每一个参数,而且还要按照模板代码的方式,一 步步的操作数据库,并且在每次操作完,还要手动关闭连接等,而所有的这些操作步骤都需要在每个方法中重复书写。
这就是学习 MyBatis 的真正原因,它可以帮助我们更方便、更快捷的操作数据库

MyBatis 的使用有两种方式:
- 通过注解使用(相对较容易,好上手,但是做一些复杂操作时不太灵活)
- 通过 XML 配置文件的形式(比较规则,缺点就是 XML 一大堆,出错不容易排查)
在创建 Spring 项目是勾选以下依赖即可添加成功,导入 Spring Data JDBC 和 MySQL Driver 只是为了将 DataSource 对象注册到 Spring 中,真正导入 MyBatis 的是 MyBatis Framework

项目创建成功后在 XML 文件中多出了以下内容,也可在老项目的 XML 文件中直接添加以下内容来引入 MyBatis

在 yml 文件中添加以下内容
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/<库名>?useSSL=false&characterEncoding=utf8&serverTimeZone=Asia/Shanghai
username: root
password: root
import lombok.Data;
@Data
public class UserDO {
Integer uid;
String username;
String password;
}
@Repository
// 通过 @Mapper 注解让 mybatis 将这个接口看出一个 Mapper,并且使用代理对象代理它
@Mapper
// 经常按照 Mybatis 的习惯,称为 UserMapper
public interface UserMapper {
}
MyBatis 中操作数据库的注解主要有:
- @Insert() :插入
- @Delete() :删除
- @Update() :更改
- @Select() :查询
将实际的 SQL 代码写入注解后面的括号中即可
这里没有添加 Controller 类和 Service 类,实际开发中需要 Controller 类调用 Service 类对数据进行处理,再调用接口中的方法来操作数据库
以下所有代码全写在 UserMapper 接口中
当增加操作需要得到自增 id 时,可以用 @Options(useGeneratedKeys = true, keyColumn = “uid”, keyProperty = “uid”) 来修饰方法以得到自增 id
- useGeneratedKeys:这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
- keyColumn:设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。 如果生成列不止一个,可以用逗号分隔多个属性名称。
- keyProperty:指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它 的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
@Insert("insert into users (username, password) values (#{username}, #{password})")
@Options(useGeneratedKeys = true, keyColumn = "uid", keyProperty = "uid")
void insert1(UserDO userDO);
@Delete("delete from users where uid = #{uid}")
int delete1(@Param("uid") int uid);
@Update("update users set username = #{username}, password = #{password} where uid = #{uid}")
int update1(UserDO userDO);
@Select("select uid, username, password from users where uid = #{uid}")
UserDO select1(@Param("uid") int uid);
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hsq.mybatis_xml.UserMapper">
<resultMap id="xxx" type="com.hsq.mybatis_xml.User">
<id property="uid" javaType="Integer" column="uid" jdbcType="INTEGER" />
<result property="username" javaType="String" column="username" jdbcType="VARCHAR" />
<result property="password" column="password" />
resultMap>
mapper>
mybatis:
mapper-locations: classpath:mapper/**.xml
<select id="selectOneByUid" resultMap="xxx" parameterType="int">
select uid, username, password from users where uid = #{uid}
select>
// UserMapper 中写入
User selectOneByUid(@Param("uid") int uid);
<select id="selectListByUidList" resultMap="xxx" parameterType="List">
select uid, username, password from users where uid in (
<foreach collection="uidList" item="id" separator=", ">
#{id}
foreach>
) order by uid
select>
// UserMapper 中写入
List<User> selectListByUidList(@Param("uidList") List<Integer> uidList);
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="a" keyColumn="uid">
insert into users (username, password) values
<foreach collection="userList" item="user" separator=", ">
(#{user.b}, #{user.c})
foreach>
insert>
// UserMapper 中写入
int insertBatch(@Param("userList") List<User> userList);