mituan 2018-09-28
MyBatis其实很简单。我们在工作中使用的通常是与Spring整合,Spring作为框架粘合剂,简化了很多使用实现细节。为了研究MyBatis源码,我们需要单从MyBatis的使用来作为入口,循着会用到源码来深入。
一、MyBatis是什么?能做什么?
我研究东西喜欢知其然知其所以然,这样,不会有困惑。那么MyBatis是什么?总得问个为什么。
在官方地址中(http://www.mybatis.org/mybatis-3/),有介绍,我们摘取一段:
总体意思就是:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、入门使用
使用maven构建一个MyBatis的测试工程,maven的使用这里我不想赘述,网上文章很多。
这里,我们使用MySQL数据库,使用MyBatis作为持久化框架。
为了使项目中职责清楚,我们需要划分目录结构,一般的dao层用来访问与数据访问接口相关的内容,model层用来放与实体相关部分,mapper目录用来存放与对象与数据映射关系的配置文件。当然,我们需要一张数据表,开搞。
1、新建一张数据表(直接使用navicat工具新建即可)
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `mallt_user` -- ---------------------------- DROP TABLE IF EXISTS `mallt_user`; CREATE TABLE `mallt_user` ( `ID` int(100) NOT NULL AUTO_INCREMENT COMMENT '主键', `NAME` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '用户姓名', `MOBILE` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '手机号码', `EMAIL` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
2、新建一个maven工程,建议大家使用IntelliJ IDEA (大家自行百度创建maven工程的方法),这里不细说,我们只说下pom文件依赖部分:
<dependencies>
<!-- 添加junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 添加mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>
<!-- 添加mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.12</version>
</dependency>
</dependencies>这里我们使用3.2.6稳定版本作为示例版本,目前官网的最新版本是3.4.x。
搭建完的工程目录结构如下:

3、我们分别介绍下目录中的内容
①在dao层中,MalltUserDao是接口类,里面提供了查询、插入等方法。
package com.zhaodf.dao;
import com.zhaodf.model.MalltUser;
import java.util.List;
public interface MalltUserDao {
public int insert(MalltUser malltUser);
public MalltUser findMalltUserById (int id);
}②在model层,是实体类MalltUser,包含跟数据表列对应的属性名
package com.zhaodf.model;
public class MalltUser {
private int id;
private String name;
private String mobile;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}③在mappers目录下,malltUserDao-mapper.xml是关系映射文件,我们这里包含select和insert两种映射语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.zhaodf.dao.MalltUserDao">
<select id="findMalltUserById" resultType="com.zhaodf.model.MalltUser" >
select * from mallt_user where id = #{id}
</select>
<insert id="insert" parameterType="com.zhaodf.model.MalltUser">
insert into mallt_user(name,mobile,email) values(#{name}, #{mobile}, #{email});
</insert>
</mapper>④关键部分:MyBatis的核心配置文件db-core.properties,里面包含了我们要使用的大部分configuration 配置。
<?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属性来传递 -->
<properties resource="db-info.properties"></properties>
<!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找。-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<!-- 事务管理器的配置,这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域-->
<transactionManager type="JDBC"/>
<!-- 有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”),POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。-->
<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>
<!--定义完SQL 映射语句,首先我们需要告诉 MyBatis 到哪里去找到这些语句。 最佳的方式是告诉 MyBatis 到哪里去找映射文件。可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。-->
<!-- 使用相对于类路径的资源引用 -->
<mapper resource="mappers/malltUserDao-mapper.xml"/>
</mappers>
</configuration>⑤在db-info.properties文件中,配置连接MySQL的驱动类,数据库连接,用户名、密码等
driver=com.mysql.jdbc.Driver url=jdbc:mysql://ip:端口/数据库名 username=用户名 password=密码
⑥在test目录下,放置的是测试类信息:
import com.zhaodf.dao.MalltUserDao;
import com.zhaodf.model.MalltUser;
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 org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
public class MyBatisDemoTest {
@Test
public void findUserById() {
SqlSessionFactory sessionFactory = null;
SqlSession sqlSession = null;
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("db-core.xml"));
sqlSession = sessionFactory.openSession();
MalltUserDao malltUserDao = sqlSession.getMapper(MalltUserDao.class);
MalltUser user = malltUserDao.findMalltUserById(9);
Assert.assertEquals("zhaodf",user.getName());
} catch (IOException e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
@Test
public void inserMalltUser() {
SqlSessionFactory sessionFactory = null;
SqlSession sqlSession = null;
try {
sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("db-core.xml"));
sqlSession = sessionFactory.openSession();
MalltUserDao malltUserDao = sqlSession.getMapper(MalltUserDao.class);
MalltUser user = new MalltUser();
user.setName("baixw");
user.setMobile("18333828888");
user.setEmail("[email protected]");
malltUserDao.insert(user);
sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
}这里要注意的是,单独用MyBatis进行示例测试时,插入语句执行最后要进行commit操作( sqlSession.commit();) 。
测试执行,插入数据和查询数据都正常。
以上就是MyBatis的基本用法,后续帖我们从SqlSessionFactory的创建开始讲起,从源码角度来逐渐剖析MyBatis。