Mybatis 快速入门

一、Mybatis 官方文档

传送门:Mybatis 官方中文文档

二、基本概念

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

更通俗版: java 对象与数据库存储数据间, 相互转化的工具

PS:使用 Mybatis 的前提条件 有能力纯手工写出增删改查操作 SQL 语句,否则下方描述会无法理解

如果没有亲身体验过 Mybatis 可先行运行该样例:mybatis-spring-boot-samples

三、快速入门样例

Mybatis 一大主要功能就是动态 SQL 生成,注解配置 Mybatis 动态 SQL 生成策略,只适合不包含if、else逻辑的简单SQL,故注解只是个覆盖范围小的”偏门”技巧(有兴趣的可以自行去研究),使用 XML 文件配置才是能覆盖情景广的正道,本文也只展示 XML 配置方式

增删改查公共部分

<mapper namespace="com.test.dao.user.UserMapper">
    <sql id="Base_Column_List">
        uId, uName, lastUpdateTs
    </sql>

    <sql id="All_Column_List">
        id, uId, uName, lastUpdateTs
    </sql>

    ……

</mapper>

namespace=”com.test.dao.user.UserMapper”
指定”命名空间”,含义为 该 XML 中的动态 SQL 生成策略的只对com.test.dao.user.UserMapper.java 内的方法生效

<sql><sql/>
可以近似理解为声明 静态常量,通过 <include/> 可实现静态常量的引用

1.Mapper 接口的增操作方法

Integer saveUser_Single(@Param("user") User user);

saveUser_Single 函数的返回值为 Integer,含义是返回该次数据操作的数据库受影响行
扩展:

ArrayList<User> queryUserByUId(……);
// 尝试将查询 SQL 结果集封装成 ArrayList
HashMap<String,User> queryUserByUId(……);
// 尝试将查询结果集封装成 HashMap  @MapKey 注解了解一下?
……

@Param(“user”)
指定该方法对应的 xml 里,该方法入参对象的别名为”user”(下同,故不再重复 @Param 的解释)

其对应的 XML 内容

    <insert id="saveUser_Single" parameterType="User" useGeneratedKeys="true" keyProperty="user.id">
        INSERT INTO `user`(<include refid="Base_Column_List"/>)VALUES (
        #{user.uId},
        #{user.uName},
        #{user.lastUpdateTs}
        )
    </insert>

id=”saveUser_Single”
指定该动态 SQL 生成逻辑绑定到”命名空间”下的 saveUser_Single 方法生效(下同,故不再重复 id 的解释)

parameterType=”User”
增操作方法的入参类型为 User.Class
Warn:需要配 PO 对象的自动扫描才可简写为 User,否则需要全路径 com.test.domain.po.User

# application.properties 中配置扫描(还有其他方式,可自行搜索) com.test.domain.po 中的 PO 对象
mybatis.type-aliases-package=com.test.domain.po

useGeneratedKeys=”true”
该入参包含自增属性,开启从数据库插入数据返回自增值后,将自增值写回入参对象

keyProperty=”user.id”
与 useGeneratedKeys 成对使用,将自增值设置到别名为”user”对象的名为”id”的属性上

#{user.uId}
带占位符的方式,取出别名为 “user”的对象的名为”uId”的属性(下同,故不再重复 #、$ 的解释)
扩展:
${user.uId} 为不带占位符的原样输出(即 Mybatis 不会自动帮你补充 ” 符号导致 SQL 语句意外出错)

2.Mapper 接口的删操作方法

Integer removeUserByUId_Multiple(@Param("uIdListStringVal") String uIdListStringVal, @Param("lastUpdateTs") Long lastUpdateTs);

PS : uIdListStringVal 的入参实际值样例为 (“uId1”,”uId2”)

其对应的 xml

    <delete id="removeUserByUId_Multiple">
             DELETE FROM `user` WHERE  uId IN ${uIdListStringVal}
    </delete>

3.Mapper 接口的改操作方法

 Integer updateByUId(@Param("uId") String uId, @Param("data") Map data);

其对应的 xml

    <update id="updateByUId">
        UPDATE `user`
        <foreach collection="data" index="key" item="val" open="SET" separator="," close=" ">
            ${key}=#{val}
        </foreach>
        WHERE isActive=TRUE AND gid=#{gid}
    </update>

collection=”data”
迭代别名为 “data” 的对象(此例为 Map 对象)

index=”key”
Map 的 key 取别名为 “key”
PS:若迭代对象是 array、list,index 指的则是序号

item=”val”
单次迭代循环中取到的临时对象取别名为 “val”

open=”SET”
在最终迭代结果头部追加字符串 “SET”

close=” “
在最终迭代结果尾部追加字符串 ” “

separator=”,”
单次迭代循环完成后在,尾部追加字符串 “,”

4.Mapper 接口的查操作方法

    ArrayList<User> queryUserListByUId(@Param("uIdListStringVal") String uIdListStringVal);

其对应的 xml

    <select id="queryUserMapByUId" resultType="User">
        SELECT
        <include refid="All_Column_List"/>
        FROM `user` WHERE uId IN ${uids}
    </select>

resultType=”User”
指定该操作返回的对象与 User.class 对象有关,User.java 文件中,类属性的Get Set 方法名称与数据库表中 字段名保持一致即可确保查询结果封装正确

Tips

1.开启 Mybatis 的 SQL 输出日志

SpringBoot 环境下的 Mybatis,其 SQL 输出日志是 debug 级别。所以想要看见 SQL 生成结果,需要把显示日志级别调到 debug 或以下
application.properties 文件中添加

logging.level.root=debug

2.Mybatis 扩展自定义功能

Mybatis 有拦截器概念,可以用来扩展 Mybatis 功能,可以自定义 Mybatis 执行生命周期关键节点逻辑

org.apache.ibatis.plugin.Interceptor.java

了解一下?如果你要写自定义扩展 Mybatis 的话

3.谨慎 >、<符号

>、< 会和<sql><sql/> 等标签混淆,所以 SQL 出现 age>15 之类的判定条件 你应该用转译符

select * from user where age &gt; 15

4.Mybatis 缓存

了解一下?聊聊MyBatis缓存机制

5.PO 中出现枚举类型属性怎么办呢?

org.apache.ibatis.type.BaseTypeHandler.java;

了解一下?

猜你喜欢

转载自blog.csdn.net/u014430366/article/details/79854385