【干货】从配置到实例: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.SqlSessionFactoryBuilder
:SqlSessionFactory
构建器,完成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
提供了 select
、selectOne
、selectList
等接口,能够直接进行数据库查询,然而,使用映射器既能够最大程度地使用 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 “别名” 区分 “系统定义别名” 和 “自定义别名”。
- 程序猿的日常——Java基础之clone、序列化、字符串、数组
- [你必须知道的.NET] 第四回:后来居上:class和struct
- oc 中随机数的用法(arc4random() 、random()、CCRANDOM_0_1()
- 央行出台条码支付新规;美团打车将在7大城市上线;国产人工智能平台型芯片首发;苹果就降速门致歉
- 阿三又让全球看笑话,无人驾驶的地铁名不副实,还直接跑到大街上
- 盘点:2017年度这些科学大事件,哪个给您印象最深?
- 跳台阶问题
- mac下使用github
- CSS3新特性应用之结构与布局
- 程序猿的日常——Java基础之equals与hashCode
- 贾康:智能金融需在发展和规范中掌握理性权衡点
- Objective-C: 字符串NSString与NSMutableString
- 2017年最后一篇推送,仍然与技术有关盘点深度学习论文年度之“最”
- 【垂直居中高级篇】你不知道的垂直居中方式
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 还在手动整理数据库文档?试试这个工具
- Elasticsearch 常见的 8 种错误及最佳实践
- Spark流式状态管理
- Scala中的IO操作及ArrayBuffer线程安全问题
- 设计模式之单例模式
- Roslyn 理解 msbuild 的清理过程
- gorm聚合查询group结合join和count
- 潘石屹用Python解决100个问题 | 集合
- Catalina 默认使用zsh了,你可习惯
- LeetCode 354 Russian Doll Envelopes (动态规划)
- 设计模式之原型模式
- 设计模式之工厂方法模式
- Python 随机数生成
- OWIN 初探
- Spark和Spring整合处理离线数据