MyBatis其实很简单。我们在工作中使用的通常是与Spring整合,Spring作为框架粘合剂,简化了很多使用实现细节。为了研究MyBatis源码,我们需要单从MyBatis的使用来作为入口,循着会用到源码来深入。
一、MyBatis是什么?能做什么?
我研究东西喜欢知其然知其所以然,这样,不会有困惑。那么MyBatis是什么?总得问个为什么。
在官方地址中(http://www.mybatis.org/mybatis-3/),有介绍,我们摘取一段:
and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of
parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration
and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
总体意思就是:
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文件依赖部分:
junit junit 4.11 test org.mybatis mybatis 3.2.6 mysql mysql-connector-java 5.1.12
这里我们使用3.2.6稳定版本作为示例版本,目前官网的最新版本是3.4.x。
搭建完的工程目录结构如下:
①在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两种映射语句
insert into mallt_user(name,mobile,email) values(#{name}, #{mobile}, #{email});
④关键部分:MyBatis的核心配置文件db-core.properties,里面包含了我们要使用的大部分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。