MyBatis专题(一)-入门

MyBatis是Java平台上一个持久层框架,它提供了个性化SQL、存储过程支持和映射配置等功能。开发者几乎无需编写传统复杂的JDBC语句即可完成数据库操作流程。它体积轻巧,使用灵活,入门简单,可以把SQL语句独立在XML文件中方便管理和扩展。

本系列文章将从MyBatis基础到应用依次介绍,虽然网上已经有很多关于MyBatis的优秀文章,但此系列作为本人对MyBatis使用心得的总结之作,不在乎内容是否新颖。

使用Maven安装

虽然您可以将MyBaits相关的jar依赖放置在classpath,但是我极力推荐您使用依赖管理工具来安装MyBatis,它不仅可以帮您管理项目的复杂依赖,还提供了项目构建的能力。本次我以Maven作为依赖管理工具,以IntelliJ IDEA为编辑器,当然您也可以使用Eclipse,这两个IDE对Maven的支持都非常好。

要在Maven项目中引入MBatis,只需要在pom.xml文件中添加以下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>

<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.24</version>
</dependency>

MyBatis只有一个依赖声明,非常地简单。既然MyBatis是一个持久化框架,它必定与数据库打交道,本次的示例使用了MySQL数据库,需要引入MySQL的JDBC驱动依赖。

数据准备

为了接下来操作数据库流程做准备,简单建立一个名为mybatis的数据库和一张user数据表:

1
2
3
4
5
6
7
8
CREATE DATABASE `mybatis_topic_chapter1`;

USE mybatis_topic_chapter1;

CREATE TABLE `user` (
`username` varchar(50) NOT NULL,
`password` char(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SQL映射配置文件

MyBatis是一个SQL Mapping框架,其将SQL独立于XML文件中(还有一种方式是写在注解中),我们需要定义一个SQL映射描述UserMapper.xml文件,并把它存放到classpath下的mapper文件夹中(不是必须的位置,只是为了方便管理):

1
2
3
4
5
6
7
8
9
10
11
12
<?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="UserMapper">
<insert id="insertUser">
INSERT INTO user(username, password) VALUES(#{username}, #{password})
</insert>
<select id="selectUser" resultType="java.util.Map">
SELECT * FROM user WHERE username=#{username}
</select>
</mapper>

上述配置文件中的mapper标签中是定义相关的SQL语句和映射关系等信息。namespace指定了mapper的命名空间,类似于Java的包,起到了划分模块和防止文件命名冲突的作用。#{...}是MyBatis的SQL占位符,传入的参数依次代入,如果传入的类型为复杂类型,MyBatis将把占位符中的字段与参数中的键名或者属性匹配取值。

框架配置文件

MyBatis作为一个Java框架,必然是跟经典的XML配置脱离不了关系(其实MyBatis也可以通过编码的形式来配置),MyBatis有自己的XML配置文件。在classpath下新建一个名为mybatis-config.xml文件(路径和名称并不是收规定的),内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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>
<settings>
<!--开启日志并使用标准输入输出日志实现-->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

<environments default="development">
<environment id="development">
<!--事务有JDBC处理-->
<transactionManager type="JDBC"/>
<!--使用连接池管理数据库连接-->
<dataSource type="POOLED">
<!--数据库驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--JDBC连接字符串-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_topic_chapter1"/>
<!--数据库用户名-->
<property name="username" value="root"/>
<!--数据库密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>

<!--需要加载的mapper映射文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>

以上配置设置logImplSTDOUT_LOGGING,开启了日志输出功能并执行具体日志实现;指定了一个development环境配置,其事务管理托管给JDBC,使用数据库连接池管理数据库连接,并且设置了数据源信息,以下简单介绍数据源参数:

  • dirver 数据库驱动
  • url JBDC连接字符串
  • username 数据库用户名
  • password 数据库密码

此外配置需要加载的相关mapper文件具体位置。

以后会对这些概念做更详细的说明,更多信息先暂时略过。

代码

最后一步就是运行代码,这是一个令人非常兴奋的过程。您需要新建一个Main.java文件来使用MyBatis执行SQL语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.oopsguy.mybatistopic;

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;
import java.util.HashMap;
import java.util.Map;

public class Main {

public static void main(String[] args) throws IOException {
//获取配置文件信息
InputStream resStream = Resources.getResourceAsStream("mybatis-config.xml");
//通过配置参数构建sqlSessionFactory工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resStream);
//开启数据库会话
SqlSession sqlSession = sqlSessionFactory.openSession();

Map<String, Object> params = new HashMap<String, Object>();
params.put("username", "hello");
params.put("password", "world");
//插入数据
sqlSession.insert("UserMapper.insertUser", params);
//提交事务
sqlSession.commit();
//插叙数据
Map<String, Object> result = sqlSession.selectOne("UserMapper.selectUser", "hello");
System.out.println(result);
//释放资源
sqlSession.close();
}

}

简单说一下流程,MyBatis中与数据库会话由SqlSession负责,而SqlSession需要通过SqlSessionFactory这个工厂类来创建,创建SqlSessionFactory需要依赖定义的配置文件来初始化环境参数,这个工作由SqlSessionFactoryBuilder构建器负责,它可以接收一个文件stream资源,或者是一个Configuraion对象。需要注意的是,在与数据库交互完成之后,务必执行SqlSessionclose()方法以释放资源。

SqlSession提供了insertselectOne方法配合mapper文件中定义的SQL来执行insert操作和select操作,它们需要引用mapper中的SQL片段,通过namespace和具体的“操作”id来定位,比如UserMapper.inserUser代表命名空间为UserMapperidinsertUser的片段。具体的标签说明和API详细信息将在后边介绍。

到这里为止,基本的MyBatis用法已经介绍玩了,当然这只是简单的使用方式,实际上并不会那么用,而是通过整合其它框架(例如Spring Framework)更加高效地工作,后期也将会更加详细地介绍。

好了,如果到这里您已经成功运行MyBatis,那么恭喜您。您现在不需要了解更多的内容,只需要把MyBatis运行起来即可,因为路还很长,我还有很多话要说!

相关代码

https://github.com/oopsguy/mybaits-topic-example

后记

以上简单地介绍了MyBatis的基础使用步骤,虽然内容很简单,但只有从最基础的知识开始才能掌握好深层的内容。很多关于NyBatis的笔记大多数是直接讲解整合Spring框架,而忽略了最基础的内容。实际上,我本人平时查阅资料大多数也是寻找能复制即用的内容,造成个人基础知识偏弱,对于MyBatis,也只是在修改配置文件和编写mapper这些层次能做到略显“身手”。希望通过此系列笔记,能让自己对MyBatis有更加深入的认识!