MyBatis实践之增删改查

    一、 概述
    二、映射
        1. 查询
        2. 新增、更新、删除
        3. SQL片段
        4. 参数
    三、附录
        1. 示例代码
        2. 参考文献

Mybatis 是一款优秀的持久层框架,它的强大之处正是 SQL 语句映射,这一章介绍常用的增删改查操作。

详细配置参阅《MyBatis介绍与配置

一、 概述    

Java 数据持久层实现了应用程序与数据源的交互,应用程序通常使用分层架构,进行应用与数据间的解耦。

数据持久层主要负责数据的增、删、改、查等功能,MyBatis 则是一款优秀的持久层框架。

二、映射

MyBatis 的强大之处正是它的语句映射,简单地使用 XML 配置将数据访问接口与 SQL 语句进行绑定。

而且对接口的参数与返回值也能很好地进行映射。

MyBatis实践之增删改查

1. 查询

查询语句是最常用的语句之一,例如下面的用户查询接口。

public interface UserMapper {

    User selectById(Long id);

    List<User> selectList();
}

上面示例接口对应的 XML 映射如下,参数通过 #{} 占位符来指定。

返回结果映射可以使用 resultTyperesultMap 来指定。

<mapper namespace="cn.codeartist.mybatis.mapper.UserMapper">

    <resultMap id="resultMap" type="cn.codeartist.mybatis.entity.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>

    <select id="selectById" resultType="cn.codeartist.mybatis.entity.User">
        SELECT * FROM t_user WHERE id = #{id}
    </select>

    <select id="selectList" resultMap="resultMap">
        SELECT * FROM t_user
    </select>

</mapper>

2. 新增、更新、删除

MyBatis 中的 DML 语句实现也很简单,insert, update, delete 实现都类似。

public interface UserMapper {

    void insert(User user);

    void updateById(User user);

    void deleteById(Long id);
}

上面示例接口对应的 XML 映射如下,参数的映射和查询语句一致。

<mapper namespace="cn.codeartist.mybatis.mapper.UserMapper">

    <insert id="insert">
        INSERT INTO t_user (name,username,password) VALUES (#{name},#{username},#{password})
    </insert>

    <update id="updateById">
        UPDATE t_user SET username = #{username},password = #{password} WHERE id = #{id}
    </update>

    <delete id="deleteById">
        DELETE FROM t_user WHERE id = #{id}
    </delete>
</mapper>

3. SQL片段

MyBatis 支持使用 <sql> 来定义可重用的 SQL 片段,它可以在其他 SQL 语句中使用。

<mapper namespace="cn.codeartist.mybatis.mapper.UserMapper">

    <sql id="base_columns">
        id,name,username,password
    </sql>

    <select id="selectById" resultType="cn.codeartist.mybatis.entity.User">
        SELECT <include refid="base_columns"/> FROM t_user WHERE id = #{id}
    </select>
</mapper>

4. 参数

前面的语句都使用了简单的参数形式,大多数场景下只需使用这种形式。

<select id="selectById" resultType="User">
    SELECT * FROM t_user WHERE id = #{id}
</select>

对于原始类型或简单数据类型(int, long, Integer, String 等),直接使用值作为参数。

如果参数是一个复杂的对象,配置如下:

<insert id="insert" parameterType="User">
    INSERT INTO t_user (name,username,password) VALUES (#{name},#{username},#{password})
</insert>

也可以在参数占位符中手动指定特殊的数据类型。

javaType 大多数情况可以根据对象类型判断,除非该对象是一个 HashMap

如果列允许使用 null 值,则需要指定 jdbcType

#{age,javaType=int,jdbcType=NUMERIC}

如果需要使用自定义类型处理方式,可以指定一个特殊的类型处理器类(或别名)。

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

字符串替换

默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样)。

如果需要直接在 SQL 语句中直接插入一个不转义的字符串。比如 ORDER BY 子句,可以使用 ${} 来拼接。

ORDER BY ${columnName}

用这种参数方式接受用户输入,会导致 SQL 注入攻击,因此,要么禁止用户输入这些字段,要么自行转义并检验这些参数。

三、附录

1. 示例代码

Gitee 仓库:

https://gitee.com/code_artist/mybatis

2. 参考文献

MyBatis 3 官方文档:

https://mybatis.org/mybatis-3/zh/

原文始发于微信公众号(CodeArtist):MyBatis实践之增删改查

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/126708.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!