MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis。2013 年 11 月迁移到 Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO 映射成数据库中的记录。
GitHub 地址:https://github.com/mybatis/mybatis-3
官方文档:http://www.mybatis.org/mybatis-3/zh/getting-started.html
以上内容主要来自百度百科,介绍的还挺详细的。
在传统的 JDBC 开发项目的过程中,SQL 语句夹杂在代码块里,导致代码之间的耦合度高,硬编码现象普遍存在。这样就导致后期代码不易维护。
Hibernate 意在消除 SQL,所以在使用 Hibernate 的时候所有的执行流程都由框架处理,包括 SQL 语句的编写,这些操作对用户都是不可见的。这样做是很方便,简化了程序人员的开发,但是由于 SQL 语句由框架生成,这样就导致很难对 SQL 语句进行优化,造成数据库的性能下降,并且对于非常复杂的 SQL 语句,Hibernate 处理起来也不太容易。
当然 Hibernate 也提供了 HQL 技术,把编写 SQL 语句的任务交给程序开发人员,这样就导致学习成本变高。
MyBatis 把编写 SQL 的任务单独提取出来交由程序人员实现,从而使 SQL 与 Java 代码分开,不仅降低了代码之间的耦合,并且在进行 SQL 优化的时候也很容易。所以说 MyBatis 功能边界划分的很清晰,这也是为什么它那么受欢迎的原因。
SqlSessionFactory
对象和封装 SQL 映射文件,以及做一些其他设置。SqlSessionFactory
对象。 SqlSessionFactory
对象获得SqlSession
对象,用该对象来执行对数据库的操作。 SqlSession
对象来执行哪条 SQL 语句。 SqlSession
对象。博主使用的开发工具是 IDEA,并使用了 Maven 项目管理工具。
数据库表结构:
DROP TABLE IF EXISTS `t_employee`;
CREATE TABLE `t_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`email` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
在pom.xml
中添加如下依赖:
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.39version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
员工类Employee
public class Employee {
private Integer id;
private String username;
private Character gender;
private String email;
/** 省略 get 、set 与 toString 方法 */
}
log4j.xml
,只用来在控制台输出 SQL 日志,在这里没有其他的作用
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
layout>
appender>
<logger name="java.sql">
<level value="debug" />
logger>
<logger name="org.apache.ibatis">
<level value="info" />
logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
root>
log4j:configuration>
全局配置文件mybatis-config.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis-study"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
dataSource>
environment>
environments>
configuration>
SQL 映射文件EmployeeMapper.xml
<mapper namespace="com.jas.mybatis.helloworld.EmployeeMapper">
<select id="getEmpById" resultType="com.jas.mybatis.helloworld.Employee">
select * from t_employee where id = #{id}
select>
mapper>
在全局配置文件mybatis-config.xml
中注册 SQL 映射文件EmployeeMapper.xml
<mappers>
<mapper resource="EmployeeMapper.xml"/>
mappers>
编写测试代码
public class MybtisTest {
@Test
public void helloWorld() throws Exception{
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
// 创建 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 用 SqlSession 对象操作数据库
// 第一个参数表示在 SQL 映射文件中的唯一标识,最好加上名称空间的名字
// 第二个参数表示执行 SQL 时传入的参数
Employee employee = sqlSession.selectOne("com.jas.mybatis.helloworld.EmployeeMapper.getEmpById", 1);
// 关闭 sqlSession 对象
sqlSession.close();
System.out.println(employee);
}
}
执行结果
到这里基于 MyBatis 的一个 Hello World 就算完成了。MyBatis 通过配置文件的形式将 SQL 语句封装起来,对外提供一个唯一标识调用。这样一来,SQL 语句的编写完全与代码分离开来,降低了代码之间的耦合度,在进行 SQL 语句优化的时候,只需要到对应 SQL 映射文件中进行优化即可。
这篇博文主要介绍了 MyBatis 的概念,具有的相对优势,并通过一个简单的 Hello World 快速体验 MyBatis,希望可以为读者提供帮助。如果你想了解更多关于 MyBatis 的知识,请继续关注后续博文。