【干货】从配置到实例:MyBatis 基础入门

前置说明

本质而言,ORM(Object-Relation Mapping),是一种编程技术,能够实现面向对象编程语言与关系型数据库之间的数据转换(映射)。

MyBatis 即为互联网行业流行的 ORM 框架。在正式开始 MyBatis 之前,我们列出本文涉及的工具和组件,并约定版本:

使用 Gradle,全部的包依赖:

dependencies {
    compile group: 'com.alibaba', name: 'fastjson', version: '1.2.47'
    compile group: 'org.projectlombok', name: 'lombok', version: '1.16.18'
    compile group: 'org.mybatis', name: 'mybatis', version: '3.4.6'
    compile group: 'org.mybatis', name: 'mybatis-spring', version: '1.3.2'
    compile group: 'org.springframework', name: 'spring-context', version: '5.0.5.RELEASE'
    compile group: 'org.springframework', name: 'spring-jdbc', version: '5.0.5.RELEASE'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'}

其中:fastjson、lombok作为本文中的辅助工具。

本文中使用 MySQL 作为关系型数据库,基于数据表 keyword 构建案例,keyword 数据表的创建语句:

CREATE TABLE `keyword` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `word` varchar(255) NOT NULL COMMENT '关键词',  `score` int(11) NOT NULL COMMENT '关键词分数',  `bid` bigint(20) NOT NULL COMMENT '关键词出价(分)',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

keyword 数据表映射为 Java 对象 com.gitchat.mybatis.Keyword

package com.gitchat.mybatis;import lombok.Getter;import lombok.Setter;@Getter@Setterpublic class Keyword {    private Long id;    private String word;    private Integer score;    private Long bid;
}

MyBatis 基础结构说明

1

MyBatis 核心组件

MyBatis 核心组件包括:

  • org.apache.ibatis.session.SqlSessionFactoryBuilderSqlSessionFactory 构建器,完成SqlSessionFactory 构建即应当销毁
  • org.apache.ibatis.session.SqlSessionFactory:创建 SqlSession 的 “工厂”,应用程序中,每一个数据库应当只维护 SqlSessionFactory 的单例
  • org.apache.ibatis.session.SqlSession:作为访问数据库的 “会话”,通常理解为应用程序和数据库的连接,此外,通过 SqlSession 能够获取映射器
  • 映射器:由 Java 接口和 XML 文件(或注解)构成,其负责定义参数、SQL、查询结果与对象的映射

1

入门案例

查询数据表 keyword 中,关键词出价等于 10 元(1000 分)的关键词 Id 集合。涉及的代码包括:

resources/mybatis-config.xml

<?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>
    <properties>
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="URL"/>
        <property name="username" value="USERNAME"/>
        <property name="password" value="PASSWORD"/>
    </properties>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="prod">
        <environment id="prod">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/gitchat/mybatis/KeywordMapper.xml"/>
    </mappers></configuration>

代码所示,通过 resources/mybatis-config.xml 文件进行 MyBatis 配置:

  • 定义了 MyBatis 日志形式:输出到控制台
  • 定义了事务管理类型、数据库连接信息(url、username、password)
  • 定义了映射器:KeywordMapper.xml

更多关于 MyBatis 配置,请参阅 《MyBatis 的配置、映射器以及动态 SQL》 章节。

resources/com/gitchat/mybatis/KeywordMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.gitchat.mybatis.KeywordMapper">
    <select id="selectKeywordIdsUsingBid" resultType="java.lang.Long">
        SELECT id FROM keyword WHERE bid = #{bid};    </select></mapper>

代码所示,resources/com/gitchat/mybatis/KeywordMapper.xml 即为映射器的 XML 文件:

  • 通过 namespace 与映射器的 Java 接口关联
  • 定义查询语句 selectKeywordIdsUsingBid,需要说明,resultType 定义的类型,既能够表示查询结果的类型,亦能够表示查询结果作为集合时,集合元素的类型

java/com/gitchat/mybatis/KeywordMapper.java

package com.gitchat.mybatis;import org.apache.ibatis.annotations.Select;import java.util.List;public interface KeywordMapper {    List<Long> selectKeywordIdsUsingBid(Long bid);    @Select("SELECT id FROM keyword WHERE bid = #{bid};")    List<Long> annotatedSelectKeywordIdsUsingBid(Long bid);
}

代码所示,java/com/gitchat/mybatis/KeywordMapper.java 即为映射器的 Java 接口:

  • selectKeywordIdsUsingBid 方法与映射器 XML 定义的查询语句名称一致
  • annotatedSelectKeywordIdsUsingBid 使用注解 org.apache.ibatis.annotations.Select 进行了查询语句定义

映射器的 Java 接口被调用时,XML(或注解)定义的 SQL,即 Prepared Statements 的形式,提交数据库执行(传递 1000L 作为 bid 参数):

==>  Preparing: SELECT id FROM keyword WHERE bid = ?;
==> Parameters: 1000(Long)

需要说明:

  • 通常,不建议使用注解的形式进行 SQL 定义
  • 映射器的 Java 接口,其实现由 MyBatis 基于 “动态代理” 机制,于运行时提供

关于映射器的更多内容,请参阅 《MyBatis 的配置、映射器以及动态 SQL》 章节。

java/com/gitchat/mybatis/Main.java

package com.gitchat.mybatis;import com.alibaba.fastjson.JSON;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;public class Main {    public static void main(String args[]) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        try (SqlSession session = sqlSessionFactory.openSession()) {
            KeywordMapper keywordMapper = session.getMapper(KeywordMapper.class);

            System.out.println(JSON.toJSONString(keywordMapper.selectKeywordIdsUsingBid(1000L)));

            System.out.println(JSON.toJSONString(keywordMapper.annotatedSelectKeywordIdsUsingBid(1000L)));
        }
    }
}

代码所示:

  • 通过 SqlSessionFactoryBuilder 使用配置文件 mybatis-config.xml 完成 SqlSessionFactory 创建
  • 通过 SqlSessionFactory 获得 SqlSession,由 try-with-resource 确保 SqlSessionFactory 释放

特别说明:SqlSessionFactory 提供了 selectselectOneselectList 等接口,能够直接进行数据库查询,然而,使用映射器既能够最大程度地使用 MyBatis 的 ORM,亦能确保良好的编程风格。

配置、映射器以及动态 SQL

1

配置

《MyBatis 基础结构》章节的 “入门案例”,通过 resources/mybatis-config.xml 进行 MyBatis 配置,本章节,我们重点讨论 MyBatis 的配置。

需要说明:MyBatis 的 XML 配置文件,必须符合 mybatis-3-config.dtd 约束。

**properties**

properties 能够用于承载属性的 “键” - “值”,并于配置文件的上下文中使用,使用方式即为${键}properties 支持 property 子元素和配置文件引入两种方式。

property 子元素

property 子元素的 name 和 value,即作为属性的 “键”、“值”。“入门案例” 中,即使用 properties 承载了数据库连接信息。

配置文件引入

使用配置文件,例如,数据库连接的配置文件 db.properties:

driver=com.mysql.cj.jdbc.Driverurl=URLusername=USERNAMEpassword=PASSWORD

引入方式:

<properties resource="db.properties" />

若出现 “键” 相同的属性,“配置文件” 的属性 “值” 具有更高优先级。

此外,MyBatis 支持以 “参数传递” 的方式设置属性的 “值”(最高优先级),但本文并不推荐使用,因此,不予展开讨论。

**settings**

settings 即为 MyBatis 配置,能够控制 MyBatis 行为。通常而言,settings 不需要关注,保持默认值即可正常运行。

关于 settings 中 “配置项” 的完整列表,请参阅:http://www.mybatis.org/mybatis-3/configuration.html#settings。

**typeAliases**

typeAliases 即为 “别名”:作为名称过长时的 “简单指代”。MyBatis “别名” 区分 “系统定义别名” 和 “自定义别名”。

原文发布于微信公众号 - GitChat精品课(CSDN_Tech)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏battcn

一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成

在一起来学SpringBoot | 第七篇:整合Mybatis一文中,我们介绍了 Mybatis这款优秀的框架,顺便提及了民间大神开发的两款插件( 通用Mapp...

15820
来自专栏纯洁的微笑

springboot(六):如何优雅的使用mybatis

这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis。...

580120
来自专栏Java3y

移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】

移动商城【用户登陆、回显用户】 我们来实现用户登陆的功能: ? 当点击的时候,出来的是一个弹出框,我们想要切换成一个页面。 ? 找到对应的事件、切换成我们的页面...

63370
来自专栏蓝天

g++中宏NULL究竟是什么?

NULL是个指针,还是个整数?0?或(void*)0?答案是和g++版本有关。g++ 4.6支持C++11,引入了nullptr,也许会发生变化。

15830
来自专栏Jerry的SAP技术分享

使用ABAP正则表达式解析HTML标签

需求就是我用ABAP的某个函数从数据库读取一个字符串出来,该字符串的内容是一个网页。

13820
来自专栏个人分享

Kudu存储实战笔记

  就像官网所说,Kudu是一个针对Apache hadoop 平台而开发的列式存储管理器,在本菜鸟看来,它是一种介于hdfs与hbase的一种存储。它的优势在...

79830
来自专栏Java帮帮-微信公众号-技术文章全总结

Jdbc知识点全整理,你值得拥有 ​(2)

1 DAO模式 DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来。DAO在数据库与业务逻辑(Service)之间。 l...

34940
来自专栏大内老A

谈谈基于SQL Server 的Exception Handling[上篇]

对于所有的开发人员来说,Exception Handling是我们每天都要面对的事情。对于基于Source Code的Exception Handling,我想...

19150
来自专栏Java Web

MyBatis(1)——快速入门

MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁...

45850
来自专栏Java帮帮-微信公众号-技术文章全总结

JDBC基础入门(3)

事务 事务是由一步/几步数据库操作序列组成的逻辑执行单元, 这些操作要么全部执行, 要么全部不执行. 注: MySQL事务功能需要有InnoDB存储引擎的支持,...

37170

扫码关注云+社区

领取腾讯云代金券