MyBatis 是什么?
MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、手动设置参数以及检索结果。MyBatis能够支持简单的XML和注解配置规则。使Map接口和POJO类映射到数据库字段和记录。
下面我们通过一个简单的项目搭建来带你认识一下MyBatis的使用和一些核心组件的讲解。
MyBatis 项目构建
为了快速构建一个MyBatis项目,我们采用SpringBoot快速搭建的方式。搭建好后在对应的pom.xml下添加如下的maven依赖,主要作用在于引入mybatis一些jar包和类库
主要分为四个步骤:
- 快速构建项目,引入核心maven dependency依赖
- 构建POJO类和接口式编程的 Mapper类,编写SQL语句
- 编写
config.properties
数据库驱动等配置 - 构建Mybatis核心配置文件即
mybatis-config.xml
,引入数据库驱动,映射Mapper类 - 编写Junit单元测试类
<!-- mybatis 核心依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- 数据库驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> <!-- 单元测试包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
为了便于更好的说明文章的主旨,这里就不贴出全部代码了,会贴出核心代码部分
编写对应的POJO类和接口式编程Mapper类,这里我们以部门业务逻辑为例,构建一个部门类,有三个属性即部门编号、部门名称、位置,下面是部分代码:
Dept.java
package com.mybatis.beans; public class Dept { private Integer deptNo; private String dname; private String loc; public Dept() {} public Dept(Integer deptNo, String dname, String loc) { this.deptNo = deptNo; this.dname = dname; this.loc = loc; } get and set... }
MyBatis最核心的功能之一就是接口式编程,它可以让我们编写Mapper接口和XML文件,从而把参数和返回结果映射到对应的字段中。
DeptDao.java
package com.mybatis.dao; public interface DeptDao { // 通过部门名称查询 public Dept findByDname(String Dname); // 通过部门编号查询 public Dept findByDeptNo(Integer deptno); }
在/resources 下新建com.mybatis.dao 包,在其内编写对应的XML配置文件,此XML配置文件和Mapper互为映射关系。
<mapper namespace="com.mybatis.dao.DeptDao" > <sql id="DeptFindSql"> select * from dept </sql> <select id="findByDeptNo" resultType="com.mybatis.beans.Dept"> <include refid="DeptFindSql"></include> where deptno = #{deptNo} </select> <select id="findByDname" resultType="com.mybatis.beans.Dept"> <include refid="DeptFindSql"></include> where dname = #{dname} </select> </mapper>
上述的 就是映射到Mapper接口类的命名空间 <select>标签用于编写查询语句,查询完成之后需要把结果映射到对象或者map集合等,需要用到resultType属性指定对应的结果集。上述采用了和的标签写法,为了方便的映射到实体类,需要修改的话统一修改即可,降低耦合性。
构建完成基础的SQL语句和映射之后,下面来构建MySQL数据库驱动,在/resources 下创建config.properties
类
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=123456
在/resources 下编写MyBatis核心配置文件myBatis-config.xml
,引入数据库驱动,映射Mapper类
<configuration> <!-- 设置导入外部properties文件位置 --> <properties resource="config.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <package name="com.mybatis.dao"/> </mappers> </configuration>
configuration 标签很像是Spring 中的 beans 标签或者是基于注解的配置@Configuration,也就是MyBatis的核心配置环境,使用 properties 标签引入外部属性环境,也就是数据库驱动配置,使用 mappers 映射到Mapper所在的包,这里指的就是DeptDao.java所在的包。
在test包下面新建一个Junit单元测试类,主要流程如下:
MyBatisTest.java 代码如下:
public class MyBatisTest { private SqlSession sqlSession; /** * 读取配置文件,创建SQL工厂,打开会话 * @throws Exception */ @Before public void start() throws Exception{ InputStream is = Resources.getResourceAsStream("myBatis-config.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(is); sqlSession = factory.openSession(); } /** * 销毁会话 */ @After public void destroy() { if(sqlSession != null){ sqlSession.close(); } } @Test public void test(){ DeptDao deptDao = sqlSession.getMapper(DeptDao.class); Dept dept = deptDao.findByDeptNo(1); System.out.println(dept.getDname()); } }
@Before 和 @After 是junit工具包中的类,@Before在执行@Test 测试其主要业务之前加载,@After 在执行@Test 测试完成之后加载。
整体结构如下: