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。